Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Polygon.Inflate (https://www.delphipraxis.net/180996-polygon-inflate.html)

Bjoerk 7. Jul 2014 10:19

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;

Der schöne Günther 7. Jul 2014 10:29

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?

Uwe Raabe 7. Jul 2014 10:32

AW: Polygon.Inflate
 
Was soll den überhaupt passieren?

Mir fehlt irgendwie die Beschreibung, was die Methode genau tun soll.

Dejan Vu 7. Jul 2014 10:34

AW: Polygon.Inflate
 
Was soll denn dein Inflate machen?

Neutral General 7. Jul 2014 10:44

AW: Polygon.Inflate
 
Inflate vergrößert oder verkleinert ein Polygon oder auch ein Rechteck an einer oder mehreren Seiten.

Medium 7. Jul 2014 10:57

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.

Bjoerk 7. Jul 2014 11:05

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

Jens01 7. Jul 2014 11:17

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? :)

Uwe Raabe 7. Jul 2014 11:44

AW: Polygon.Inflate
 
Zitat:

Zitat von Bjoerk (Beitrag 1264657)
Im Prinzip wie InflateRect.
...
Da werden vier Betondeckungen (Margins) vorgeben.

InflateRect verschiebt die Kanten um einen bestimmten Wert nach außen bzw. innen (bei negativem Wert). Dabei können zwei separate Abstände für die waagerechten und senkrechten Kanten übergeben werden. In deinem Fall sind das aber wohl vier separate Werte (Margins), wobei mir nicht klar ist, wie sich diese auf nicht achs-parallele Kanten auswirken sollen.

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.

bcvs 7. Jul 2014 11:53

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 09:02 Uhr.
Seite 1 von 5  1 23     Letzte »    

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