Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

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 18:21

AW: Polygon.Inflate
 
Das Allerdings kann hier nicht passieren weil der Bewehrungskorb in den Betonquerschnitt reinpassen muß (sonst wird der Statiker auf der Baustelle vom Bauleiter verprügelt). Allerdings, und das hat Jens auch nicht gelöst, woher weiß ein Punkt daß er unten rechts ist.
Beispiel T: Bezüglich des SchwerpunktsKOO ist P2 oben rechts.

Code:
0*************************1
*                         *
7********6       3********2
         *       *
         *       *
         *       *
         *   *   *
         *       *
         *       *
         *       *
         5*******4

Namenloser 7. Jul 2014 18:36

AW: Polygon.Inflate
 
Ich würde nicht von Punkten, sondern von Strecken ausgehen. Denen kann man einen Winkel zuordnen.

Was du immer noch nicht beantwortet hast: Was ist jetzt mit Polygonen, die nicht rechtwinklig sind?

Ich geb dir jetzt meinetwegen die Margins (Links: 1, Oben: 2, Rechts: 3, Unten: 4) und eine diagonale Strecke im 45°-Winkel:
Code:
    /
   /
  /
 /
/
Welchen Abstand hat die denn nun?

Bjoerk 7. Jul 2014 19:07

AW: Polygon.Inflate
 
Das hab ich mal wieder nicht verstanden? :oops:
Ich lass es jetzt erst mal so. Der Benutzer kann ja dann mehrere Margins in das Polygon legen. Vermutlich ist es auch gar nicht möglich so wie ich wollte. Bei AutoCad muß man beim Ausrunden ja auch einen Bezugspunkt angeben.
Delphi-Quellcode:
procedure TPolygon.Inflate(const Value: double);
var
  I, J: integer;
  C: TFloatPoint;
  Line: TFloatLine;
  Lines: TFloatLines;
begin
  Lines := TFloatLines.Create;
  try
    for I := 0 to FCount - 1 do
    begin
      J := Next(I);
      Line.P1 := FItems[I];
      Line.P2 := FItems[J];
      Line.ShiftUV(0, Value);
      Lines.Add(Line);
    end;
    Clear;
    for I := 0 to Lines.Count - 1 do
    begin
      J := Lines.Next(I);
      if Lines.Item[I].IntersectLines(Lines.Item[J], C) then
        Add(C);
    end;
  finally
    Lines.Free;
  end;
end;

Sir Rufo 7. Jul 2014 19:17

AW: Polygon.Inflate
 
Eventuell ist der Clipper interessant

Uwe Raabe 7. Jul 2014 22:04

AW: Polygon.Inflate
 
Zitat:

Zitat von Namenloser (Beitrag 1264765)
Ich würde nicht von Punkten, sondern von Strecken ausgehen. Denen kann man einen Winkel zuordnen.

Was du immer noch nicht beantwortet hast: Was ist jetzt mit Polygonen, die nicht rechtwinklig sind?

Ich geb dir jetzt meinetwegen die Margins (Links: 1, Oben: 2, Rechts: 3, Unten: 4) und eine diagonale Strecke im 45°-Winkel:
Code:
    /
   /
  /
 /
/
Welchen Abstand hat die denn nun?

Ich bekomme so langsam den Eindruck, daß hier nur Polygone mit achs-parallelen Segmenten vorkommen. Offenbar weiß er daher nicht, wovon wir überhaupt reden.

Jens01 7. Jul 2014 22:11

AW: Polygon.Inflate
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1264777)
Ich bekomme so langsam den Eindruck, daß hier nur Polygone mit achs-parallelen Segmenten vorkommen. Offenbar weiß er daher nicht, wovon wir überhaupt reden.

Nee, glaub ich nicht. Die Betonleute bauen oft auch schiefe Sachen.8-)

Bjoerk 8. Jul 2014 05:31

AW: Polygon.Inflate
 
"Er" weiß jetzt langsam wovon "Wir" reden. Was man zum Beispiel machen könnte wäre zuerst (auf einer Kopie) das 08/15-Inflate von #33 durchführen und dann schauen wohin sich der Punkt bewegt hat. Falls nach rechts dann MarignLeft verwenden, falls nach unten dann MarignTop verwenden usw.. Diese Margins verstehen sich für die Polygonlinien (hier) immer als ShiftV. "Er" weiß jetzt nämlich auch daß eine Normalverschiebung U einer Polygonlinie (hier) nichts bringt weil die durch IntersectLines überschrieben wird.

bcvs 8. Jul 2014 07:26

AW: Polygon.Inflate
 
Es gäbe auch noch die Möglichkeit, anhand der Winkel zu unterscheiden, ob eine Kante unten oder oben ist:
Angenommen, in deinem Beispiel aus #31 hat die Linie 4-5 die Neigung 0°, Wenn man jetzt im Uhrzeigersinn die Winkel addiert, hat die Linie 0-1 180° und 2-3 wieder 0°.

Also könnte man sagen: alles was annähernd 180° ist, bekommt die Margin für oben und was annähernd 0° ist, Margin für unten. Ab welcher Neigung es dann in die seitlichen Margins übergeht, musst du selbst entscheiden.

ibp 8. Jul 2014 07:34

AW: Polygon.Inflate
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Jens01 (Beitrag 1264670)

also die zentrische Streckung ist eigentlich genau das was du brauchst nur leicht abgewandelt.

Ich gehe davon aus, dass dein Ausgangspolygon das betonierte Resultat sein soll. Die Bewehrung muss zur Außenseite jeweils ein Mindestmaß an Betondeckung aufweisen. Du brauchst nun die Maße der Bewehrung.

Wenn du bei der zentrischen Streckung die Eckpunkte zum Zentrum verschiebst und zwar genau so weit bis der Soll-Abstand (Betondeckung) der Strecken zum Ausgangspolygon erreicht ist.

Richtig?


Zwei benachbarte Eckpunkte solange nach Z verschieben, bis die Strecke in der Ebenenansicht den gewollten Abstand erreicht hat, dann nächsten Punkt usw...

Memnarch 8. Jul 2014 08:12

AW: Polygon.Inflate
 
Es könnte aber auch sein, das der Threadersteller die Normale eines Punktes berechnen muss(Was der Durchschnitt der beiden Normalen der beiden abgehenden strecken ist) und die Punkte dahingehend skaliert?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 Uhr.
Seite 4 von 5   « Erste     234 5      

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