Въртящи се обекти, DelphiSite
Най-четени
Въртящи се обекти
Тук бих искал да говоря не за това как да работя с DelphiX, OpenGL или Direct, а за това как можете да завъртите полиедри с помощта на прости действия: moveto и lineto. Тук ще разгледаме пример за въртене на куб. Ще рисуваме върху Canvas (например Listbox). Първо, нека начертаем въртящ се квадрат (по-точно 2 квадрата и да ги свържем). Нека q е ъгълът на завъртане на квадрата, който чертаем. Очевидно трябва да зададем координатите на квадратните върхове - a:array [1..5,1..2] от цяло число. 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; (радват се студенти от университети и институти). С помощта на това уравнение попълваме масив с координати.
за i:= 1 до 5 направи
// X координата; 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 ) ) ;
за i:= 1 до 4 направи
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], иначе - извън границите. край; След това нарисувайте втори квадрат от същия тип, но по-нисък (или по-висок). Свързваме първия с втория с линии:
за i:= 1 до 4 направи
moveto (100 + a [i, 1], 50 + a [i, 2]);
lineto (100 +a [i, 1], 130 +a [i, 2]);
Остава да изчистите списъка, да увеличите q и да го направите отначало. Всичко. Можете също да скриете скрити линии - когато q е в определен интервал. Можете също да извратите: завъртете куба в друга равнина - завъртете осите (за тези, които знаят формулата).