hab 3 Punkte, muss jetzt feststellen, ob die einen Dreieck bilden oder eifach auf einer Gerade liegen
hab mir auch überlegt, ob es nicht mit hilfe von Vektorrechnung das problem bewältigt werden kann und zwar:
cos Alpha = A*B/(|A|*|B|)
A*B = a1*b1+a2*b2*+....+aN*bN
|A| = sqrt(sqr(a1)+sqr(a2)+...)
genauso mit |B| und wenn die cos Alpha = 0 dann ist es auf einer gerade.
Delphi-Quellcode:
function DrawDreieck(Figur:TFigur) : boolean;
var VektA_VektB : real; //A*B
LaengeVA, //laenge des vektors A
LaengeVB : real; //laenge des vektors A
x1,x2, //die einzelnen laengen
y1,y2 : longint;
Ecke : real; //ergebnis
begin
x1 := Figur.Dreieck_Daten[1].X - Figur.Dreieck_Daten[2].X;
y1 := Figur.Dreieck_Daten[1].Y - Figur.Dreieck_Daten[2].Y;
x2 := Figur.Dreieck_Daten[3].X - Figur.Dreieck_Daten[2].X;
y2 := Figur.Dreieck_Daten[3].Y - Figur.Dreieck_Daten[2].Y;
LaengeVA := sqrt(sqr(x1) + sqr(y1)); // <--------
LaengeVB := sqrt(sqr(x2) + sqr(y2));
VektA_VektB := x1 * x2 + y1 *y2;
Ecke := arccos(VektA_VektB / (LaengeVA * LaengeVB));
if Ecke <> 0 then DrawDreieck := true;
end;
Problem ist in der Zeile mit Pfeil. gibt n Fehler "integerüberlauf" aus
was kann man da tun?
als zugabe - Typen definitionen:
Delphi-Quellcode:
type
TRechteck = record
P1 , // Eckpunkte des Rechtecks
P2 : TPoint;
end;
TKreis = record
Aussenpunkt : TPoint; // Eckpunkt des "Quadrats" in das
Durchmesser : integer; // der Kreis gezeichnet wird
end; // die Kantenlänge dieses Quadrates
TDreieck = array[1..3] of TPoint; // Drei Eckpunkte des Dreiecks
TFigurentyp = (Rechteck,Kreis,Dreieck);
TFigur = record // Varianter Record
pen : TColor;
brush : TColor;
case Figurentyp : TFigurentyp of
Rechteck : (Rechteck_Daten : TRechteck);
Kreis : (Kreis_Daten : TKreis);
Dreieck : (Dreieck_Daten : TDreieck);
end;