Определить: лежит точка в треугольнике - QBasic
Формулировка задачи:
Мне уже два или три раза попадались задачи, где прямо
или косвенно требовалось определить: лежит точка в
треугольнике или нет. Ответы были половинчатыми и
даже мой собственный ответ мне не понравился. И вот
здесь, я решил раз и навсегда дать четкий ответ на этот
вопрос. Итак нам задан треугольник с координатами
вершин (x1;y1), (x2;y2), (x3;y3) и точка (x4;y4).
Требуется определить положение точки относительно
треугольника.
Предположим, что точка лежит внутри треугольника.
Соединим эту точку с любой вершиной треугольника.
Тогда мы можем составить два уравнения прямой
1-я прямая проходит через вершину треугольника и
заданную точку. 2-я прямая сторона, которую пересекает
1-я прямая. Вот их уравнения:
(x - x1)/(x4 - x1) = (y - y1)/(y4 - y1)
(x - x2)/(x3 - x2) = (y - y2)/(y3 - y2)
Найдем точку пересечения этих прямых:
(дополнительно введем обозначения)
A = (y4 - y1)/(x4 - x1)
B = (y3 - y2)/(x3 - x2)
и далее имеем систему
y = A(x - x1) + y1
y = B(x - x2) + y2
решая ее получим
x = (A*x1 - B*x2 + y2 + y1)/(A - B)
y = A(x - x1) + y1
(пусть C - вершина треугольника, D - точка,
E - найденная нами точка пересечения)
Теперь надо убедиться, что выполняется равенство:
CD + DE = CE (!!!)
И САМОЕ ГЛАВНОЕ:
если вы думаете, что все уже сделано, то ошибаетесь
Надо ВСЕ вычисления провторить для КАЖДОЙ ВЕРШИНЫ !
Я привожу вам кристально чистое и логически корректное решение
Перед красотой этого кода вздрогнет сердце программиста
(если он настоящий программист (от бога !!))
P.S.
Дарю вам этот код и Радость грядущего лета впридачу!
P.P.S.
как я рад, что кому-то помог
Решение задачи: «Определить: лежит точка в треугольнике»
textual
Листинг программы
DECLARE FUNCTION s (x1, y1, x2, y2, x, y) INPUT "#1 - ", x1, y1 INPUT "#2 - ", x2, y2 INPUT "#3 - ", x3, y3 INPUT "#4 - ", x4, y4 side1=(s(x1, y1, x2, y2, x3, y3)=s(x1, y1, x2, y2, x4, y4)) 'проверка на одностороннее положение (относительно side2=(s(x2, y2, x3, y3, x1, y1)=s(x2, y2, x3, y3, x4, y4)) 'проверяемой стороны) данной точки и точек треугольника, side3=(s(x1, y1, x2, y2, x3, y3)=s(x1, y1, x2, y2, x4, y4)) 'не лежащих на проверяемой стороне IF side1 AND side2 AND side3 THEN PRINT "in the triangle" ELSE PRINT "not in triangle" 'если все всё по одну сторону, то true END FUNCTION s (x1, y1, x2, y2, x, y) k=(y2-y1)/(x2-x1) 'вычисление линейного уравнения стороны b=y1-k*x1 s=x*k+b<y 'выше ли точка относительно стороны IF x2=x1 THEN s=x<x1 'если сторона вертикальна, то проверка: левее ли точка относительно стороны END FUNCTION
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д