Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 22.05.2010, 19:45   #1
vandrouny
Пользователь
 
Регистрация: 23.04.2009
Адрес: Минск
Сообщений: 42
Репутация: 10
По умолчанию Вращение фигуры

Добрый день!
Пишу программу, которая бы вращала треугольную призму. Проекция аксонометрическая, изометрия.
Для того, чтобы спроецировать фигуру, исходные координаты умножаю на матрицу
Код:

Rpp[1][1]:=0.71; Rpp[2][1]:=0;    Rpp[3][1]:=0.71; 
Rpp[1][2]:=0.41; Rpp[2][2]:=0.82; Rpp[3][2]:=-0.41;
Rpp[1][3]:=0;    Rpp[2][3]:=0;    Rpp[3][3]:=0;

Всё проходит хорошо.
Затем умножаю на матрицу поворота на альфа градусов относительно оси Y.
Код:

Ralpha[1][1]:=cos(alpha); Ralpha[2][1]:=0;    Ralpha[3][1]:=-sin(alpha);
Ralpha[1][2]:=0;          Ralpha[2][2]:=1;    Ralpha[3][2]:=0;
Ralpha[1][3]:=sin(alpha); Ralpha[2][3]:=0;    Ralpha[3][3]:=cos(alpha);

И оно в итоге вращается, но вращается относительно оси, которая вверху окна - и поэтому половина всего вращения выходит выше экрана. Как переместить ось вращения в центр экрана?

Весь код программы:
Код:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;

    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  F0: array [1..3] of array [1..6] of integer;
  {начальная фигура}

  F1: array [1..3] of array [1..6] of integer;
  {спроецированная}

  F2: array [1..3] of array [1..6] of integer;
  {вращающаяся}


  Rpp: array [1..3] of array [1..3] of real; {матрица проецирования}

  Ralpha: array [1..3] of array [1..3] of real; {матрица поворота}
  alpha:real;

implementation

{$R *.dfm}

{проецируем}
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
for i:=1 to 3 do
  for j:=1 to 6 do
    begin
   F1[i][j]:=Round(F0[1][j]*Rpp[i][1]+ F0[2][j]*Rpp[i][2]+ F0[3][j]*Rpp[i][3]);
    end;

{рисуем}
Form1.Canvas.MoveTo(F1[2][1],F1[1][1]);
Form1.Canvas.LineTo(F1[2][2],F1[1][2]);
Form1.Canvas.LineTo(F1[2][3],F1[1][3]);
Form1.Canvas.LineTo(F1[2][1],F1[1][1]);
Form1.Canvas.MoveTo(F1[2][4],F1[1][4]);
Form1.Canvas.LineTo(F1[2][5],F1[1][5]);
Form1.Canvas.LineTo(F1[2][6],F1[1][6]);
Form1.Canvas.LineTo(F1[2][4],F1[1][4]);
Form1.Canvas.MoveTo(F1[2][3],F1[1][3]);
Form1.Canvas.LineTo(F1[2][6],F1[1][6]);
Form1.Canvas.MoveTo(F1[2][1],F1[1][1]);
Form1.Canvas.LineTo(F1[2][4],F1[1][4]);
Form1.Canvas.MoveTo(F1[2][2],F1[1][2]);
Form1.Canvas.LineTo(F1[2][5],F1[1][5]);


end;

procedure TForm1.Button2Click(Sender: TObject);
var i,j,k:integer;
begin

for j:=1 to 380 do
begin

alpha:=alpha+PI/60;

{матрица поворота}
Ralpha[1][1]:=cos(alpha); Ralpha[2][1]:=0;    Ralpha[3][1]:=-sin(alpha);
Ralpha[1][2]:=0;          Ralpha[2][2]:=1;    Ralpha[3][2]:=0;
Ralpha[1][3]:=sin(alpha); Ralpha[2][3]:=0;    Ralpha[3][3]:=cos(alpha);

{поворачиваем}

for k:=1 to 6 do
for i:=1 to 3 do
   begin
   F2[i][k]:=Round((F1[1][k])*Ralpha[i][1]+ F1[2][k]*Ralpha[i][2]+ F1[3][k]*Ralpha[i][3]);
    end;


{рисуем повёрнутое}
form1.canvas.Pen.Color:=clblack;
Form1.Canvas.MoveTo(F2[2][1],F2[1][1]);
Form1.Canvas.LineTo(F2[2][2],F2[1][2]);
Form1.Canvas.LineTo(F2[2][3],F2[1][3]);
Form1.Canvas.LineTo(F2[2][1],F2[1][1]);
Form1.Canvas.MoveTo(F2[2][4],F2[1][4]);
Form1.Canvas.LineTo(F2[2][5],F2[1][5]);
Form1.Canvas.LineTo(F2[2][6],F2[1][6]);
Form1.Canvas.LineTo(F2[2][4],F2[1][4]);
Form1.Canvas.MoveTo(F2[2][3],F2[1][3]);
Form1.Canvas.LineTo(F2[2][6],F2[1][6]);
Form1.Canvas.MoveTo(F2[2][1],F2[1][1]);
Form1.Canvas.LineTo(F2[2][4],F2[1][4]);
Form1.Canvas.MoveTo(F2[2][2],F2[1][2]);
Form1.Canvas.LineTo(F2[2][5],F2[1][5]);

sleep(50);

{закрашиваем белым}
form1.canvas.Pen.Color:=clwhite;
Form1.Canvas.MoveTo(F2[2][1],F2[1][1]);
Form1.Canvas.LineTo(F2[2][2],F2[1][2]);
Form1.Canvas.LineTo(F2[2][3],F2[1][3]);
Form1.Canvas.LineTo(F2[2][1],F2[1][1]);
Form1.Canvas.MoveTo(F2[2][4],F2[1][4]);
Form1.Canvas.LineTo(F2[2][5],F2[1][5]);
Form1.Canvas.LineTo(F2[2][6],F2[1][6]);
Form1.Canvas.LineTo(F2[2][4],F2[1][4]);
Form1.Canvas.MoveTo(F2[2][3],F2[1][3]);
Form1.Canvas.LineTo(F2[2][6],F2[1][6]);
Form1.Canvas.MoveTo(F2[2][1],F2[1][1]);
Form1.Canvas.LineTo(F2[2][4],F2[1][4]);
Form1.Canvas.MoveTo(F2[2][2],F2[1][2]);
Form1.Canvas.LineTo(F2[2][5],F2[1][5]);

 end;

end;



begin

{исходные координаты}
F0[1][1]:=800; F0[2][1]:=300; F0[3][1]:=100;
F0[1][2]:=700; F0[2][2]:=300; F0[3][2]:=250;
F0[1][3]:=650; F0[2][3]:=350; F0[3][3]:=100;
F0[1][4]:=800; F0[2][4]:=600; F0[3][4]:=100;
F0[1][5]:=700; F0[2][5]:=600; F0[3][5]:=250;
F0[1][6]:=650; F0[2][6]:=650; F0[3][6]:=100;

{матрица проецирования}
Rpp[1][1]:=0.71; Rpp[2][1]:=0;    Rpp[3][1]:=0.71;  
Rpp[1][2]:=0.41; Rpp[2][2]:=0.82; Rpp[3][2]:=-0.41; 
Rpp[1][3]:=0;    Rpp[2][3]:=0;    Rpp[3][3]:=0;        


end.

vandrouny вне форума   Ответить с цитированием
Старый 22.05.2010, 20:44   #2
TwiX
Профессионал
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Адрес: ГЗ, сектор Б
Сообщений: 1,510
Репутация: 225
По умолчанию

Матрица изменяет фигуру относитлеьно (0, 0, 0). Поэтому предлагаю такой вариант: перед умножением приблизить к оси на 400, а после отдалить на 400, например.
TwiX вне форума   Ответить с цитированием
Старый 22.05.2010, 20:58   #3
vandrouny
Пользователь
 
Регистрация: 23.04.2009
Адрес: Минск
Сообщений: 42
Репутация: 10
По умолчанию

Вобщем я так и поступил. И, к сожалению, оказалось, что она нифига не вращается вокруг оси ОХ. Она просто "плавает" по какому-то своему закону.
Не подскажете, где бы это толковое что почитать по вращению фигуры? Гугленье ни к чему не привело(
vandrouny вне форума   Ответить с цитированием
Старый 22.05.2010, 21:16   #4
TwiX
Профессионал
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Адрес: ГЗ, сектор Б
Сообщений: 1,510
Репутация: 225
По умолчанию

Углы ейлера. Не понимаю, зачем нужно проецирование.
TwiX вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вращение stscolt Помощь студентам 1 08.10.2009 20:39
Вращение параллелепипеда stscolt Помощь студентам 1 06.10.2009 22:50
Вращение прямоугольника Ponaroshku Общие вопросы Delphi 0 25.05.2009 23:09
Вращение элипса lacost Мультимедиа в Delphi 3 19.12.2008 14:41
Вращение изображения beginner JavaScript, Ajax 5 07.07.2008 23:44


13:05.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru