Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Rechtwinkeliges Dreieck zeichnen (https://www.delphipraxis.net/65105-rechtwinkeliges-dreieck-zeichnen.html)

BlueStarHH 12. Mär 2006 14:02


Rechtwinkeliges Dreieck zeichnen
 
Wie kann ich ein rechtwinkeliges Dreieck zeichnen? Ich habe den nur den Anfgangs- und Endpunkt der längsten Seite. Die beiden anderen Winkel sollen je immer 45 Grad sein. Wie kann ich nun die XY-Koordinaten des 90-Grad-Winkels berechnen? Dann kann ich einfach mit LineTo() alles zu einem Dreieck verbinden. Danke!

dummzeuch 12. Mär 2006 14:05

Re: Rechtwinkeliges Dreieck zeichnen
 
Selbst mit diesen Angaben gibt es noch zwei Moeglichkeiten: Die Spitze koennte in zwei Richtungen zeigen.

BlueStarHH 12. Mär 2006 14:07

Re: Rechtwinkeliges Dreieck zeichnen
 
Zitat:

Zitat von dummzeuch
Selbst mit diesen Angaben gibt es noch zwei Moeglichkeiten: Die Spitze koennte in zwei Richtungen zeigen.

Ich brauche beide Möglichkeiten. Am Besten wäre also eine Funktion, wo ich die Richtung (unten/oben) angeben kann.

Mr. Pink 12. Mär 2006 14:12

Re: Rechtwinkeliges Dreieck zeichnen
 
der Punkt, in dem der rechte winkel anliegt, ist genau über/unter der mitte der hypothenuse und zwar im abstand der hälfte der hypothenuse; also würde man eine orthogonale zur hypothenuse, durch deren mitte zeichnen, würde der punkt auf der graden liegen!

btw, das is jetzt nur eine übelegung, ob es jetzt ganz richtig ist weiß ich nicht, kommt mir aber relativ plausibel vor^^

ibp 12. Mär 2006 14:22

Re: Rechtwinkeliges Dreieck zeichnen
 
du brauchst nur die höhe mit pythagoras zu berechnen.

Ansatz: h²+(a/2)²=a²

dummzeuch 12. Mär 2006 14:25

Re: Rechtwinkeliges Dreieck zeichnen
 
Hm,

A = (ax, ay)
B = (bx, by)
M = A + (B - A) / 2 (Mittelpunkt der Hypothenuse)

M = (ax, ay) + ((bx-ax)/2, (by-ay)/2)

Wenn ich mch jetzt noch erinnern koennte, wie man einen Vektor um 90 Grad dreht....

Ach ja: Koordinaten vertauschen und eine davon negativ nehmen:

Vektor von A nach B: ((bx-ax),(by-ay))
Vektor senkrecht dazu:
1. (-(by-ay),(bx-ax)) = (ay-by,bx-ax)
2. ((by-ay),-(bx-ax)) = (by-ay,ax-bx)

Daraus ergibt sich dann:

1. C = (ax, ay) + ((bx-ax)/2, (by-ay)/2) + ((ay-by)/2,(bx-ax)/2)
2. C = (ax, ay) + ((bx-ax)/2, (by-ay)/2) + ((by-ay)/2,(ax-bx)/2)

Mann, mein Mathe ist schon verdammt lange her. OK, als Delphi Prozedur:

Delphi-Quellcode:
procedure GleichschenkligRechtwinkligesDreieck(A, B: TPoint; out C1, C2: TPoint);
var
  AB2: TPoint; // Vektor AB / 2
  H1, H2: TPoint; // Hoehe 1 und 2
begin
  AB2 := Point(Round((B.x - A.x) / 2), Round((B.y - A.y) / 2));
  H1 := Point(Round((A.y - B.y) / 2), Round((B.x - A.x) / 2));
  H2 := Point(Round((B.y - A.y) / 2), Round((A.x - B.x) / 2));
  C1 := Point(A.x + AB2.x + H1.x, A.y + AB2.y + H1.y);
  C2 := Point(A.x + AB2.x + H2.x, A.y + AB2.y + H2.y);
end;
Das muesste es tun, aber ich habe es nicht ausprobiert.

DevilsCamp 12. Mär 2006 14:31

Re: Rechtwinkeliges Dreieck zeichnen
 
Also mit Hilfe von Sinus und dem Winkel ist es doch kein Problem:

Länge der Hypothenuse = a (start bei a1, Ende bei a2);

Da der Winkel al=45° => Katheten sind gleich lang


Zum zeichnen einer 45° Linie bei Delphi:
Delphi-Quellcode:
MoveTo(x,y);
LineTo(x+d1,y+d1);
Da bei 45° die Höhe die Hypothenuse genau bei a/2 schneidet, kannst du d1 ohne Probleme berechnen (vorausgesetzt, die Hypothenuse ist eine Waagrechte bzw. Senkrechte).

Ansonsten musst du x und y der Spitze berechnen.
Dazu benötigst du noch den Winkel der Hypothenuse zur Waagrechten.
Diese Berechnung sollte mit Hilfe einfacher Winkel-Berechnungen kein Problem sein.
Und das ist nun deine Hausaufgabe :D

BlueStarHH 12. Mär 2006 15:00

Re: Rechtwinkeliges Dreieck zeichnen
 
Danke, mit eurer Hilfe habe ich es geschafft:

Delphi-Quellcode:
{**
  Zeichnet ein rechtwinkliges Dreieck mit Alpha 45°, Beta=45° und waagerechter
  Hypotenuse.

  @param Canvas Zeichenfläche.
  @param TopLeft Startpunkt der Hypotenuse.
  @param Width Breite der Hypotenuse.
  @param SpikeTop Spitze ober- oder unterhalb der Hypotenuse zeichnen?
  @return Position der Spitze.
*}

function DrawTriangle90(Canvas: TCanvas; TopLeft: TPoint; Width: Integer;
  SpikeTop: Boolean): TPoint;
var
  H, Direction: Integer;
begin

  if SpikeTop then
    Direction := -1
  else
    Direction := 1;

  H := Width div 2;
  Result := Point(TopLeft.X + H, TopLeft.Y + H * Direction);
  Canvas.Polygon([TopLeft, Point(TopLeft.X + Width, TopLeft.Y), Result]);
end;

Beispiel:
  DrawTriangle90(PaintBox1.Canvas, Point(50, 60), 30, True);

dummzeuch 12. Mär 2006 15:05

Re: Rechtwinkeliges Dreieck zeichnen
 
Zitat:

Zeichnet ein rechtwinkliges Dreieck mit Alpha 45°, Beta=45° und waagerechter
Hypotenuse.
Dass die Hypothenuse waagerecht ist, haettest Du aber ruhig vorher sagen koennen. Dann haette ich mir nicht mit der Vektorrechnung einen abgebrochen. ;-)

BlueStarHH 12. Mär 2006 16:01

Re: Rechtwinkeliges Dreieck zeichnen
 
Zitat:

Zitat von dummzeuch
Dass die Hypothenuse waagerecht ist, haettest Du aber ruhig vorher sagen koennen. Dann haette ich mir nicht mit der Vektorrechnung einen abgebrochen. ;-)

Sorry, ich habe zwar daran gedacht, es aber vergessen hier zu schreiben. Naja vielleicht ist Deine Vektorrechnung für andere hilfreich.


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