Autor |
Beitrag |
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: Di 15.11.11 12:43
Hallo liebe Delphifreunde,
ich habe ein massives Problem, wobei Ihr mir sicher weiterhelfen könnt.
Es geht um Polygone, die im Vektorformat eingelesen werden.
Im Anhang habe ich ein Beispiel aufgezeichnet.
Meine Routine berechnet BRUTTO(umschließendes Rechteck) und NETTO(die Fläche des Polygons.
Ferner bekomme ich die Anzahl der Teilflächen, die außerhalb des Polygons und innerhalb des umschl.Rechtecks liegen.
Mein Problem ist, das ich die Teilflächen einzeln berechnen muss.
Ich komme da nicht weiter.
Hab Ihr vielleicht einen schnellen Algorythmus??
Ach ja, die Polygonfläche wird nach dem GAUSS-Algorythmus berechnet. Min/Max entspricht dem Rechteck.
Die Vektoren sind geschlossen und linksdrehend!
Ich hänge mal ein PDF nebst Vektordatei an.
Vielen Dank an Euch alle ..
Wenn es funktioniert,stelle ich das Objekt der Kommunity zur Verfügung
Vectordatei: passt zum PDF!
[VECTORFILE]
[SCALE]
-200,8700,8700,-200
[VECTOR]
4944,2500
4918,2310
5150,2310
5150,2160
4897,2160
4800,1445
0,1445
0,0
7520,0
7520,220
8490,220
8490,1255
8520,1255
8520,2500
4944,2500
[ENDVECTOR]
Einloggen, um Attachments anzusehen!
_________________ Wo andere aufhören, fange ich erst an..
|
|
mandras
      
Beiträge: 432
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: Di 15.11.11 14:38
Ich schlage folgenden Algorithmus vor:
Gegeben Polygon P mit den N Eckpunkten P(0) bis P(N-1), linksdrehend, nicht zwingend geschlossen
Umgebendes Rechteck U bestehend aus den Punkten a (links unten) b(rechts unten) c (rechts oben) d (links oben)
bzw. den Kanten A (von a nach b), B (b->c), C(c->d) und D(d->a).
(diese Punkt/Kantendef. ist willkürlich, jedoch muß sie auch linksdrehend sein)
Hilfsfunktion R(m) := m Mod N
i:=0
solange i<N:
{
solange i<N: falls P(i) nicht auf A,B,C oder D: i=i+1
j:=i+1
solange R(j) <> i und P(R(j)) nicht auf A,B,C oder D: j:=j+1
falls R(j) <> i:
{
falls P(i) auf A und P(R(j)) auf A: Pext := P (i) _ P (R(i+1)) _ P(R(j))
falls P(i) auf A und P(R(j)) auf B: Pext := P (i) _ P (R(i+1)) _ P(R(j)) _ b
......
falls P(i) auf D und P(R(j)) auf A: Pext := P (i) _ P (R(i+1)) _ P(R(j)) _ a
}
i:=j
}
Meine Annahme hier (unbewiesen, Vermutung wg. "umgebendem Rechteck"): P(R(j)) kann nur auf der gleichen Kante liegen wie P(i) oder auf der (linksrum) direkt folgenden.
Die Hilfsfunktion R ist erforderlich da beim Verfolgen der Punkte ggf. wieder beim Anfangspunkt weitergemacht werden muß.
Semantik von Pext := Das gesuchte "externe" Polygon besteht aus den Originalpunkten der Nummern i bis j (Hilfsfunktion R wieder wichtig) in dieser Reihenfolge und ggf. einem Eckpunkt des umgebenden Rechtecks.
Wichtig: Es kommen auch Polygone mit 0-Fläche heraus, diese vor Weiterbearbeitung herausfiltern da das vorherige Abfangen dieses Falles den Algorithmus stark aufblähen würde.
Was berücksichtigt dieser Algorithm. noch?
Das Originalpolygon könnte einen "Kamm/eine Säge" hin zu einer der Kanten A B C D enthalten. In diesem Fall werden entsprechend viele einzelne "externe" Polygone erzeugt
Vielleicht hilft Dir dieser Schnellschuß.
Gruß,
Andreas
|
|
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: Di 15.11.11 14:52
Danke Mandras,
ich probier das mal aus
Gruss
_________________ Wo andere aufhören, fange ich erst an..
|
|
|