Самоучитель по 3dsmax 7

         

Рисуем этот отрезок, повторяем процедуру для каждой строки - и вуаля, трегуольник нарисован


Рисуем этот отрезок, повторяем процедуру для каждой строки - и вуаля, трегуольник нарисован.

Остановимся более подробно на нахождении пересечения прямой 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)

Вот, в общем-то, и все. Для других сторон пересечение ищется совершенно точно так же. А вот и пример кода. // ... // здесь сортируем вершины (A,B,C) // ... for (sy = A.y; sy x2) { tmp = x1; x1 = x2; x2 = tmp; } drawHorizontalLine(sy, x1, x2); } // ...

Надо, правда, защититься от случая, когда B.y = C.y - в этом (и только этом, потому как если C.y = A.y, то треугольник пустой и рисовать его не стоит, или можно рисовать горизонтальную линию; а если B.y = A.y, то sy >= A.y и до деления на B.y - A.y не дойдет) случае произойдет попытка деления на ноль. Код изменится совсем чуть-чуть: // ... // здесь сортируем вершины (A,B,C) // ... for (sy = A.y; sy x2) { tmp = x1; x1 = x2; x2 = tmp; } drawHorizontalLine(sy, x1, x2); } // ...

Вот и все. Ну, горизонтальную линию, надеюсь, нарисовать сумеют все желающие.

Содержание раздела