![]() |
Polygon.Inflate
Hat jemand eine Idee für eine Polygon.Inflate?
So gehts schonmal nicht :gruebel:
Delphi-Quellcode:
procedure TPolygon.Inflate(const Top, Bottom, Left, Right: double); // positve Werte verkleinern;
var I: integer; dX, dY, vX, vY: double; P: TFloatPoint; Line: TFLoatLine; begin P := Center; for I := 0 to FCount - 1 do begin dX := FItems[I].X - P.X; dY := FItems[I].Y - P.Y; vX := 0; vY := 0; if (dX > 0) and (dY > 0) then begin vX := Right; vY := Bottom; end else if (dX < 0) and (dY > 0) then begin vX := -Left; vY := Bottom; end else if (dX < 0) and (dY < 0) then begin vX := -Left; vY := -Top; end else if (dX > 0) and (dY < 0) then begin vX := Right; vY := -Top; end; FItems[I].X := FItems[I].X + vX; FItems[I].Y := FItems[I].Y + vY; end; end; |
AW: Polygon.Inflate
Also bei mir ist das alles schon etwas zu lange her um es noch im Kopf zu haben, aber trivial ist das sicher nicht- Vielleicht in Dreiecke zerlegen, diese einzeln aufblasen und anschließend konvexe Hülle bestimmen? Oder hast du bestimmte Einschränkungen für deine Polygone?
|
AW: Polygon.Inflate
Was soll den überhaupt passieren?
Mir fehlt irgendwie die Beschreibung, was die Methode genau tun soll. |
AW: Polygon.Inflate
Was soll denn dein Inflate machen?
|
AW: Polygon.Inflate
Inflate vergrößert oder verkleinert ein Polygon oder auch ein
![]() |
AW: Polygon.Inflate
Da gibt es mehrere Ansätze. Ich würde spontan folgendes tun:
Für jeden zu verschiebenden Punkt, nehme seine 2 benachbarten Punkte und bilde die Strecke zwischen diesen. Drehe diese um 90°, und verschiebe den Punkt um einen Faktor an dieser "Quasi-Normalen". Dazu sollte die Verschiebung natürlich an einer Kopie erfolgen, sonst beeinflusst man ja die nachfolgenden Berechnungen. Man müsste dann nur ausprobieren, ob man die Normalen normalisiert, oder lieber in ihrer Länge belässt und nur mit dem Inflate-Faktor multipliziert. Ich kann mir für beide Varianten Argumente vorstellen, würde aber naiv erstmal zum Normalisieren tendieren. |
AW: Polygon.Inflate
Im Prinzip wie InflateRect. Es muß für alle Polygone gehen. Allerdings sind die Polygone hier immer geschlossen und math. positiv. Es gibt keine negativen Anteile. Brauch ich für mein Bewehrungsmodul. Da werden vier Betondeckungen (Margins) vorgeben.
Code:
xxxxxxxxxxxxxxxxx
x ............. x x ........ . x xxxxxxxxx . . x x . . x x ....... x xxxxxxxxxxxx |
AW: Polygon.Inflate
Grober Gedanke:
Zentrum festlegen (geht das?, wenn nicht gehts sowieso nicht). Den Vektor (Zentrum-Polygonpunkt) jeweils verlängern. Gruss Jens P.S. Mit einer Triangulation und der Vergrößerung der einzelnen Dreiecke könnte es auch gehen? :) |
AW: Polygon.Inflate
Zitat:
Kannst du eine Regel formulieren, was mit jeder Polygonkante passieren soll? Die Analogie zu InflateRect erschließt sich mir hier noch nicht vollständig oder ist zumindest lückenhaft. Ich kann eigentlich nur dann intuitiv etwas ableiten, wenn man von dem Polygon genau die Punkte und Kanten betrachtet, die auf dem umschließenden Rechteck liegen. |
AW: Polygon.Inflate
Ich würde einfach die Kanten parallel verschieben, und zwar je nach Lage der Kante um Top, Bottom, Left oder Right. Du musst nur eine Regel für die schrägen Kanten festlegen: gilt da die Betondeckung für oben/ unten oder seitlich? (evtl. aghängig von der Neigung der Kante). Dann neue Schnittpunkte bestimmen. Das sind dann die neuen Polygonpunkte.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz