Получение угла прямой относительно Ох

09.11.2009
665
1
#1
Всё время выбивает ошибку(надо найти угол наклона прямой относительно Ох)
Код:
function getanglefromline(p1,p2:Tpoint):integer;
var s:string;
angle:extended;
begin
angle:=0;
if (p1.X=0)or(p2.X=0) then exit;
if p1.X<>p2.X then
begin
angle:=ArcCos((sqrt(sqr(p1.X-p2.X)+sqr(p1.Y-p2.Y)))/(p1.X- p2.X)); //тут выдает ошибку Invalid floating poin operation
//че я тут написал:	  акосинус( корень арифметический(длина отрезка)/катет )
angle:=RadToDeg(angle);
end;
getanglefromline:=round(angle);
end;
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#2
МБ поставить double вместо екстендед?
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#4
а какой тип надо передавать вовнутрь арккосинуса? что в справке написано?
 
09.11.2009
665
1
#5
function ArcCos ( const Number : Extended ) : Extended;

Добавлено: Судя по всему глюк именно с ArcCos, я подставлял любые числа(81/70) е ему всеравно не нравилось, а если подставить 0.5 то все норм.
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#6
Блин, волбщем так. Разбей все по действиям отдельно. Т.е. каждое действие в свою переменную, и посмотрим на какой операции оно упадет..
 
09.11.2009
665
1
#7
Вот тут все нормально работает
Сделано для получения с канваса(оси Ох и Оу другие)
Код:
function getanglefromline(p1,p2:Tpoint):integer;
var g,k,angle:single;
begin
angle:=0;
k:=0;
k:=0;
g:=sqrt(sqr(p1.X-p2.X)+sqr(p2.Y-p1.Y));
k:=p2.X-p1.X;
if k=0 then k:=1;

angle:=k/g;
angle:= trunc(angle*1000)/1000;
angle:=ArcCos(angle);
angle:=radtodeg(angle);
if p2.Y>p1.Y then angle:=-angle;
getanglefromline:=round(angle);
end;

Добавлено: Просто была допущена небольшая ошибочка(надо катет делить на гипотенузу а не наоборот)