Announcement

Collapse
No announcement yet.

2 dimensionale Vektorpunkte vergleichen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • 2 dimensionale Vektorpunkte vergleichen

    Hallo

    Ich häng hier an einem kleinen Problem.

    Mein Benutzer gibt mir 4 Punkte (x,y) ein die ein Rechteck darstellen sollen.
    Um zu testen ob es wirklich ein Rechteck ist, möchte ich in einem ersten Schritt die eingegebenen Punkte auf ein von mir benutzes Normrechteck abbilden, da der Benutzer ja auch die Reihenfolge der Eingabe der Punkte vertauschen kann. Dabei ändere ich noch nichts an den Werten.

    Nun hab ich mir bei dieser Normalisierung gedacht das ich anfangen könnten mir den Punkt rauszusuchen, der am weitesten in die negative Y-Richtung ragt. Das soll dann mein Punkt1 werden. Der Punkt, der am weitesten in die maximale X-Richtung ragt, soll der Punkt2 werden. Der Punkt, der am weitesten in die maximale Y-Richtung ragt, soll der Punkt3 werden und schließlich der Punkt, der am weitesten in die negative X-Richtung ragt, soll mein Punkt4 werden. Also meine Nummerierung erfolgt gegen den Uhrzeigersinn.

    Das funktioniert wunderbar, so lange der Benutzer auch wirklich Rechtecke eingibt, wo keine 2 Punkte parallel zu einer Koordinatenachse liegen, passiert dies aber, so habe ich ja das Problem das ich bei jeder Frage 2 Ergebnisse bekommen würde, die ich wiederum noch auswerten müßte.

    Wie kann man denn leichter feststellen, welche Eckpunkte in einem Rechteck auf wo sind, um sie besser bezeichnen zu können?

    Anbei nochmal mein Codesnippet und eine kleine Verständniszeichnung wo das erste Rechteck gut erkannt wird, aber das zweite die genannten Probleme bereitet.
    Code:
         //search for Point1 downleft
         minY := Min(EdPunkt1Y.Value,EdPunkt2Y.Value);
         minY := Min(minY,EdPunkt3Y.Value);
         minY := Min(minY,EdPunkt4Y.Value);
         if  (minY = EdPunkt1Y.Value) then begin
             rect.P1[0] := EdPunkt1X.Value;
             rect.P1[1] := EdPunkt1Y.Value;
             rect.P1[2] := EdPunkt1Z.Value;
         end else if (minY = EdPunkt2Y.Value) then begin
             rect.P1[0] := EdPunkt2X.Value;
             rect.P1[1] := EdPunkt2Y.Value;
             rect.P1[2] := EdPunkt2Z.Value;
         end else if (minY = EdPunkt3Y.Value) then begin
             rect.P1[0] := EdPunkt3X.Value;
             rect.P1[1] := EdPunkt3Y.Value;
             rect.P1[2] := EdPunkt3Z.Value;
         end else if (minY = EdPunkt4Y.Value) then begin
             rect.P1[0] := EdPunkt4X.Value;
             rect.P1[1] := EdPunkt4Y.Value;
             rect.P1[2] := EdPunkt4Z.Value;
         end;
    
         //search for Point 2 down right
         maxX := Max(EdPunkt1X.Value,EdPunkt2X.Value);
         maxX := Max(maxX,EdPunkt3X.Value);
         maxX := Max(maxX,EdPunkt4X.Value);
         if (maxX = EdPunkt1X.Value) then begin
             rect.P2[0] := EdPunkt1X.Value;
             rect.P2[1] := EdPunkt1Y.Value;
             rect.P2[2] := EdPunkt1Z.Value;
         end else if (maxX = EdPunkt2X.Value) then begin
             rect.P2[0] := EdPunkt2X.Value;
             rect.P2[1] := EdPunkt2Y.Value;
             rect.P2[2] := EdPunkt2Z.Value;
         end else if (maxX = EdPunkt3X.Value) then begin
             rect.P2[0] := EdPunkt3X.Value;
             rect.P2[1] := EdPunkt3Y.Value;
             rect.P2[2] := EdPunkt3Z.Value;
         end else if (maxX = EdPunkt4X.Value) then begin
             rect.P2[0] := EdPunkt4X.Value;
             rect.P2[1] := EdPunkt4Y.Value;
             rect.P2[2] := EdPunkt4Z.Value;
         end;
    
    
         //search for Point 3 upper right
         maxY := Max(EdPunkt1Y.Value,EdPunkt2Y.Value);
         maxY := Max(maxY,EdPunkt3Y.Value);
         maxY := Max(maxY,EdPunkt4Y.Value);
         if (maxY = EdPunkt1Y.Value) and (maxX = EdPunkt1X.Value) then begin
             rect.P3[0] := EdPunkt1X.Value;
             rect.P3[1] := EdPunkt1Y.Value;
             rect.P3[2] := EdPunkt1Z.Value;
         end else if (maxY = EdPunkt2Y.Value) and (maxX = EdPunkt2X.Value) then begin
             rect.P3[0] := EdPunkt2X.Value;
             rect.P3[1] := EdPunkt2Y.Value;
             rect.P3[2] := EdPunkt2Z.Value;
         end else if (maxY = EdPunkt3Y.Value) and (maxX = EdPunkt3X.Value) then begin
             rect.P3[0] := EdPunkt3X.Value;
             rect.P3[1] := EdPunkt3Y.Value;
             rect.P3[2] := EdPunkt3Z.Value;
         end else if (maxY = EdPunkt4Y.Value) and (maxX = EdPunkt4X.Value) then begin
             rect.P3[0] := EdPunkt4X.Value;
             rect.P3[1] := EdPunkt4Y.Value;
             rect.P3[2] := EdPunkt4Z.Value;
         end;
    
    
         //search for Point 4 upper left
         minX := Min(EdPunkt1X.Value,EdPunkt2X.Value);
         minX := Min(minX,EdPunkt3X.Value);
         minX := Min(minX,EdPunkt4X.Value);
         if  (minX = EdPunkt1X.Value) and (maxX = EdPunkt1Y.Value) then begin
             rect.P4[0] := EdPunkt1X.Value;
             rect.P4[1] := EdPunkt1Y.Value;
             rect.P4[2] := EdPunkt1Z.Value;
         end else if (minX = EdPunkt2X.Value) and (maxX = EdPunkt2Y.Value) then begin
             rect.P4[0] := EdPunkt2X.Value;
             rect.P4[1] := EdPunkt2Y.Value;
             rect.P4[2] := EdPunkt2Z.Value;
         end else if (minX = EdPunkt3X.Value) and (maxX = EdPunkt3Y.Value) then begin
             rect.P4[0] := EdPunkt3X.Value;
             rect.P4[1] := EdPunkt3Y.Value;
             rect.P4[2] := EdPunkt3Z.Value;
         end else if (minX = EdPunkt4X.Value) and (maxX = EdPunkt4Y.Value) then begin
             rect.P4[0] := EdPunkt4X.Value;
             rect.P4[1] := EdPunkt4Y.Value;
             rect.P4[2] := EdPunkt4Z.Value;
         end;
    Attached Files
    Zuletzt editiert von Daimonion; 14.02.2007, 16:30.

  • #2
    Ich hab es jetzt selbst mit Hilfe der Vektorrechnung hinbekommen

    Durch die Berechnung der Länge der Ortsvektoren kann ich Aussagen über den Standort der Puntke treffen.

    Comment

    Working...
    X