программа для определения, принадлежит ли точка треугольнику. алгоритм таков: вычисляются все 4 площади ("основного" треугольника и трех "маленьких" треугольников, которые получаются, если брать попарно 2 вершини "основного" треугольника и данную точку), потом проверяется, равна ли сумма площадей трех "маленьких" треугольников площади "основного". если да--точка принадлежит.
в чем загвоздка. Паскаль почему-то при суммировании трех "мал." площадей где-то берет какую-то долю (в рамках 0.000000000001). что не так?
вот сама программа:
var xa,ya,xb,yb,xc,yc,xo,yo,ab,bc,ac,ao,bo,co,s_abc,s_aob,s_boc,s_aoc:real;
function len(x1,y1,x2,y2:real):real;
begin
len:=sqrt(sqr(x2-x1)+sqr(y2-y1));
end;
function plowa(a,b,c:real):real;
var p:real;
begin
p:=a+b+c;
p:=p/2;
p:=p*(p-a)*(p-b)*(p-c);
plowa:=sqrt(p);
end;
begin
readln(xo,yo,xa,ya,xb,yb,xc,yc);
ab:=len(xa,ya,xb,yb);
bc:=len(xb,yb,xc,yc);
ac:=len(xa,ya,xc,yc);
ao:=len(xa,ya,xo,yo);
bo:=len(xb,yb,xo,yo);
co:=len(xo,yo,xc,yc);
s_abc:=plowa(ab,ac,bc);
s_aob:=plowa(ab,ao,bo);
s_boc:=plowa(bo,co,bc);
s_aoc:=plowa(ao,co,ac);
if s_aob+s_aoc+s_boc=s_abc then writeln(1)
else writeln(0);
end.
пример: входные данные -- 1 1 -1 0 2 4 4 1
результат -- 0, а должно быть 1.
я проверяла -- дописывала строку writeln(s_aob+s_aoc+s_boc); --программа выводила 8.50000000000001, а должно быть, по идее, 8.5
подскажите, пожалуйста, где тут ошибка?
Примечание:
этот алгоритм тоже имеет право на существование:))
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.