Определение углов в треугольнике
По введенным координатам вершин треугольника (которые записаны в файл coord.txt), считаются длины сторон и углы треугольника, но только в том случае считаются углы, когда треугольник не равносторонний, не прямоугольный и не равнобедренный. Далее вид треугольника записывается в отдельный файл VidTrg.txt.
Alfa у меня постоянно получается по нулям, а gamma почти всегда отрицательный или неверно посчитан.
Ниже код.
Что тут не так?
Program VID_TRG;
var x1,y1,z1,x2,y2,z2,x3,y3,z3:real;
d1,d2,d3:real;
f:text;
f1:text;
s:string;
alfa,beta,gamma:real;
function arccos(x:real):real;
begin
arccos:=arctan(sqrt(1-sqr(x))/x);
end;
begin
assign (f,'coord.txt');
reset (f);
d1:=0; d2:=0; d3:=0;
while not eof(f) do
begin
read (f,x1,y1,z1,x2,y2,z2,x3,y3,z3);
d1:=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1));
d2:=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)+(z3-z2)*(z3-z2));
d3:=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)+(z1-z3)*(z1-z3));
d1:=round(d1*10)/10;
d2:=round(d2*10)/10;
d3:=round(d3*10)/10;
writeln (d1:0:2,' ',d2:0:2,' ',d3:0:2);
if ((d1+d2>d3) and (d2+d3>d1) and (d1+d3>d2)) then
begin
if (d1=d2) and (d2=d3) then
s:='treygolnik ravnostoronniy';
writeln(s);
if ((d1=d2) or (d1=d3) or (d2=d3)) and ((d1<>d2) or (d1<>d3) or (d2<>d3)) then
s:='treygolnik ravnobedrenniy';
writeln(s);
if ((d1*d1)=(d2*d2)+(d3*d3)) or ((d2*d2)=(d1*d1)+(d3*d3)) or ((d3*d3)=(d1*d1)+(d3*d3)) then
s:='treygolnik pryamoygolniy';
writeln(s);
if ((d1<>d2) and (d2<>d3) and (d3<>d1)) then
alfa:= (arccos((sqr(d2)+sqr(d3)-sqr(d1))/(2*d2*d3)))*(180/pi);
beta:= (arccos((sqr(d1)+sqr(d3)-sqr(d2))/(2*d1*d3)))*(180/pi);
gamma:= (arccos((sqr(d1)+sqr(d2)-sqr(d3))/(2*d1*d2)))*(180/pi);
writeln('Alfa = ',alfa:0:3);
writeln('Beta = ',beta:0:3);
writeln('Gamma = ',gamma:0:3);
if (alfa>90) or (beta>90) or (gamma>90) then
s:='tupougolniy'
else
s:='ostrougolniy';
end
else s:='treygolnik ne suchesvuet!';
writeln(s);
assign(f1,'VidTrg.txt');
rewrite(f1);
write(f1,s);
close(f1);
end;
close (f);
readln;
end.
По введенным координатам вершин треугольника (которые записаны в файл coord.txt), считаются длины сторон и углы треугольника, но только в том случае считаются углы, когда треугольник не равносторонний, не прямоугольный и не равнобедренный. Далее вид треугольника записывается в отдельный файл VidTrg.txt.
Alfa у меня постоянно получается по нулям, а gamma почти всегда отрицательный или неверно посчитан.
Ниже код.
Что тут не так?
Program VID_TRG;
var x1,y1,z1,x2,y2,z2,x3,y3,z3:real;
d1,d2,d3:real;
f:text;
f1:text;
s:string;
alfa,beta,gamma:real;
function arccos(x:real):real;
begin
arccos:=arctan(sqrt(1-sqr(x))/x);
end;
begin
assign (f,'coord.txt');
reset (f);
d1:=0; d2:=0; d3:=0;
while not eof(f) do
begin
read (f,x1,y1,z1,x2,y2,z2,x3,y3,z3);
d1:=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1));
d2:=sqrt((x3-x2)*(x3-x2)+(y3-y2)*(y3-y2)+(z3-z2)*(z3-z2));
d3:=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3)+(z1-z3)*(z1-z3));
d1:=round(d1*10)/10;
d2:=round(d2*10)/10;
d3:=round(d3*10)/10;
writeln (d1:0:2,' ',d2:0:2,' ',d3:0:2);
if ((d1+d2>d3) and (d2+d3>d1) and (d1+d3>d2)) then
begin
if (d1=d2) and (d2=d3) then
s:='treygolnik ravnostoronniy';
writeln(s);
if ((d1=d2) or (d1=d3) or (d2=d3)) and ((d1<>d2) or (d1<>d3) or (d2<>d3)) then
s:='treygolnik ravnobedrenniy';
writeln(s);
if ((d1*d1)=(d2*d2)+(d3*d3)) or ((d2*d2)=(d1*d1)+(d3*d3)) or ((d3*d3)=(d1*d1)+(d3*d3)) then
s:='treygolnik pryamoygolniy';
writeln(s);
if ((d1<>d2) and (d2<>d3) and (d3<>d1)) then
alfa:= (arccos((sqr(d2)+sqr(d3)-sqr(d1))/(2*d2*d3)))*(180/pi);
beta:= (arccos((sqr(d1)+sqr(d3)-sqr(d2))/(2*d1*d3)))*(180/pi);
gamma:= (arccos((sqr(d1)+sqr(d2)-sqr(d3))/(2*d1*d2)))*(180/pi);
writeln('Alfa = ',alfa:0:3);
writeln('Beta = ',beta:0:3);
writeln('Gamma = ',gamma:0:3);
if (alfa>90) or (beta>90) or (gamma>90) then
s:='tupougolniy'
else
s:='ostrougolniy';
end
else s:='treygolnik ne suchesvuet!';
writeln(s);
assign(f1,'VidTrg.txt');
rewrite(f1);
write(f1,s);
close(f1);
end;
close (f);
readln;
end.