Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.04.2014, 11:04

Korrektur auf Basis einer 2D-Korrekturtabelle in Koordinaten einberechnen

Hi,

ich stehe gerade furchtbar auch dem Schlauch. Eigentlich geht es nur um eine simple lineare Interpolation, die auf zwei Dimensionen erweitert werden soll, aber ich raffe es gerade nicht: In einem regulären Zeichenbereich von (hier vereinfacht) 3000x3000 Punkten soll eine horizontale Linie gezeichnet werden. dabei werden einfach schrittweise Bildpunkte vom Anfang bis zum Ende dieser Linie gesetzt, welche sich dann zu eben dieser Linie zusammenfügen.

Jetzt soll das ganze mit einer Korrektur versehen werden. Die Korrektur ist dabei (für dieses Beispiel der Einfachheit halber nur) in einem 4x4 großen Array zu finden, bei dem jedes Arrayelement je ein XY-Koordinatenpaar beinhaltet, welches die Ist-Koordinaten nach der Korrektur beinhaltet. D.h. die Ursprungskoordinaten (bzw. ein neutrales Korrekturraster) würden erst mal so aussehen:

C-/C++-Quelltext

1
2
3
4
0,0      1000,0      2000,0      3000,0
0,1000   1000,1000   2000,1000   3000,1000
0,2000   1000,2000   2000,2000   3000,2000
0,3000   1000,3000   2000,3000   3000,3000


Eine Korrekturtabelle würde dementsprechend andere Koordinaten enthalten, welche die einzuberechnende Verzerrung beinhalten:


(Link)


Mein Problem: Wenn ich die Koordinaten der Linie kenne, die Koordinaten des Feldes ohne Korrektur sowie die Koordinaten des Feldes mit der Korrektur, wie kann ich mir dann für alle Urpsrungspunkte auf der Linie die Koordinaten mit Korrektur errechnen? Mein bisheriger Ansatz interpoliert einfach für X und Y separat, aber das funktioniert für das im Bild gezeigte Beispiel nicht, da dann Y immer erst beim Wechsel von einer Korrekturzelle in die nächste springt, statt bei veränderlichem X und gleich bleibenden Y dennoch Y mit zu verändern.

Hat jemand einen Tipp?

2

20.04.2014, 13:17

Bilineare Interpolation sollte dein Ansatz sein ;)

Als Annäherung ginge folgendes:

Gegeben sind die Eckpunkte eines unverzerrten Feldes (x,y) und eine Funktion f(x,y), welche die dazugehörigen korrigierten Koordinaten ausgibt.

Du suchst zwei Geraden, die Punkte beschreiben, die zwei parallele Seiten des Feldes im gleichen Verhältnis teilen (angenommen der Eckpunkte A,B,C,D):
h1 = OA + s*AB
h2 = OD + s*DC

Dein Linienpunkt P liegt nun auf einer Gerade, die durch jeweils einen Punkt der Gerade h1 und h2 verläuft:
p = h1 + l * (h1h2) // vektor zwischen h1 und h2

also:
p = (OA + s*AB) + t*( (OD + s*DC) - (OA + s*AB) )

Da du p als parameter und die Eckpunkte gegeben hast und da du durch x- und y-Koordinaten zwei Gleichungen aufstellen kannst, kannst du s und t jetzt berechnen.
Mit s und t kannst du dann über die Funktionswerte von f(x,y) interpolieren:
f(P) = f(OA + s*AB) + t*( f(OD + s*DC) - f(OA + s*AB) )

Et voilà. ;)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.