Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Canvas: Rechtwinklige Linien erzeugen (https://www.delphipraxis.net/174233-canvas-rechtwinklige-linien-erzeugen.html)

Martin W 10. Apr 2013 16:29

Canvas: Rechtwinklige Linien erzeugen
 
Hallo,


folgende Situation:

- ich habe 2 Punkte, z.B. A(3|1) und B (20|99).
- diese möchte ich mit einer Linie verbinden, welche nur aus wagerechten und hotizontalen Linien besteht.
- Die "Knickpunkte" sollten mittig sein (von A die 1/2 der Strecke nach Rechts, dann runter, dann den Rest nach Rechts zu B).

Gibt es eine fertige Funktion die das automatisch für mich erledigt? Die auch andere Besonderheiten mit Berücksichtigt (A und B auf der selben X / Y Koordinate, B ist links von A, etc...).

Bin bei meiner Suche (Google, Forum) bisher nur auf Polyline gestoßen, aber die muss in Delphi ja auch manuell vorgegeben werden.

GDI+ gerne auch Vorschläge.


Viele Grüße,
Martin

BUG 10. Apr 2013 16:38

AW: Canvas: Rechtwinklige Linien erzeugen
 
Wo ist das Problem? Berechne die 4 Punkte einfach und zeichne die Linien dazwischen.

Code:
A  = (A.x,           A.y)
A' = ((A.x + B.x/2), A.y)
B' = ((A.x + B.x/2), B.y)
B  = (B.x,           B.y)
Mir fällt kaum eine Besonderheit ein, die eine andere Behandlung brauchen würde.

Bummi 10. Apr 2013 16:40

AW: Canvas: Rechtwinklige Linien erzeugen
 
Delphi-Quellcode:
Type
TPArray=Array of Tpoint;

Function GetIt(P1,P2:TPoint):TPArray;
begin
  SetLength(Result,4);
  Result[0] := P1;
  Result[1].X := P1.X + (P2.X - P1.X) DIV 2;
  Result[1].Y := P1.Y;
  Result[2].X := Result[1].X;
  Result[2].Y := P2.Y;
  Result[3] := P2;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
 P1,P2:TPoint;
begin
    P1 := Point(3,1);
    P2 := Point(20,99);
    Canvas.Polyline(GetIt(P1,P2));
end;

Martin W 10. Apr 2013 16:41

AW: Canvas: Rechtwinklige Linien erzeugen
 
Danke euch beiden! Manchmal ist die Antwort doch recht einfach :roll:

Ist jemanden eine Funktion bekannt, die hierbei noch "abgerundete Ecken" darstellen kann?

Martin W 10. Apr 2013 16:51

AW: Canvas: Rechtwinklige Linien erzeugen
 
Bin noch am googlen, das könnte wohl in die Richtung gehen: http://stackoverflow.com/questions/1...ounded-corners
Code:
protected GraphicsPath GetRoundedLine(PointF[] points, float cornerRadius)
{
  GraphicsPath path = new GraphicsPath();
  PointF previousEndPoint = PointF.Empty;
  for (int i = 1; i < points.Length; i++)
  {
    PointF startPoint = points[i - 1];
    PointF endPoint = points[i];

    if (i > 1)
    {
      // shorten start point and add bezier curve for all but the first line segment:
      PointF cornerPoint = startPoint;
      LengthenLine(endPoint, ref startPoint, -cornerRadius);
      PointF controlPoint1 = cornerPoint;
      PointF controlPoint2 = cornerPoint;
      LengthenLine(previousEndPoint, ref controlPoint1, -cornerRadius / 2);
      LengthenLine(startPoint, ref controlPoint2, -cornerRadius / 2);
      path.AddBezier(previousEndPoint, controlPoint1, controlPoint2, startPoint);
    }
    if (i + 1 < points.Length) // shorten end point of all but the last line segment.
      LengthenLine(startPoint, ref endPoint, -cornerRadius);

    path.AddLine(startPoint, endPoint);
    previousEndPoint = endPoint;
  }
  return path;
}
Werde das mal, zusammen mit Bummi's Code in Delphi / GDI+ umsetzen, testen und das Resultat posten! Weiteres heute abend.

Bummi 10. Apr 2013 17:28

AW: Canvas: Rechtwinklige Linien erzeugen
 
Wenn Du eh GDI+ verwenden möchtest langt u.U. schon DrawCurve ...

Martin W 3. Jun 2013 13:54

AW: Canvas: Rechtwinklige Linien erzeugen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hat soweit alles funktioniert.

Folgende Situation: Ich habe 2 Quadrate, die jeweils einen Punkt auf jeder der Seitenflächen haben. Diese können theoretisch in 16 verschiedenen Varianten miteinander verbunden werden:
  • Top > Top
  • Top > Right
  • Top > Bottom
  • Top > Left
  • Right > Top
  • Right > Right
  • Right > Bottom
  • ...

Hierbei können wir alle Varianten entfernen, die auch umgekehr gelten, also z.B.
  • Top > Bottom
  • Bottom > Top
  • ...

Bleibt übrig:
  • Top > Top
  • Top > Right
  • Top > Bottom
  • Top > Left
  • Right > Right
  • Right > Bottom
  • Right > Left
  • Bottom > Bottom
  • Bottom > Left
  • Left > Left

Wie kann man die Knickpunkte der Linie sinnvoll berechnen? Also möglichst kompakt? Für Right <> Left eignet sich die Funktion von Bummi, leicht abgewandelt auch für Top <> Bottom. Gibt es auch eine elegante Variante, die 2 bzw. 3 Knickpunkte der Linie zu berechnen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 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