Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   "Kreisberechnung" - Hülfe gesucht... (https://www.delphipraxis.net/155525-kreisberechnung-huelfe-gesucht.html)

turboPASCAL 27. Okt 2010 08:51

"Kreisberechnung" - Hülfe gesucht...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

hab da mal ein kleines Problem. Wie könnte man bei einem rotiertem Text das umgebende Rechteck berechnen ?
Ich habe da mal was zur Verständlichkeit vorbereitet.

Gesucht ist das rot gepunktete Rechteck.

Neutral General 27. Okt 2010 08:57

AW: "Kreisberechnung" - Hülfe gesucht...
 
Vielleicht hilft dir:

Delphi-Referenz durchsuchenCanvas.TextExtent oder auch direkt über die WinAPI: MSDN-Library durchsuchenGetTextExtentPoint32.

Oder willst du das unbedingt selbst ausrechnen?

turboPASCAL 27. Okt 2010 09:51

AW: "Kreisberechnung" - Hülfe gesucht...
 
Zitat:

Zitat von Neutral General (Beitrag 1058048)
Vielleicht hilft dir:

Delphi-Referenz durchsuchenCanvas.TextExtent oder auch direkt über die WinAPI: MSDN-Library durchsuchenGetTextExtentPoint32.

Oder willst du das unbedingt selbst ausrechnen?

Nein, das gibt nur Textlänge und Höhe an ohne Beachtung dessen Ausrichtung.

Zitat:

Oder willst du das unbedingt selbst ausrechnen?
Nicht unbedingt, wenn es nicht sein muss. ;)

Neutral General 27. Okt 2010 09:53

AW: "Kreisberechnung" - Hülfe gesucht...
 
Zitat:

Zitat von turboPASCAL (Beitrag 1058066)
Zitat:

Vielleicht hilft dir:
Delphi-Referenz durchsuchenCanvas.TextExtent oder auch direkt über die WinAPI: MSDN-Library durchsuchenGetTextExtentPoint32.
Nein, das gibt nur Textlänge und Höhe an ohne Beachtung dessen Ausrichtung.

Soweit ich weiß nicht! Denn ich weiß, dass ich auch mal gedrehten Text ausgegeben habe und da wollte ich die Länge des gedrehten Textes und habe von Canvas.TextWidth/Height genau dieses Rechteck erhalten was du haben willst. Hab da extra noch mit Vektoren rumgerechnet und mir ne Funktion geschrieben, die mir die tatsächliche (gedrehte) Länge des Textes berechnet.

Satty67 27. Okt 2010 10:03

AW: "Kreisberechnung" - Hülfe gesucht...
 
Du drehst den Text (oder das den Text umgebende Rechteck) an der linken/oberen Ecke um den Kreismittelpunkt.

Damit hast Du 3 Radien, ausgehen vom Text in 0° Position:

1) Top/Left -> Bottom/Left
2) Top/Left -> Top/Right
3) Top/Left -> Bottom/Right (die Diagonale durch den Text)

Alle drei Radien stellen die Diagonale eines umgebenden Rechteckes dar, die sich leicht über den Winkel (der jeweiligen Drehposition) berechnen lassen. Die jeweils äußeren Punkte der drei Rechtecke bilden dann das gesamt umgebende Rechteck.

TopAll = Min(Rect1.Top, Rect2.Top, Rect3.Top)
RightAll = Max(Rect1.Right, Rect2.Right, Rect3.Right) usw.

turboPASCAL 27. Okt 2010 10:04

AW: "Kreisberechnung" - Hülfe gesucht...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nu, ich habe es so: (Test im Anhang)

Leider klappt es damit nicht.

Satty67 27. Okt 2010 10:40

AW: "Kreisberechnung" - Hülfe gesucht...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Deine Antwort bezieht sich nicht auf meinen Post?

Bei mir funktioniert es:
Delphi-Quellcode:
procedure TForm1.FormPaint(Sender: TObject);
const
  txt = '012346789 - Hello@World!';
var
  Rect1, Rect2, Rect3, RectTotal : TRect;
  fh,fw: integer;
  p1, p2: TPoint;
  ts: TSize;
begin
  SetFontDirection(Canvas.Font, 0);
  canvas.Brush.Style := bsClear;
  DrawCoordSys(canvas);

  // normal TextOut
  canvas.Font.Color := clGray;
  canvas.TextOut(150,150, txt);

  // get fontdim.
  fh := canvas.TextHeight(txt);
  fw := canvas.TextWidth(txt);

  canvas.Pen.Color := clBlue;
  canvas.Rectangle(150,150,150+fw, 150+fh);

  canvas.Pen.Color := clGray;
  canvas.Ellipse(150-fw, 150-fw,150+fw, 150+fw);


  // rotierter Text
  SetFontDirection(Canvas.Font, Winkel);
  canvas.Font.Color := clBlack;
  canvas.TextOut(150,150, txt);


  // Corner
  p1 := POINT(150, 150);
  DrawCross(canvas, p1.x, p1.Y, clYellow); // Nullpos


  p2 := POINT(150 + fw, 150);
  p2 := PointRotate(p1, p2, Winkel);
  DrawCross(canvas, p2.x, p2.Y, clRed);

  Rect1.Top := Math.Min(p1.y, p2.y);
  Rect1.Left := Math.Min(p1.x, p2.x);
  Rect1.Bottom := Math.Max(p1.y, p2.y);
  Rect1.Right := Math.Max(p1.x, p2.x);

  p2 := POINT(150 + fw, 150 + fh);
  p2 := PointRotate(p1, p2, Winkel);
  DrawCross(canvas, p2.x, p2.Y, clGreen);

  Rect2.Top := Math.Min(p1.y, p2.y);
  Rect2.Left := Math.Min(p1.x, p2.x);
  Rect2.Bottom := Math.Max(p1.y, p2.y);
  Rect2.Right := Math.Max(p1.x, p2.x);

  p2 := POINT(150, 150 + fh);
  p2 := PointRotate(p1, p2, Winkel);
  DrawCross(canvas, p2.x, p2.Y, clBlue);

  Rect3.Top := Math.Min(p1.y, p2.y);
  Rect3.Left := Math.Min(p1.x, p2.x);
  Rect3.Bottom := Math.Max(p1.y, p2.y);
  Rect3.Right := Math.Max(p1.x, p2.x);

  RectTotal.Top := Math.Min( Rect1.Top, Math.Min(Rect2.Top, Rect3.Top));
  RectTotal.Left := Math.Min( Rect1.Left, Math.Min(Rect2.Left, Rect3.Left));
  RectTotal.Bottom := Math.Max( Rect1.Bottom, Math.Max(Rect2.Bottom, Rect3.Bottom));
  RectTotal.Right := Math.Max( Rect1.Right, Math.Max(Rect2.Right, Rect3.Right));

  canvas.Rectangle(Rect1);
  canvas.Rectangle(Rect2);
  canvas.Rectangle(Rect3);

  canvas.Pen.Color := clRed;
  canvas.Pen.Width := 2;
  canvas.Rectangle(RectTotal);

  ts := Canvas.TextExtent(txt);
  Label1.Caption := format('Winkel: %d°'#13'Textlänge: %d, Texthöhe: %d (in Pixel)', [Winkel, ts.cx, ts.cy]);

end;

Neutral General 27. Okt 2010 10:45

AW: "Kreisberechnung" - Hülfe gesucht...
 
@Satty: Schau dir doch mal die angezeigten Werte im Label an. Die stimmen nicht.

Aphton 27. Okt 2010 10:53

AW: "Kreisberechnung" - Hülfe gesucht...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ein mathematischer Ansatz!

Satty67 27. Okt 2010 11:02

AW: "Kreisberechnung" - Hülfe gesucht...
 
Zitat:

Zitat von Neutral General (Beitrag 1058092)
@Satty: Schau dir doch mal die angezeigten Werte im Label an. Die stimmen nicht.

Die Werte des Labels werden ja nicht angepasst, hat also mit der Lösung wenig zu tun.

Die Fläche des umgebenden Rechtecks ist eine Obermenge der Teilrechtecke, das stimmt auf jeden Fall. Ich hab' mich einfach am bestehenden Code orientiert. Man kann das sicher auch direkter berechnen, evtl. Aphton's Weg.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:02 Uhr.
Seite 1 von 2  1 2      

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