Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вращение куба, Расчет градусов положения куба 
:(
    Опции темы
14SatanA88
Дата 27.1.2012, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: 2
Всего: 5



Доброго времени суток, уважаемые программеры.

Рисую на канве куб. Нужно научить его поворачиваться исходя из координат клика.
В геометрии не силен, потому обращаюсь к вам.

Вот сам проект по кускам:
Код

type
  TVertex = record
    x,y,z: Single;
  end;
  TFace = array [0..3] of Integer;
//
const
  Scale: Single = 50; 
  CubeVertices: array [0..7] of TVertex =
  ((x:-1; y:-1; z:-1),
   (x: 1; y:-1; z:-1),
   (x: 1; y: 1; z:-1),
   (x:-1; y: 1; z:-1),
   (x:-1; y:-1; z: 1),
   (x: 1; y:-1; z: 1),
   (x: 1; y: 1; z: 1),
   (x:-1; y: 1; z: 1));
  CubeFaces: array [0..5] of TFace =
  ((0,1,2,3),
   (4,5,6,7),
   (0,4,7,3),
   (1,5,6,2),
   (3,7,6,2),
   (0,4,5,1));
  CubeFacesNormals: array [0..5] of TVertex =
  ((x: 0; y: 0; z: 1),
   (x: 0; y: 0; z:-1),
   (x: 1; y: 0; z: 0),
   (x:-1; y: 0; z: 0),
   (x: 0; y:-1; z: 0),
   (x: 0; y: 1; z: 0));
//
var
  ProjectedVertices : array [0..7] of TPoint;
  x,y,z: integer;


Эта процедура рисует куб:
Код

procedure Cube(XAngle, YAngle, ZAngle : Single);
var
  i, j: integer;
  tmp: Single;
  p: array [0..3] of TPoint;
begin

  XAngle:=DegToRad(XAngle);
  YAngle:=DegToRad(YAngle);
  ZAngle:=DegToRad(ZAngle);

  for i := 0 to 7 do
    with CubeVertices[i] do
      begin
        tmp := x;
        x := x * cos(XAngle) - y * sin(XAngle);
        y := tmp * sin(XAngle) + y * cos(XAngle);
        tmp := y;
        y := y * cos(YAngle) - z * sin(YAngle);
        z := tmp * sin(YAngle) + z * cos(YAngle);
        tmp := z;
        z := z * cos(ZAngle) - x * sin(ZAngle);
        x := tmp * sin(ZAngle) + x * cos(ZAngle);
        tmp := MainForm.ClientWidth / (MainForm.ClientWidth + z * Scale);
        ProjectedVertices[i].X := Round((MainForm.ClientWidth / 2) + x * tmp * Scale);
        ProjectedVertices[i].Y := Round((MainForm.ClientHeight / 2) + y * tmp * Scale);
      end;
  for i := 0 to 5 do
    with CubeFacesNormals[i] do
      begin
        tmp := x;
        x := x * cos(XAngle) - y * sin(XAngle);
        y := tmp * sin(XAngle) + y * cos(XAngle);
        tmp := y;
        y := y * cos(YAngle) - z * sin(YAngle);
        z := tmp * sin(YAngle) + z * cos(YAngle);
        tmp := z;
        z := z * cos(ZAngle) - x * sin(ZAngle);
        x := tmp * sin(ZAngle) + x * cos(ZAngle);
      end;
  PatBlt(MainForm.Canvas.Handle, 0, 0, MainForm.ClientWidth, MainForm.ClientHeight, BLACKNESS);
  for i := 0 to 5 do if CubeFacesNormals[i].z > 0
  then begin
    for j := 0 to 3 do p[j] := ProjectedVertices[CubeFaces[i][j]];
    MainForm.Canvas.Polygon(p);
  end;
      
end;


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

Сам проект в аттаче.
Заранее огромное спасибо.

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  cube.rar 77,96 Kb
PM MAIL ICQ   Вверх
northener
Дата 28.1.2012, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(14SatanA88 @  27.1.2012,  21:15 Найти цитируемый пост)
В геометрии не силен, потому обращаюсь к вам.


Цитата(14SatanA88 @  27.1.2012,  21:15 Найти цитируемый пост)
В общем-то все уже написано

И как жаль, что в И-нете не смог найти последний кусок кода.  smile 


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
14SatanA88
Дата 28.1.2012, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: 2
Всего: 5



Цитата(northener @  28.1.2012,  01:35 Найти цитируемый пост)
И как жаль, что в И-нете не смог найти последний кусок кода

так точно )
но это к теме не относится
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0417 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.