unit Dynamischematrixforum;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls;
type
TPunkt =
Record
x,
y: Double;
radius:double;
end;
type
TForm1 =
class(TForm)
PaintBox1: TPaintBox;
StatusBar1: TStatusBar;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
Haus :
array of TPunkt;
procedure InitHaus(anzahl :
array of Tpunkt);
procedure ZeichneKaroBlatt;
procedure ZeichneHaus;
procedure DreheHaus;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
MP : TPoint;
EinheitenGroesse : integer;
Winkel : integer;
Const
P1: TPunkt = (x:0; y:0);
P2: TPunkt = (x:2; y:0);
P3: TPunkt = (x:2; y:2);
P4: TPunkt = (x:1; y:3);
P5: TPunkt = (x:0; y:2);
max = 5;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var punkte:
array[0..4]
of tpunkt;
begin
Paintbox1.Width := 400;
paintbox1.Height := 400;
MP.X := paintbox1.Width
div 2;
MP.Y := paintbox1.Height
div 2;
EinheitenGroesse := PaintBox1.Width
DIV (2*Max);
Punkte[0]:= P1;
Punkte[1]:= P2;
Punkte[2]:= P3;
Punkte[3]:= P4;
Punkte[4]:= P5;
InitHaus(Punkte);
end;
procedure TForm1.InitHaus(anzahl :
array of Tpunkt);
var i: integer;
Temp : Tpunkt;
begin
setlength(Haus, high(anzahl)+1);
for i:=0
to high(Haus)
do
begin
Temp.x := anzahl[i].x;
Temp.y := anzahl[i].y;
Temp.radius:= sqrt(sqr((anzahl[i].X))+(sqr(anzahl[i].Y)));
// Pythagoras
Haus[i].X := Temp.x;
Haus[i].y := Temp.y;
Haus[i].radius := Temp.radius;
// showmessage(floattostr(Haus[i].radius));
end;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
ZeichneKaroblatt;
ZeichneHaus;
end;
procedure TForm1.ZeichneHaus;
var
Bild:
Array of TPoint;
I: Integer;
Leerstellen :
String;
begin
setlength(Bild, high(haus)+1);
for i := low(haus)
to high(Haus)
do
begin
Bild[i].x := Mp.x + Round(Haus[I].x*EinheitenGroesse);
Bild[i].y := Mp.y - Round(Haus[I].y*EinheitenGroesse);
end;
PaintBox1.Canvas.Pen.Color := clblack;
PaintBox1.Canvas.Brush.Color := clred;
PaintBox1.Canvas.Polygon(Bild);
for i := low(haus)
to high(Haus)
do
begin
paintbox1.Canvas.MoveTo(Mp.X,mp.Y);
paintbox1.Canvas.lineto(Mp.x + Round(Haus[I].x*EinheitenGroesse),Mp.y - Round(Haus[I].y*EinheitenGroesse));
Bild[i].x := Mp.x + Round(Haus[I].x*EinheitenGroesse);
Bild[i].y := Mp.y - Round(Haus[I].y*EinheitenGroesse);
end;
// Hilfen
PaintBox1.Canvas.Brush.Color := clbtnface;
Statusbar1.SimpleText :='
';
for i:=low(Haus)
to high(haus)
do
begin
if i=0
then Leerstellen:='
'
else Leerstellen:='
.. ';
statusbar1.SimpleText:=statusbar1.simpletext+Leerstellen+inttostr(round(Haus[i].X*einheitengroesse))+'
|'+inttostr(round(Haus[i].Y*einheitengroesse));
paintbox1.Canvas.TextOut(Bild[i].X,Bild[i].Y,inttostr(i+1));
end;
end;
procedure TForm1.DreheHaus;
var i: Integer;
begin
for i := low(haus)
to high(Haus)
do
begin
Haus[i].radius := sqrt((sqr(Haus[i].x))+(sqr(haus[i].Y)));
Haus[i].x := Haus[i].x+(Haus[i].Radius * cos(PI / 100 * winkel));
Haus[i].y := Haus[i].y-(Haus[i].Radius * sin(PI / 100 * winkel));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ZeichneHaus;
inc(winkel,1);
drehehaus;
invalidate;
end;
//--------------------------------------------------------------
procedure TForm1.ZeichneKaroBlatt;
var i: Integer;
begin
with PaintBox1.Canvas
do
begin
Pen.Color := clBlack;
Brush.Color := clWhite;
Rectangle(0, 0, PaintBox1.Width - 1, PaintBox1.Height -1);
// vor den Achsen liegende Hilfslinien zeichnen
Pen.Style := psDot;
for i := 1
to Max - 1
do
begin
MoveTo(0, i*EinheitenGroesse);
LineTo(PaintBox1.Width - 1, i*EinheitenGroesse);
MoveTo(i*EinheitenGroesse, 0);
LineTo(i*EinheitenGroesse, PaintBox1.Width - 1 );
end;
// nach den Achsen liegende Hilfslinien zeichnen
for i := Max+1
to 2*Max - 1
do
begin
MoveTo(0, i*EinheitenGroesse);
LineTo(PaintBox1.Width - 1, i*EinheitenGroesse);
MoveTo(i*EinheitenGroesse, 0);
LineTo(i*EinheitenGroesse, PaintBox1.Width - 1 );
end;
// Achsen zeichnen
Pen.Style := psSolid;
MoveTo(Mp.x, 0);
LineTo(Mp.x, PaintBox1.Height - 1);
MoveTo(0, Mp.y);
LineTo(PaintBox1.Width - 1, Mp.y);
end;
end;
end.