Algorithmus zum abfahren einer beliebigen Fläche
spacer
Autor Nachricht
don_dorner
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 308
Erhaltene Danke: 22

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: 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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
don_dorner Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15833
Erhaltene Danke: 737

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: 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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
EE-Maler
Beiträge: 1753
Erhaltene Danke: 62

Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
BeitragVerfasst: 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 :D

_________________
a broken heart is like a broken window - it'll never heal
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
EE-Maler
Beiträge: 1753
Erhaltene Danke: 62

Windows XP
Delphi (2005 Bug Edition), Java (Eclipse), Haskell (ghci), C++ (Visual Studio 2010, Qt Creator)
BeitragVerfasst: 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
Jen, [this computer] is infected. If this was a human being, I'd shoot it in the face. (IT Crowd)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Moderator
Beiträge: 3722
Erhaltene Danke: 133

Arch Linux, Win 7
F#, C# (VS2010)
BeitragVerfasst: Di 08.03.11 16:59 
Uh, was genau hast du vor :gruebel: ? 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 :D . Auf jeden Fall bräuchten wir mehr Informationen.

_________________
>λ=
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 786
Erhaltene Danke: 9

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: 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).

_________________
Viele Leute denken, Zeit sei wie ein Fluss, der sanft und sicher in eine Richtung fließt, ich aber habe das Antlitz der Zeit gesehen und ich sage euch sie haben Unrecht, Zeit ist ein Ozean im Sturm...
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
don_dorner Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 10.03.11 15:35 
...
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 5268
Erhaltene Danke: 22

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: Fr 01.07.11 01:17 
Klingt eigentlich so, als suchst du das hier: Suche in Wikipedia SCANLINE-ALGORITHMUS
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Geri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: 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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
JDKDelphi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 108
Erhaltene Danke: 21

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
BeitragVerfasst: 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..
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home