Алгоритм закрашивания полигона.
Алгоритм, определяющий видимые и невидимые линии
![Реферат: Алгоритм закрашивания полигона. Алгоритм, определяющий видимые и невидимые линии](https://gugn.ru/work/6757236/cover.png)
Для каждой грани при инициализации объекта нужно посчитать вектор нормали, привести к единичной длине и сохранить его координаты в структуре соответствующей грани. Кроме того, при каждом повороте сцены векторы нормали нужно тоже пересчитывать (но перспективную проекцию находить не следует). А так как через три точки всегда можно провести плоскость (притом только одну) и число уравнений данной… Читать ещё >
Алгоритм закрашивания полигона. Алгоритм, определяющий видимые и невидимые линии (реферат, курсовая, диплом, контрольная)
Нахождение нормали по трем точкам
Пусть заданы три точки (т.к. через любые три точки можно провести плоскость), например A, B, C. Уравнение плоскости задается в виде:
nx x + ny y + nz z + d=0,.
где (nx, ny, nz) — координаты нормали к плоскости.
Получим систему уравнений:
nxx + nyy + nzz + d = 0.
nxA.x + nyA. y + nzA. z + d = 0.
nxB.x + nyB. y + nzB. z + d = 0.
nxC.x + nyC. y + nzC. z + d = 0.
В виде матрицы такая система запишется как:
|| xyz 1 ||.
|| A.xA.yA.z 1 ||.
|| B.xB.yB.z 1 || = 0.
|| C.xC.yC.z 1 ||.
Определитель будет равен (относительно первой строки):
|A.yA.z 1| |A.xA.z 1| |A.xA.y 1| |A.xA.y 1|.
x |B.yB.z 1| - y |B.xB.z 1| + z |B.xB.y 1| - |B.xB.y 1|.
|C.yC.z 1| |C.xC.z 1| |C.xC.y 1| |C.xC.y 1|.
А так как через три точки всегда можно провести плоскость (притом только одну) и число уравнений данной системы равно числу неизвестных, следовательно, система имеет нетривиальное решение (кроме очевидногоnx=ny=nz=d=0). Следовательно, определитель данной матрицы равен нулю.
Получаем:
|A.yA.z 1|.
nx = |B.yB.z 1|,.
|C.yC.z 1|.
|A.xA.z 1|.
ny = |B.xB.z 1|,.
|C.xC.z 1|.
|A.xA.y 1|.
nx = |B.xB.y 1|.
|C.xC.y 1|.
Рассмотрим нахождение значения nx (остальные координаты получаются аналогично):
nx = A. y |B.z 1| - A. z |B.y 1| + |B.yB.z| =.
|C.z 1| |C.y 1| |C.yC.z|.
= A. y (B.z — C. z) — A. z (B.y — C. y) + (B.yC.z — B.zC.y) =.
= A. y (B.z — C. z) + B. y (C.z — A. z) + C. y (A.z — B. z).
Итак, координаты вектора нормали:
nx = A. y (B.z — C. z) + B. y (C.z — A. z) + C. y (A.z — B. z).
ny = A. z (B.x — C. x) + B. z (C.x — A. x) + C. z (A.x — B. x) (10).
nz = A. x (B.y — C. y) + B. x (C.y — A. y) + C. x (A.y — B. y).
Для каждой грани при инициализации объекта нужно посчитать вектор нормали, привести к единичной длине и сохранить его координаты в структуре соответствующей грани. Кроме того, при каждом повороте сцены векторы нормали нужно тоже пересчитывать (но перспективную проекцию находить не следует).