Zielpositionberechung in 2D-Koordinatensystem

Dein Thema passt einfach in kein Forum? Dann probiers mal hier.
Antworten
DarkWotan
Beiträge: 65
Registriert: 18. Mai 2006 10:03

Zielpositionberechung in 2D-Koordinatensystem

Beitrag von DarkWotan »

Hallo Leute,
dies hat eher weniger mit Programmierung an sich zu tun als mit Mathematik. Ich komm nur irgendwie nicht drauf. Um den folgenden Fall zu verstehen braucht ihr ein wenig Vorstellungsvermögen, ich erklär's jedoch bestmöglich.
Ich habe ein Rechteck R1, in dessen Fläche sich irgendwo zwei Punkte A und B befinden.
Und ich habe ein Rechteck R2 das kleiner ist als R1 und sich ebenfalls auf dieser Fläche befindet. Die Kanten beider überschneiden sich nicht, d. h. R2 ist jederzeit vollständig in R1.
Im Koordinatensystem hat R1 den Ursprung links oben, ebenso R2. Jedoch haben beide unterschiedliche nichtmetrische Maßeinheiten. Sagen wir R1 wird in Motorschritten (Linearmotor) gemessen und R2 in Pixel. Es existiert ein Umrechungsfaktor F: R1 / F = R2.
Mein Programm positioniert R2 an einem definierten Punkt innerhalb von R1.
In einer Suchspirale suche ich nun den Punkt A und bekomme bei Auffinden die Motorschritte (relativ zum Ursprung von R1) und die Pixel (relativ zum Ursprung von R2, der sich jedoch innerhalb von R1 durch das Suchen immer verschiebt). Anschließend suche ich B auf die gleiche Weise und bekomme wieder die gleichen Daten.
Per Definition ist die Distanz von A nach B niemals länger als die kleinere Seite von R2, beide Punkte lassen sich also innerhalb der Fläche von R2 darstellen.
Im Idealfall lassen sich A und B innerhalb eines Suchschrittes auffinden, im Normalfall befindet sich A in einem anderen Bildausschnit als B.
Die Aufgabe ist nun, R2 so zu positionieren, dass der Mittelpunkt von A und B in der Mitte von R2 ist.
Gegeben sind die Länge und die Breite von R2.
Abfragbar sind die Position von R2 innerhalb von R1 (Motorschritte) und die Positionen der gefundenen Punkte A und B innerhalb von R2 (Pixel).
Zu ermittelnde Werte ist die Postion von R2 innerhalb von R1 (Motorschritte) wenn die Mitte Stecke A zu B exakt die Mitte von R2 ist.
Bedenkt: je größer die Koordinaten von R2 innerhalb von R1 werden, desto kleiner werden die Koordinaten von A und B innerhalb von R2, da sich ja dessen Ursprung verschiebt.
Kann mir hier einer helfen?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Event. wäre eine kleine Grafik sinnvoll
CaptnChaos
Beiträge: 605
Registriert: 28. Juni 2007 15:01
Kontaktdaten:

Beitrag von CaptnChaos »

und wenn schon vorhanden code.
Hulk2442
Beiträge: 115
Registriert: 10. Januar 2007 13:44

Re: Zielpositionberechung in 2D-Koordinatensystem

Beitrag von Hulk2442 »

DarkWotan hat geschrieben:Kann mir hier einer helfen?
nein scnr

Sollen wir für dich die Aufgabe lösen oder hast du auch eine konkrete Frage?
DarkWotan
Beiträge: 65
Registriert: 18. Mai 2006 10:03

Re: Zielpositionberechung in 2D-Koordinatensystem

Beitrag von DarkWotan »

Hulk2442 hat geschrieben:
DarkWotan hat geschrieben:Kann mir hier einer helfen?
nein scnr

Sollen wir für dich die Aufgabe lösen
Jep scnr
oder hast du auch eine konkrete Frage?
DarkWotan hat geschrieben:Zu ermittelnde Werte ist die Postion von R2 innerhalb von R1 (Motorschritte) wenn die Mitte Stecke A zu B exakt die Mitte von R2 ist.
Ich hab schon vieles probiert und wieder verworfen weil kein Ansatz mich in jedem Fall zur richtigen Position gebracht hat. Grafik folgt demnächst, ich fertige sie gerade an.
DarkWotan
Beiträge: 65
Registriert: 18. Mai 2006 10:03

Beitrag von DarkWotan »

Also anbei die Grafik. Zur Erklärung:
Zu sehen ist das große Rechteck R1 mit der Maßeinheit Motorschritt (stp).
Darin ist das sich bewegende Rechteck R2 mit der Maßeinheit Pixel (px).

In roter Farbe ist R2 bei der Position, wo sich Punkt A darin befindet.
R2 befindet sich hierbei bei den Koordinaten (x/y) 1150 stp / 1100 stp, zu erkennen an den gepunkteten Linien. Punkt A befindet sich bei den Koordinaten 34 px / 42 px (relativ zum Ursprung von R2 natürlich).

In blauer Farbe ist R2 bei der Position, wo sich Punkt B darin befindet, nachdem die Suchspirale ausgeführt worden ist (ein paar Schritte nach rechts, ein paar nach unten). Die Position von R2 hierbei ist 1900 stp / 1850 stp. Die Koordinaten von Punkt B sind 18 px / 18 px.

In dunkelrot gestrichelt ist R2 bei der zu ermittelnden Zielposition (1500 stp / 1500 stp), bei der sich der Mittelpunkt der Strecke A nach B exakt mit dem Mittelpunkt des Rechtecks R2 deckt (hellgraublauer Punkt).

Bei dieser Grafik ist der Umrechungsfaktor px nach stp etwa 17,5.
(Ermittelt anhand der Ursprünge von R2 bei roter Position (x = 1150) und gestrichelter Position (x = 1500): 1500 - 1150 = 350 stp, die Anzahl der Pixel dazwischen ist ungefähr 20; 350 / 20 = 17,5)
Dateianhänge
Graphic.png
Graphic.png (10.94 KiB) 7783 mal betrachtet
DarkWotan
Beiträge: 65
Registriert: 18. Mai 2006 10:03

Beitrag von DarkWotan »

Ein neuer Versuch von mir:

Berechnung nur für die x-Koordinate, y analog dazu.

Code: Alles auswählen

//size of the field of view in pixels
const int imageWidth = 52;

int motorPosition1, motorPosition2;
const float pixelToStep = 17.5f;

//do search helix until point A is found and retrieve the x coordinate
display.A = stage.Search(a);
motorPostion1 = stage.GetCurrentPosition().X; //1150 stp

//as above for point B
display.B = stage.Search(b);
motorPosition2 = stage.GetCurrentPosition().X; //1900 stp

//calculate rectangle overlap of both positions. Zero if exactly no overlap,
//negative if the opposing edges have a space in between
int overlap = -( static_cast<float>( GetDistance(motorPosition1, motorPosition2) ) / pixelToStep - imageWidth );

//calculate center in pixel of both points
int center = ( ( imageWidth - display.A.X ) - overlap + display.B.X ) / 2;

//calculate target motor position
float targetPosition = static_cast<float>(motorPosition1) + static_cast<float>(center) * pixelToStep;

//move there
stage.MoveToXPositionAbsolute(center);
GetCenter() ist definiert als

Code: Alles auswählen

abs(a - b)
sodass keine negativen Distanzen herauskommen.

Die Werte aus meinem vorausgegangenen Posting in diese Berechnungen eingesetzt, würde eine neue Motorposition von 1385 stp herauskommen.
Das ist eine Abweichung von etwa -115 stp gegenüber dem Wert den ich anhand des gezeichneten, ungenauen Bilds ermittelt habe.

Kann mir den Rechenweg jemand validieren?
DarkWotan
Beiträge: 65
Registriert: 18. Mai 2006 10:03

Ich hab's

Beitrag von DarkWotan »

Ich hab's gefunden!

Relativ zu der Position an der Punkt B gefunden wurde muss sich R2 wie folgt bewegen (für X, Y dazu analog):

Code: Alles auswählen

center = imageWidth / 2.0 - (display.A.X + display.B.X) / 2.0 * pixelToStep - (motorPosition1 - motorPosition2 / 2.0)

stage.MoveToXPositionRelative(center);
Gruß, Cedric
Antworten