AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Canvas: Rechtwinklige Linien erzeugen
Thema durchsuchen
Ansicht
Themen-Optionen

Canvas: Rechtwinklige Linien erzeugen

Ein Thema von Martin W · begonnen am 10. Apr 2013 · letzter Beitrag vom 3. Jun 2013
Antwort Antwort
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#1

Canvas: Rechtwinklige Linien erzeugen

  Alt 10. Apr 2013, 16:29
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
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#2

AW: Canvas: Rechtwinklige Linien erzeugen

  Alt 10. Apr 2013, 16:38
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.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Canvas: Rechtwinklige Linien erzeugen

  Alt 10. Apr 2013, 16:40
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi (10. Apr 2013 um 16:52 Uhr) Grund: P1.X + fehlte
  Mit Zitat antworten Zitat
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#4

AW: Canvas: Rechtwinklige Linien erzeugen

  Alt 10. Apr 2013, 16:41
Danke euch beiden! Manchmal ist die Antwort doch recht einfach

Ist jemanden eine Funktion bekannt, die hierbei noch "abgerundete Ecken" darstellen kann?
  Mit Zitat antworten Zitat
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#5

AW: Canvas: Rechtwinklige Linien erzeugen

  Alt 10. Apr 2013, 16:51
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.

Geändert von Martin W (10. Apr 2013 um 16:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Canvas: Rechtwinklige Linien erzeugen

  Alt 10. Apr 2013, 17:28
Wenn Du eh GDI+ verwenden möchtest langt u.U. schon DrawCurve ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Martin W

Registriert seit: 29. Mai 2004
Ort: Augsburg
220 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: Canvas: Rechtwinklige Linien erzeugen

  Alt 3. Jun 2013, 13:54
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?
Miniaturansicht angehängter Grafiken
img_20130603_145103.jpg  

Geändert von Martin W ( 3. Jun 2013 um 13:58 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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