Повернення об’єктів, DelphiSite
Найбільш читане
Повернення об'єктів
Тут я хотів би розповісти не про те, як працювати з DelphiX, OpenGL або Direct, а про те, як можна обертати багатогранники за допомогою простих дій: moveto і lineto. Тут розглянемо приклад обертання куба. Малюватимемо на Canvase (наприклад Listbox). Спочатку намалюємо квадрат, що вирішується (точніше 2 квадрати і з'єднаємо їх). Нехай q – кут повороту квадрата, який ми малюємо. Вочевидь, що треба задати координати вершин квадрата - a:array [1..5,1..2] of integer. 1..4+1 – кількість вершин квадрата (чому +1 буде пояснено пізніше). 1..2 - координата по X і Y. Хто навчався у школі, напевно пам'ятає, що рівняння кола: X^2+Y^2=R^2, хто добре навчався у школі, можливо згадає рівняння еліпса: (X^2 )/(a^2)+ (Y^2)/(b^2)=1. Але це нам не треба. Нам знадобиться рівняння еліпса в полярних координатах: x = a * sin (t); y=a*cos(t);t=0..2*PI; (Учні університетів та інститутів тріумфують). За допомогою цього рівняння ми заповнюємо масив з координатами.
for i:= 1 to 5 do
// координата Х; q+i*pi/2 - кут повороту
// i-тої вершини квадрата.
a [i, 1]: = trunc (80 * sin (q + i * pi / 2));
// координата Y; знак мінус - тому що координати
// зважають з верхнього лівого кута
a [i, 1]: = trunc (-30 * cos (q + i * pi / 2));
for i:= 1 to 4 do
moveto (100 + a [i, 1], 50 + a [i, 2]); //Встаємо на i-у точку квадрата.
lineto (100+a[i+1, 1], 50+a[i+1,2]); //Малюємо лінію до i + 1-ої точки.
Ось чому array[1..5,1..2], інакше - вихід за межі. end; Потім малюємо другий такий самий квадрат, але нижче (або вище). З'єднуємо лініями перший із другим:
for i:= 1 to 4 do
moveto (100 + a [i, 1], 50 + a [i, 2]);
lineto (100 + a [i, 1], 130 + a [i, 2]);
Залишилося очистити Listbox, збільшити q і зробити спочатку. Всі. Можна також приховувати невидимі лінії - коли q знаходиться у певному інтервалі. Також можна покрутитися: повернути куб в іншій площині - поворот осей (для тих, хто знає формулу).