Autor |
Beitrag |
don_dorner
Hält's aus hier
Beiträge: 3
|
Verfasst: Mo 07.03.11 15:58
ich hab da ein problem:
Das Programm soll in der Lage sein, aus einem .txt-File eine beliebige Fläche auszulesen. Aus den ausgelesenen Daten soll der angefertigte Algorithmus einen sinnvoll kurzen Weg berechnen und in der Konsole ausgeben. Dabei ist es wichtig, dass die ganze Fläche befahren werden soll.
die fläche wird mittels koordinaten aus einem txt.file eingelesen. die überlegung ist nun, um die gegebene fläche ein rechteck herumzubasteln und dieses in kästchen zu unterteilen. dann wird unterschieden, ob ein kästchen innerhalb oder außerhalb der zu befahrenden fläche liegt. zum schluss werden die kästchen nacheinander auf der konsole ausgegeben. eine idee ist, dafür den floodfill-algorithmus zu verwenden.
so weit, so gut, kann mir bitte jemand hinweise geben, ob der ansatz was taugt...
lg
don_dorner
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Mo 07.03.11 16:13
Frage: Die Fläche ist wohl in Koordinaten (x,y) von Eckpunkten angegeben, oder? Zwischen zwei dieser Eckpunkte ist dann jeweils eine Linie, die die Begrenzungslinie der Fläche darstellt. Richtig? Falls die Fläche nicht allzu zerrupft aussieht - womit ich meine, dass sie eine relative glatte Begrenzung hat, brauchst Du ja eigentlich nur den Schwerpunkt der Fläche berechnen. Dieser sollte dann innerhalb der Fläche liegen. Mit Floodfill kannst Du dann ja die gezeichnete Fläche (aus den Linien zwischen den Eckpunkten) füllen.
Der Schwerpunkt ist in x :
xS = Summe(x)/n
in y:
yS = Summe(y)/n
n = Anzahl der Eckpunkte,
x, y Koordinaten der Eckpunkte.
Aber es kann auch sein - falls die Fläche eine sternförmige Struktur hat - dass der Schwerpunkt außerhalb der Fläche liegt.
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
don_dorner 
Hält's aus hier
Beiträge: 3
|
Verfasst: Mo 07.03.11 16:36
richtig, (x,y)-koordinaten und damit dann die seitenvektoren. die flächen werden nicht allzu viele eckpunkte haben. was bringt mir der schwerpunkt dann, startet der floodfill-algorithmus vom dort weg?
ich brauche dann eine liste mit allen punkten innerhalb der fläche.
wenn ich diese punkte habe möchte ich einen algorithmus drüberlaufen lassen der mir der mir den kürzesten weg findet. zu beachten ist, dass die komplette fläche abefahren werden muss. das programm ist für einen rasenmäher gedacht.
und der startpunkt für den algorithmus muss in einer ecke der fläche sein, da der rasenmäher später nicht irgendwo im feld positioniert werden kann.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 07.03.11 19:17
Ein anderer Ansatz wären Regionen. Dort unterteilt Windows eine beliebige Fläche in kleine Rechtecke und liefert dir deren Daten frei Haus.
Besonders schnell wird das nicht unbedingt sein, aber vielleicht hilft es ja.
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mo 07.03.11 20:20
Kann man denn nicht die Fläche in Dreiecke zerlegen?
Man nimmt den momentanen Punkt und die 2 nachfolgenden. Müsste man nur noch checken, ob das Dreieck dann positiv gerichtet ist oder negativ...damit man weiß, ob man Punkte hinzufügen oder entfernen muss.
Ich glaub ich erklär das so wirr, dass es niemand verstehen kann 
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Xion
      

Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Di 08.03.11 15:38
Bin heute durch Zufall auf etwas gestoßen, wie man es machen könnte.
Annahme ist allerdings, dass du nur EINE Fläche hast (also nicht mehrere kleine).
Dann nimmst du dir 2 aufeinanderfolgende her. Du hast also eine Gerade. Jetzt nimmst du einen Punkt direkt neben der Geraden und machst den Punkt im Polgon Test. Ist der Punkt in deinem Polygon, dann wendest du floodfill auf den an. Ist er es nicht, dann prüfst du den Punkt auf der andren Seite der gerade. Ist dieser Punkt auch nicht im Polygon, dann hast du an der Stelle einen extrem spitzen Winkel. Dann würde ichs nochmal mit einer andren Gerade probieren.
(Auf einen Punkt neben der Gerade kannst du ja kommen, indem du z.B. halbe Strecke + kleines bisschen Normalenvektor der Gerade addierst).
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Di 08.03.11 16:59
Uh, was genau hast du vor  ? Um herauszufinden, auf welcher Seite einer Polygonseite die Innenfläche ist, würde ich einfach die Innenwinkel addieren  . Aber ich denke, dass es hier eher um pixel-/einheitenbasiertes Arbeiten geht, sonst wird das mit dem "Alle Punkte im Polygon aufzählen" langwierig  . Auf jeden Fall bräuchten wir mehr Informationen.
_________________ >λ=
|
|
Jann1k
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: Di 08.03.11 18:55
Zitat: | ich brauche dann eine liste mit allen punkten innerhalb der fläche.
wenn ich diese punkte habe möchte ich einen algorithmus drüberlaufen lassen der mir der mir den kürzesten weg findet. zu beachten ist, dass die komplette fläche abefahren werden muss. das programm ist für einen rasenmäher gedacht.
und der startpunkt für den algorithmus muss in einer ecke der fläche sein, da der rasenmäher später nicht irgendwo im feld positioniert werden kann. |
Der TE will denke ich einen Algorithmus haben mit dem man zu einer gegebenen Fläche einen möglichst kurzen Rasenmäherweg bekommt. Also einen Weg mit dem man jeden Punkt der Fläche mit dem Rasenmäher mindestens einmal besucht hat. Hierbei spielt natürlich die Größe des Rasenmähers eine Rolle.
Wenn die Flächen nicht allzu kompliziert sind, würde ich sie in Rechtecke (in denen dann das althergebrachte "rauf-runter"-Verfahren) und Dreiecke (hier dann vllt spiralförmig vom rand nach innen) aufteilen, dann müsste man nur noch einen guten Weg zwischen den Teilbereichen finden, wobei aber noch zu beachten ist, dass man bei "rauf-runter" und der Spiralmethode an unterschiedlichen Punkten anfangen kann und dann jeweils an unterschiedlichen Punkten endet (okay bei der Spiralmethode endet man immer in der Mitte des Dreiecks das vereinfacht das etwas).
|
|
don_dorner 
Hält's aus hier
Beiträge: 3
|
Verfasst: Do 10.03.11 15:35
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Fr 01.07.11 01:17
Klingt eigentlich so, als suchst du das hier: SCANLINE-ALGORITHMUS
|
|
Geri
      
Beiträge: 78
XP
RAD Studio XE pro
|
Verfasst: Fr 01.07.11 09:00
Hallo don
Suche auch mal nach Polygon offsetting.
Eine kurze Beschreibung hierzu findest du auch hier:
www.cgal.org/Manual/..._2/Chapter_main.html
Beste Grüsse
Geri
|
|
JDKDelphi
      
Beiträge: 115
Erhaltene Danke: 22
WIN2000, XP, WIN 7 , UNIX, LINUX
Assembler für (Z8x, 68xxx,R6000,Intel), DELPHI 6 Enterprise, MAGIC eDeveloper V9+V10, C++, C#,VB, .NET, zertifizierter iBOLT-Programmierer
|
Verfasst: Mo 04.07.11 20:05
Hallo,
ich hätte da ein nettes Objekt, dass aus Vektoren die Fläche, Mittelpunkt, Schwerpunkt etc. eines Polygons berechnet.
Nur noch den TXT-Import implementieren und los geht's.
Die Unit mit Objekten im Anhang.
mit Gruß
Einloggen, um Attachments anzusehen!
_________________ Wo andere aufhören, fange ich erst an..
|
|
|