AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Polygon.Inflate

Ein Thema von Bjoerk · begonnen am 7. Jul 2014 · letzter Beitrag vom 8. Jul 2014
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

Polygon.Inflate

  Alt 7. Jul 2014, 11:19
Hat jemand eine Idee für eine Polygon.Inflate?

So gehts schonmal nicht

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;
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Polygon.Inflate

  Alt 7. Jul 2014, 11:29
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?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

AW: Polygon.Inflate

  Alt 7. Jul 2014, 11:32
Was soll den überhaupt passieren?

Mir fehlt irgendwie die Beschreibung, was die Methode genau tun soll.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#4

AW: Polygon.Inflate

  Alt 7. Jul 2014, 11:34
Was soll denn dein Inflate machen?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Polygon.Inflate

  Alt 7. Jul 2014, 11:44
Inflate vergrößert oder verkleinert ein Polygon oder auch ein Rechteck an einer oder mehreren Seiten.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Polygon.Inflate

  Alt 7. Jul 2014, 11:57
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Polygon.Inflate

  Alt 7. Jul 2014, 12:05
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
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#8

AW: Polygon.Inflate

  Alt 7. Jul 2014, 12:17
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?
Achtung: Bin kein Informatiker sondern komme vom Bau.

Geändert von Jens01 ( 7. Jul 2014 um 12:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#9

AW: Polygon.Inflate

  Alt 7. Jul 2014, 12:44
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#10

AW: Polygon.Inflate

  Alt 7. Jul 2014, 12:53
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.

Geändert von bcvs ( 7. Jul 2014 um 12:56 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 Uhr.
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