Отсортируем вершины так, чтобы вершина A была верхней, C - нижней, тогда у нас min_y = A.y, max_y = C.y, и нам надо пройтись по всем линиям от min_y до max_y. Рассмотрим какую-то линию sy, A.y <= sy <= C.y. Если sy < B.y, то она пересекает стороны AB и AC; если sy >= B.y - то стороны BC и AC. Мы знаем координаты всех вершин, поэтому мы можем написать уравнения сторон и найти пересечение нужной стороны с прямой y = sy. Получим два конца отрезка. Так как мы не знаем, какой из них левый, а какой правый, сравним их координаты по x и обменяем значения, если надо. Рисуем этот отрезок, повторяем процедуру для каждой строки - и вуаля, трегуольник нарисован.
Остановимся более подробно на нахождении пересечения прямой y = sy (текущей строки) и стороны треугольника, например AB. Напишем уравнение прямой AB в форме x = k*y+b:
x = A.x+(y-A.y)*(B.x-A.x)/(B.y-A.y)
Подставляем сюда известное для текущей прямой значение y = sy:
x = A.x+(sy-A.y)*(B.x-A.x)/(B.y-A.y)
Вот, в общем-то, и все. Для других сторон пересечение ищется совершенно точно так же. А вот и пример кода.
Надо, правда, защититься от случая, когда B.y = C.y - в этом (и только этом, потому как если C.y = A.y, то треугольник пустой и рисовать его не стоит, или можно рисовать горизонтальную линию; а если B.y = A.y, то sy >= A.y и до деления на B.y - A.y не дойдет) случае произойдет попытка деления на ноль. Код изменится совсем чуть-чуть:
1) Сложить углы под которыми видны стороны треугольника из точки, если 360 градусов, то точка внутри
2) Построить на треугольнике параллелограмм, проверить принадлежность параллелограмму, провести отрезок через точку, параллельный стороне и равный ей, проверить в какой его половине лежит точка.
3) По площади треугольников, только не через формулу Герона, а через матричный вид:
По-моему, ответ №13 способ 2 самый лучший. Простой и эффективный. Пишется короче всех. И никакой сортировки не надо.
Function VMul(byval dx1 as double, byval dy1 as double, _
byval dx2 as double, byval dy2 as double) as double
vmul=dx1*dy2-dx2*dy1
End function
Function InTriangle(byval x as double, byval y as double) as boolean
intriangle=abs(sgn(vmul(x2-x1,y2-y1,x-x1,y-y1)) + _
sgn(vmul(x3-x2,y3-y2,x-x2,y-y2)) + _
sgn(vmul(x1-x3,y1-y3,x-x3,y-y3)))=3
End function