Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  4 659

•  TDictionary Custom Sort  6 662

•  Fast Watermark Sources  6 445

•  3D Designer  9 379

•  Sik Screen Capture  6 776

•  Patch Maker  7 183

•  Айболит (remote control)  7 176

•  ListBox Drag & Drop  6 028

•  Доска для игры Реверси  97 643

•  Графические эффекты  7 350

•  Рисование по маске  6 649

•  Перетаскивание изображений  5 506

•  Canvas Drawing  5 890

•  Рисование Луны  5 630

•  Поворот изображения  5 119

•  Рисование стержней  3 709

•  Paint on Shape  2 925

•  Генератор кроссвордов  3 828

•  Головоломка Paletto  3 066

•  Теорема Монжа об окружностях  3 877

•  Пазл Numbrix  2 552

•  Заборы и коммивояжеры  3 288

•  Игра HIP  2 255

•  Игра Go (Го)  2 179

•  Симулятор лифта  2 570

•  Программа укладки плитки  2 188

•  Генератор лабиринта  2 689

•  Проверка числового ввода  2 338

•  HEX View  2 674

•  Физический маятник  2 321

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Вращение объектов



Автор: Айткулов Павел

Здесь я бы хотел рассказать не о том, как работать с 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
begin
  // координата по Х; 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));
end;

Сейчас будем рисовать квадрат:


for i:=1 to 4 do
begin
  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
begin
  moveto(100+a[i,1],50+a[i,2]);
  lineto(100+a[i,1],130+a[i,2]);
end;

Осталось очистить Listbox, увеличить q и сделать сначала. Все!!!

Можно также скрывать невидимые линии - когда q находится в определенном интервале. Также можно поизвращаться: повернуть куб в другой плоскости - поворот осей(для тех, кто знает формулу).








Copyright © 2004-2025 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте