Delphi-PRAXiS
Seite 5 von 5   « Erste     345   

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)

Uwe Raabe 8. Jul 2014 09:01

AW: Polygon.Inflate
 
Zitat:

Zitat von ibp (Beitrag 1264790)
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.

So wird das allerdings schon klarer. Die vier Margins sind dann die jeweilige Mindestdicke der Betondeckung links, rechts, oben und unten. Aber wie wird die Dicke der Betondeckung bei einer Schräge bestimmt?

bcvs 8. Jul 2014 09:15

AW: Polygon.Inflate
 
Das war mir die ganze Zeit schon klar.

Das muss man anhand der Winkels der schrägen Kante bestimmen. Im einfachsten Fall: < 45° Betondeckung für oben bzw unten, >45°: Betondeckung für seitlich (rechts und links müssten eigentlich immer gleich sein). Es kann aber auch sein, dass die Grenze woanders liegen müsste. Das kann ich gerade nicht beurteilen, dazu müsste man sich tiefer in die technischen Gegebenheiten einarbeiten.

Das Problem des OP ist allerdings: wie unterscheide ich bei einer horizontalen Kante, ob die oben oder unten ist. Eine Lösungsmöglichkeit hat er selbst geliefert, einen anderen Vorschlag habe ich gemacht.

Das Grundprinzip der Parallelverschiebung der Kanten ist auch gelöst (#33). Also sollte momentan alles gut sein.

Bjoerk 8. Jul 2014 12:17

AW: Polygon.Inflate
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1264798)
Zitat:

Zitat von ibp (Beitrag 1264790)
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.

So wird das allerdings schon klarer. Die vier Margins sind dann die jeweilige Mindestdicke der Betondeckung links, rechts, oben und unten. Aber wie wird die Dicke der Betondeckung bei einer Schräge bestimmt?

Betondeckungen verstehen sich immer parallel zur Polygonline.

Vielleicht hierzu meine Methode CornerStyle. Die liefert das "Align" eines Knotens.
Zum Beispiel bekommt ein Polygonknoten CornerStyle = csTopLeft die Margens Top und Left.

Und in #33 ist noch ein Indexfehler drin. Punkt 0 wird nach 1 gespeichert, 1 nach 2 usw..

Delphi-Quellcode:
procedure TPolygon.Inflate(Value: double);
var
  I, J: integer;
  C: TFloatPoint;
  Line: TFloatLine;
  Lines: TFloatLines;
begin
  if FCount > 2 then
  begin
    Lines := TFloatLines.Create;
    try
      if Area < 0 then
        Value := -Value;
      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;
      C.Clear;
      Add(C);
      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;
      ExChange(0, FCount - 1);
      Del(FCount - 1);
    finally
      Lines.Free;
    end;
  end;
end;

function TPolygon.CornerStyle(const Index: integer): TCornerStyle;
var
  Temp: TPolygon;
  dX, dY: double;
begin
  if (FCount > 2) and (Index > -1) and (Index < FCount) then
  begin
    Temp := TPolygon.Create;
    try
      Temp.Assign(Self);
      Temp.Inflate(1);
      dX := Temp[Index].X - FItems[Index].X;
      dY := Temp[Index].Y - FItems[Index].Y;
      if (dX < 0) and (dY > 0) then
        Result := csTopRight
      else
        if (dX < 0) and (dY < 0) then
          Result := csBottomRight
        else
          if (dX > 0) and (dY < 0) then
            Result := csBottomLeft
          else
            Result := csTopLeft; // (dX > 0) and (dY > 0)
      // ShowMessage(Format('%d: (%2.f %2.f) %2.f (%2.f %2.f) %2.f = %d',
      //   [Index, FItems[Index].X, FItems[Index].Y, dX,
      //     Temp[Index].X, Temp[Index].Y, dY, Integer(Result)]));
    finally
      Temp.Free;
    end;
  end;
end;

Uwe Raabe 8. Jul 2014 12:45

AW: Polygon.Inflate
 
Zitat:

Zitat von Bjoerk (Beitrag 1264835)
Betondeckungen verstehen sich immer parallel zur Polygonline.

OK, und welchen der Margins nimmt man nun für die Dicke der Betondeckung einer solchen schrägen Polygonlinie?

Bjoerk 8. Jul 2014 12:56

AW: Polygon.Inflate
 
Da kann man (hier) nicht interpolieren. Bei dem Beispiel von oben und einer 45° Ecke würde ja (MarginTop + MarginLeft) / 2 rauskommen. Das darf hier aber nicht. Die Betondeckung ist in jedem Falle einzuhalten. Das MarginPolygon macht da also einen Sprung.

Uwe Raabe 8. Jul 2014 13:08

AW: Polygon.Inflate
 
Zitat:

Zitat von Bjoerk (Beitrag 1264845)
Da kann man (hier) nicht interpolieren. Bei dem Beispiel von oben und einer 45° Ecke würde ja (MarginTop + MarginLeft) / 2 rauskommen. Das darf hier aber nicht. Die Betondeckung ist in jedem Falle einzuhalten. Das MarginPolygon macht da also einen Sprung.

Also wäre man bei einer Schräge, die sowohl nach links als auch nach oben zeigt, mit Max(MarginLeft, MarginTop) auf der sicheren Seite?

Bjoerk 8. Jul 2014 13:41

AW: Polygon.Inflate
 
Stop. Du hattest völlig Recht. Ich hab's jetzt nicht mehr weiterverfolgt aber m.E. müßte man da doch (vermutlich Ellipsenförmig) interpolieren?

Mikkey 8. Jul 2014 14:08

AW: Polygon.Inflate
 
Warum so kompliziert?

Bei konvexen Ecken des Ursprungspolygons brauchst Du nur die innenliegenden Parallelen mit dem vorgegebenen Abstand suchen und in gleicher Reihenfolge wieder zusammenfügen. Dabei mögen sich einzelne Ziel-Strecken außerhalb der Zielfigur befinden, die musst Du dann auslassen.

Etwas komplizierter sind konkave Ecken, weil sich in der Zielfigur ein Kreissegment mit der Ecke als Zentrum ergibt.

Bjoerk 8. Jul 2014 15:00

AW: Polygon.Inflate
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jo Uwe, geht Ellipsenförmig. Habs mal noch schnell implementiert. Thanx!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:41 Uhr.
Seite 5 von 5   « Erste     345   

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