Delphi-PRAXiS

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.

Neutral General 27. Okt 2010 11:12

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

Zitat von Satty67 (Beitrag 1058097)
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.

Doch werden sie:

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

Satty67 27. Okt 2010 11:16

AW: "Kreisberechnung" - Hülfe gesucht...
 
ts.cx und ts.cy sind nicht die Koordinaten des roten Rechteckes, das ich zeichne!

Somit sind die Werte nicht an das neu ermittelte Rechteck angepasst. Die neuen Werte für TextLänge/Höhe liegen in RectTotal.

Soll der TS entscheiden, ob die Lösung wie gesucht aussieht. Er sucht ja nicht die Textlänge, sondern das umgebende Rechteck bei jedem Winkel!

turboPASCAL 27. Okt 2010 15:34

AW: "Kreisberechnung" - Hülfe gesucht...
 
Weiter geht es.. immer diese Unterbrechungen.

Zitat:

@Satty: Schau dir doch mal die angezeigten Werte im Label an. Die stimmen nicht.
Doch die stimmen. TextExtent und Co geben wirklich nur Länge und Höhe eines Wage.- bzw. Senkrechten Strings an.


@Satty, Das passt. Auf die Idee mit Min / Max wäre ich nicht gekommen.

Danke.

Neutral General 27. Okt 2010 15:38

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

Zitat von turboPASCAL (Beitrag 1058154)
Weiter geht es.. immer diese Unterbrechungen.
Zitat:

@Satty: Schau dir doch mal die angezeigten Werte im Label an. Die stimmen nicht.
Doch die stimmen. TextExtent und Co geben wirklich nur Länge und Höhe eines Wage.- bzw. Senkrechten Strings an.

Ja genau deswegen sind sie ja falsch x_x

Satty67 27. Okt 2010 15:45

AW: "Kreisberechnung" - Hülfe gesucht...
 
Die meiste Arbeit hattest Du ja schon erledigt...

Den Umweg über die Rect1-3 kannst Du auch sparen und aus den 3 Punkten (p2) direkt RectTotal berechnen. Ich wollte halt nur erst mal sehen, ob es auf den ersten Blick passt.

Zitat:

Ja genau deswegen sind sie ja falsch x_x
Ja, die Werte sind falsch, aber das ist völlig irrelevant. Die zeigen nicht die Werte der Lösung (umgebendes Quadrat). Deshalb ist die Anzeige/Codezeile irrelevant, kann gelöscht, vernichtet, vergessen werden. ;)

PS: Wenn der Text sauber gedreht wird, darf sich ja Texthöhe/Länge bei keinem Winkel ändern, bezogen auf die Grundlinie des Textes. Ist halt Definitionssache, ob bei um 45° gedrehtem Text der senkrechte Platzbedarf die Texthöhe ist.

turboPASCAL 27. Okt 2010 16:12

AW: "Kreisberechnung" - Hülfe gesucht...
 
Eigentlich müsste sich dieser Sch.....nee aber auch anders / einfacher errechnen lassen.

Wenn ich vor Jahrzehnten besser aufgepasst und den Rest nicht vergessen hätte, würde ich sagen:
"Einfach die Hyponuse in der dritten Wurzel Quartieren, davon das halbe Bogenmass zur Tangente multiplizeren minus 24 und ferdisch"
:nerd:

Satty67 27. Okt 2010 16:15

AW: "Kreisberechnung" - Hülfe gesucht...
 
Aphton hat in Post #9 eine Formel aufgestellt. Die hatte ich nicht getestet, weil mit dem vorhandenen Code ohne viel denken die "Praktiker-Lösung" schnell machbar war.

Evtl. die mal genauer anschauen und testen...

Luckie 27. Okt 2010 18:39

AW: "Kreisberechnung" - Hülfe gesucht...
 
Bitte vermeide absichtliche Rechtschreibfehler im Beitragstitel.


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