Autor Beitrag
Roux
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Sa 24.05.08 11:48 
Hi!
Wir sollen gerade in der Schule ein Programm schreiben, dass ein (vom User eingegebenes - also a-, b- und c-werte) Dreieck konstruiert. Dazu haben wir folgende Seite bekommen: www.mathematik.uni-l...s/Delphi/dpue060.htm

Da ich gerade nicht wirklich weiß, wie ich das Dreieck konstruieren soll, dachte ich, nehm ich mir mal den Beispiel-Code dort vor. Doch den versteh ich nicht ganz. Kann den mir mal jemand bisschen erläutern?

Roux
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Sa 24.05.08 12:03 
Hi,

Ich hab den Quelltext mal formatiert und das With-Statement rausgebaut(sowas ist unsauber). Dass du garnichts verstehst kann ich irgendwie nicht glauben :wink:

Markier doch die Stellen mal mit dem Highlight-Tag([highlight ] markierte Stelle [/highlight]) und schreib Fragen als Kommentar an die Seite, dann können wir die sicher schneller helfen.

ausblenden Quelltext zum Dreieck:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure Gleichseitiges_Dreieck;
var 
  a, b, c: TPoint;
  SeitenLaenge: Integer;
begin
  a.x := 1;
  a.y := PaintBox1.Height - 1;
  b.x := PaintBox1.Width - 1;
  b.y := a.y;
  Seitenlaenge := b.x - a.x;
  c.x := a.x + Seitenlaenge div 2;
  c.y := a.y - Trunc(Sqrt(3 / 4 * Sqr(Seitenlaenge)));
  //Zeichnen durch Verbinden der Eckpunkte
  PaintBox1.Vanvas.MoveTo(a.x, a.y);
  PaintBox1.Canvas.LineTo(b.x, b.y);
  PaintBox1.Canvas.LineTo(c.x, c.y);
  PaintBox1.Canvas.LineTo(a.x, a.y);
end;

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Roux Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Sa 24.05.08 12:16 
Naja, ich dacht, wenn du irgendwas dazu schreibst, hilft mir das Puzzelteil schon weiter ^^
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure Gleichseitiges_Dreieck;
var 
  a, b, c: TPoint;
  SeitenLaenge: Integer;
begin
  a.x := 1;
  a.y := PaintBox1.Height - 1;
  b.x := PaintBox1.Width - 1;
  b.y := a.y;

  Seitenlaenge := b.x - a.x;
  c.x := a.x + Seitenlaenge div 2;
  c.y := a.y - Trunc(Sqrt(3 / 4 * Sqr(Seitenlaenge)));
  //Zeichnen durch Verbinden der Eckpunkte
  PaintBox1.Vanvas.MoveTo(a.x, a.y);
  PaintBox1.Canvas.LineTo(b.x, b.y);
  PaintBox1.Canvas.LineTo(c.x, c.y);
  PaintBox1.Canvas.LineTo(a.x, a.y);
end;


Also, z.B. Punkt A / B:
Unsere PaintBox ist 200 x 200 - dann wäre A(1|199) und B(199|199).
Führt man den Code aber aus, so ist die Spitze des Dreiecks oben und die Seite C ganz unten bei der Paintbox ... also müssten die Punkte A und B ja bei y = 1 oder so sein ... und nicht so weit oben, verstehste?

Roux
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Sa 24.05.08 12:29 
Das Koordinatensystem von Canvas ist auf dem Kopf. Der Ursprung (0,0) ist links oben.

Übrigens: Um Dreiecke zu konstruieren gibt es eine Formel:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
  a, b, c: Integer;
  x, y: Integer;
begin
  a := 50;
  b := 50;
  c := 50;
  x := Round((sqr(a)-sqr(c)+sqr(b))/a/2);
  y := Round(sqrt((c-b-a)*(a+b+c)*(a+c-b)*(a-c-b))/a/2);
  PaintBox1.Canvas.Polygon([Point(0,0),Point(a,0),Point(x,y)]);
end;


Ansonsten ist noch zu sagen, dass man die TPaintBox im OnPaint Ereignis zeichnen soll und nicht ausserhalb. Ansonsten kann man auch eine TImage nehmen.