Delphi-PRAXiS
Seite 2 von 5     12 34     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)

DeddyH 7. Jul 2014 12:38

AW: Polygon.Inflate
 
Aus der hohlen Hand würde mir einfallen: umgebendes Rechteck ermitteln und das prozentuale Verhältnis jedes einzelnen Punktes relativ zur linken oberen Ecke ermitteln. Dann das umgebende Rechteck vergrößern/verkleinern und die neuen Punkt-Positionen anhand des gemerkten Verhältnisses neu berechnen. Das jeweilige Original-Verhältnis sollte man dabei aber im Speicher behalten, sonst wird das nach ein paar Mal vergrößern/verkleinern wahrscheinlich zu ungenau. Vielleicht taugt das aber auch alles nix, so dolle bin ich nicht in Geometrie :stupid:

Jens01 7. Jul 2014 12:49

AW: Polygon.Inflate
 
Sowas?

Bjoerk 7. Jul 2014 12:59

AW: Polygon.Inflate
 
Zitat:

Zitat von Jens01 (Beitrag 1264670)

Leider nicht. Das ist wohl das:
Delphi-Quellcode:
procedure TPolygon.CenterZoom(const Faktor: double);
var
  I: integer;
  P1, P2: TFloatPoint;
begin
  P1 := Center;
  for I := 0 to FCount - 1 do
  begin
    FItems[I].X := FItems[I].X * Faktor;
    FItems[I].Y := FItems[I].Y * Faktor;
  end;
  P2 := Center;
  for I := 0 to FCount - 1 do
  begin
    FItems[I].X := FItems[I].X - (P2.X - P1.X);
    FItems[I].Y := FItems[I].Y - (P2.Y - P1.Y);
  end;
end;
Bin noch am rumprobieren. Melde mich nochmal.

Bjoerk 7. Jul 2014 13:20

AW: Polygon.Inflate
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1264661)
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.

Stell dir eine PolygonForm vor. Jetzt platzierst du darauf ein PolygonPanel und gibst im Objectinspector für dieses Panel Marigns an.

Uwe Raabe 7. Jul 2014 13:41

AW: Polygon.Inflate
 
Zitat:

Zitat von Bjoerk (Beitrag 1264679)
Stell dir eine PolygonForm vor. Jetzt platzierst du darauf ein PolygonPanel und gibst im Objectinspector für dieses Panel Marigns an.

Sorry, das ist mir immer noch zu allgemein. Soll jetzt das PolygonPanel nach Links, Rechts, Oben, Unten einen durch die Margins anzugebenden Mindestabstand zu dem drumherum liegenden PolygonForm haben.

Kannst du das vielleicht mal aufmalen?

Betrachtest du eventuell nur eine bestimmte Klasse von Polygonen?
Wie wäre ein Fall wie PolygonForm (außen) = Dreieck mit Spitze oben, PolygonPanel (innen) = Dreieck mit Spitze unten zu behandeln?

Wie ich schon sagte, intuitiv kann ich mir das vorstellen, wenn um das Polygon ein umfassendes Rechteck mit den vier Margins gelegt werden soll. Dann kann man aber auch gleich das Rechteck so definieren, daß die Margins zu Null werden. Das entspricht wiederum der Darstellung des Polygons in einem rechteckigen Viewport. Man muss nur festlegen, was mit dem Polygon passieren soll, wenn es nicht in dieses Viewport passt.

Soll es skaliert werden?
Soll es soweit verändert werden, daß alle Punkte drin liegen?
Soll es abgeschnitten werden (Clipping)?

bcvs 7. Jul 2014 14:14

AW: Polygon.Inflate
 
Die Grundfrage ist doch die:
Beschreiben deine 4 Margins Kantenverschiebungen senkrecht zu den bisherigen Polygon-Kanten oder senkrecht zu den Kanten eines umhüllenden Rechtecks? Wenn es sich um Betondeckungen handelt, sind die wohl senkrecht zu den Polygonkanten gemeint, sonst macht es ja keinen Sinn. Du willst wahrscheinlich die Vorgaben der DIN, die nur für oben/unten/seitlich angegeben sind, für polygonale Querschnitte umsetzen.

Was man da noch braucht, ist bei schrägen Kanten eine Unterscheidung, welches Margin denn nun gilt, Abhängig von der Neigung und der Lage (z.B -45° bis +45°: Margin für oben, +45° bis 135°: Margin für rechts etc.) Um dieses Margin wird die Kante dann parallel verschoben.

P.S.: Interessant, dass man hier noch mehr Bau-Menschen findet. Bin auch so einer.

Jens01 7. Jul 2014 14:25

AW: Polygon.Inflate
 
Zitat:

P.S.: Interessant, dass man hier noch mehr Bau-Menschen findet. Bin auch so einer.
Wir sollten einen Klub gründen.:-D

Namenloser 7. Jul 2014 14:31

AW: Polygon.Inflate
 
Bloß nicht in Dreiecke zerlegen! Das ist ein weitaus komplizierteres Problem.

Such mal die Unit gr32_polygon, da ist genau so eine Inflate-Routine drin.

Uwe Raabe 7. Jul 2014 14:51

AW: Polygon.Inflate
 
Zitat:

Zitat von Namenloser (Beitrag 1264702)
Such mal die Unit gr32_polygon, da ist genau so eine Inflate-Routine drin.

Da wird aber in alle Richtungen immer der gleiche Abstand genommen. Das ist einfach.

Namenloser 7. Jul 2014 15:02

AW: Polygon.Inflate
 
Achso... dann sucht Bjoerk vielleicht Minkowski-Summen? Die Beschreibung liest sich zumindest so.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:30 Uhr.
Seite 2 von 5     12 34     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