Ђ‹вЂ‹ліній і поверхонь.
Алгоритм Робертса
Алгоритм Робертса видаляє з кожного тіла ті ребра або грані, які ховаються самим тілом. Потім кожне з видимих ​​ребер кожного тіла порівнюється з кожним з решти тіл визначення того, яка його частина або частини, якщо такі є, ховаються цими тілами. При цьому обчислювальна трудомісткість алгоритму Робертса зростає теоретично, як квадрат числа об'єктів. При цьому математичні методи, використовувані в цьому алгоритмі, прості, потужні і точні. p> Алгоритм плаваючого горизонту
Алгоритм плаваючого горизонту найчастіше за все використовується для видалення невидимих ​​ліній тривимірного представлення функцій, що описують поверхню у вигляді F (x, у, z) = 0.
Ідея методу полягає в зведенні тривимірної задачі до двовимірної шляхом перетину вихідної поверхні послідовністю паралельних січних площин, мають постійні значення координати z . тривимірний октаедр гексаедр програма
Алгоритм спочатку впорядковує площині z = const за зростанням відстані до них від точки спостереження. Потім для кожної площині, починаючи із найближчого до точки спостереження, будується крива, що на ній, тобто для кожного значення координати х в просторі зображення визначається відповідне значення y . p> Якщо на поточному площині при деякому заданому значенні x відповідне значення у на кривою більше значення y для всіх попередніх кривих у цьому значенні x , то поточна крива видимою у цій точці; в іншому випадку вона невидима.
Використовуючи вищевикладений математичний апарат, можна скласти наступну програму на мові програмування Turbo Pascal.
Лістинг програми:
ROGRAM HEXAEDR; Crt, Graph;
VAR Gd, Gm: Integer; {Змінні для роботи в графічному режимі}: array [1 .. 8, 1 .. 3] of real; {Масив з координатами вершин}: array [1 .. 8, 1. .2] of integer; {Масив з координатами вершин у проекції}
grani: array [1 .. 6, 1 .. 4] of integer; {Масив граней гексаедр}
i, j: integer; {Циклові змінні}: char; {Значення натиснутоюклавіші} Projectiya; {Розрахунок координат проекції} UgolX = 26.5 * Pi/180; {Кут обертання навколо осі X} = 26.5 * Pi/180; {Кут обертання навколо осі Y}
BEGINi: = 1 To 8 Do boolean; {Визначення видимості i-й грані} V1, V2, N: array [1 .. 3] of real;
scalar: real;
{Розрахунок значень 2-х векторів, що лежать в площині грані}
For j: = 1 To 3 Do Begin [j]: = hex [grani [i, 2], j]-hex [grani [i, 1], j]; [j]: = hex [grani [ i, 3], j]-hex [grani [i, 1], j];
End;
{Обчислення вектора нормалі грані}
N [1]: = V1 [2] * V2 [3]-V2 [2] * V1 [3]; [2]: = V1 [3] * V2 [1]-V2 [3] * V1 [1];
N [3]: = V1 [1] * V2 [2]-V2 [1] * V1 [2];
{Визначення видимості грані}
scalar: = N [1]-N [2]-N [3]; scalar> 0 Then: = true: = false;; Draw; {Виве...