AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language [Festgefressen] Konvexhülle eines polygon berechnen
Thema durchsuchen
Ansicht
Themen-Optionen

[Festgefressen] Konvexhülle eines polygon berechnen

Ein Thema von Mokus · begonnen am 24. Okt 2013 · letzter Beitrag vom 4. Nov 2013
Antwort Antwort
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

[Festgefressen] Konvexhülle eines polygon berechnen

  Alt 24. Okt 2013, 16:12
Delphi-Version: XE2
Hey Community,

ich habe ein Problem.
arbeite seit nun ein paar Tagen ein einem Problem .
Ich habe mir ein Programm ausgearbeitet, jedenfalls versucht, das die Konvexe hülle eines Polygons berechnene soll.
Soweit sogut, ich habe mir die einzelnen Winkel berechnet etc.
MIt Testparameter ausprobiert, das Polygon X Mal gezeichent, aber es haut nicht hin.
Ab den Punkt 546 | 801 ist ein Winkel kleiner, als der auf der Hülle.
Und daher versaut es mir die ganze berechnung.
Nun wollten ich irgendwie irgendwas versuchen mit dem Letzen Winkel als parameter mitgeben und von dort aus die WInkel berechnen....
Weiß nur noch nicht so ganz wie.

Ich lade euch mal das Projekt hoch, und wäre euch echt dankbar wenn ihr mir da irgendwie helfen könntet.

( wäre auch supaa, wenn ihr mir meinen Fehler zeigt ggf auch erläutert)

Dank im Vorraus
Angehängte Dateien
Dateityp: pas Hauptmenue.pas (1,8 KB, 6x aufgerufen)
Dateityp: pas TPoly_unit.pas (7,7 KB, 14x aufgerufen)
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Update [Festgefressen] Konvexhülle eines polygon berechnen

  Alt 30. Okt 2013, 08:19
Nun gut,
mir wurde zu Ohren getragen, dass dieser Topic nicht sehr genau ist, und ich daher nicht mit Hilfe rechnen kann.
Also werde ich etwas konkreter;

Ich habe ein Polygon, mit verschiedenen Punkten. DIe Punkte werden per Mausklick gespeichert.
Um die Konvexehülle zu erzeugen, wollte ich zu jeden Punkt ein Dreieck bilden und deren Winkel bestimmen.
Diese Winkel kontrollier ich dann, und such dann nach dem größten, ggf den kleinsten.
( Hängt halt davon ab, wierum gelaufen werden soll. )
Nun ist aber das Problem, ich bestimm die Innenwinkel und gleiche diese Miteinnander.
Diese Ergebnisse könnten gefälscht werden.

folgende Function sollte es mir aber errechnen.
Delphi-Quellcode:
function TPoly.berechneWinkel(Punkt1, Punkt2: TPunkt): Real;
var
  dx, dy: Real;
begin

  dx := Punkt2.IXKoordinate - Punkt1.IXKoordinate;
  dy := Punkt2.IYKoordinate - Punkt1.IYKoordinate;
  
    if (dx = 0) and (dy = 0) then
    begin
      result := 360;

   end
    else
      result := RadToDeg(ArcTan(dx / dy));
  end;
end
Nun ist die Frage, das ist eher eine mathematisches Problem, wie kann ich per Delphi die AUSSENwinkel errechnen ?
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !

Geändert von Mokus (30. Okt 2013 um 08:23 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: [Festgefressen] Konvexhülle eines polygon berechnen

  Alt 30. Okt 2013, 09:14
Welchen Algorithmus verwendest du denn?
Graham-Scan, Jarvis-March...?
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

AW: [Festgefressen] Konvexhülle eines polygon berechnen

  Alt 30. Okt 2013, 09:28
@TiGü: Siehe auch hier: http://www.delphipraxis.net/177251-javars-march.html

Zum Winkel: Was schonmal auffällt: Du benötigst DREI Punkte, um einen Winkel aufzuspannen. Bei drei Punkten A, B und C lassen sich zwei Strecken, oder besser noch: Vektoren, AB und BC definieren, zwischen denen dann der Winkel bestimmt wird.

Du berechnest also momentan eben nicht die Innenwinkel. Zur Bestimmung eines Extrempunkts (als Startpunkt für den Graham-Scan) würde sich diese Funktion bedingt eigenen, aber nicht zur Innenwinkelberechnung. Außerdem hast du noch einen Bug drin, üblicherweise schreibt man arctan(y/x). Und am besten nimmt man direkt ArcTan2(y, x) dann bekommt man auch Winkel über den ganzen Kreis.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: [Festgefressen] Konvexhülle eines polygon berechnen

  Alt 30. Okt 2013, 09:44
Zum Winkel: Was schonmal auffällt: Du benötigst DREI Punkte, um einen Winkel aufzuspannen. Bei drei Punkten A, B und C lassen sich zwei Strecken, oder besser noch: Vektoren, AB und BC definieren, zwischen denen dann der Winkel bestimmt wird.
exakt... mit 2 Punkten, also einem Vektor lässt sich maximal die Richtung bestimmen - was imho für den Algo aber auch funktionieren sollte.

Außerdem hast du noch einen Bug drin, üblicherweise schreibt man arctan(y/x). Und am besten nimmt man direkt ArcTan2(y, x) dann bekommt man auch Winkel über den ganzen Kreis.
hm... kommt darauf an... in der Vermessungstechnik sind die Bezeichnungen der Achsen vertauscht (x zeigt nach oben, y nach rechts) und auch der Drehwinkel ist entgegengesetzt dem der Mathematik. Insofern KANN das korrekt sein.
  Mit Zitat antworten Zitat
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: [Festgefressen] Konvexhülle eines polygon berechnen

  Alt 30. Okt 2013, 10:54
Zeichnerrisch mit Paint ...
Ich habe den Startpunkt; Puntk 1
und ich habe den end Punkt, punkt 2.

Von deisen Beiden rechne ich doch den innen winkel mit Tangenz aus ?

Oder bin ich da Mathematisch gerade falsch !?



[edit] Aber wie kann ich den nun den Javars March richtig anwenden ?! [/edit]
Miniaturansicht angehängter Grafiken
dreieck.jpg  
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !

Geändert von Mokus (30. Okt 2013 um 11:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#7

AW: [Festgefressen] Konvexhülle eines polygon berechnen

  Alt 30. Okt 2013, 11:13
Du hast jetzt leider kein Koordinatensystem gemalt, aber ja, das ist der Winkel, den du berechnest. Ich glaube aber nach wie vor, dass das nicht der Winkel ist, den du berechnen solltest. In deinem pdf steht nämlich:

Zitat:
In CW manner, always
making right turns
􀂄 If fail to turn right,
delete previous point
until the turn is correct.
Und um festzustellen, ob man sich gerade nach "rechts" gedreht hat, reicht der Winkel zur Y-Achse eben nicht aus. (Es sei denn, du speicherst den Winkel von allen vorhergehenden Linien, aber danach sieht mir dein Code nicht aus) Die Beurteilung "rechts" geht ja immer von der letzten Bewegungsrichtung aus. Falls du also vom Punkt A kommt und gerade bei Punkt B bist, ist die Frage ob der Winkel ABC kleiner oder größer als 180° ist. (Alternativ: Ist der Winkel zwischen Y-Achse und AB größer oder kleiner als der Winkel der Y-Achse mit BC ?)
Miniaturansicht angehängter Grafiken
algo.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: [Festgefressen] Konvexhülle eines polygon berechnen

  Alt 30. Okt 2013, 13:02
result := cos((sqr(dx) - sqr(dy) - sqr(SeiteC)) / (-2 * dy * SeiteC));
Lautet so der Kosinussatz, wenn ich nach Aplha suche,
oder muss ich noch cos 2 machen ? O.o
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#9

AW: [Festgefressen] Konvexhülle eines polygon berechnen

  Alt 4. Nov 2013, 13:03
Der Kosinussatz hat mit dem Problem leider nichts zu tun. Da du dich dagegen so sträubst, vermute ich mal dass du in der Schule noch keine Vektorrechnung hattest.

Das ist aber auch gar nicht so schlimm, schließlich habe ich dir in dem anderen Thread ja schon diese Formel verlinkt:
http://upload.wikimedia.org/math/6/c...c3fb51c462.png
Dort kannst du einfach die x und y Koordinaten deiner drei Punkte einsetzen und bekommst eine eindeutige Lösung.
Miniaturansicht angehängter Grafiken
6c6dc7b64bb03df6491011c3fb51c462.png  
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz