Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2014, 23:40   #1
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию Матрица поворота

Искал похожие темы но увы нема,как все это происходит.даже перечитал тригонометрию(в геометрии слабо с этим) но в точности не могу понять откуда такая формула ибо контроля было бы больше.И ещё читал статью полезная, "линейная алгебра для разраб. игр".там тоже так же вот и написал код а понять в сущности не как не могу исправить проблема в том что абстрактно моя фигура поворачивается вокруг больщущего шара а должна на месте же крутиться(помогите пжл что читать вообще как понять всю эту прелесть(
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    pb1: TPaintBox;
    Timer2: TTimer;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  x0,y0:integer;
  x,y:array[1..3] of integer;

implementation

{$R *.dfm}


procedure u4buc(x1,y1,x2,y2,x3,y3:integer); //треугольник
begin
 form1.Canvas.MoveTo(x1,y1);
form1.Canvas.LineTo(x2,y2);
form1.Canvas.LineTo(x3,y3);
form1.Canvas.LineTo(x1,y1);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
x0:=clientwidth div 2;
y0:=clientheight div 2;
x[1]:=x0; y[1]:=y0;
x[2]:=x0; y[2]:=y0-100;
x[3]:=x0+100; y[3]:=y0;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
u4buc(x[1],y[1],x[2],y[2],x[3],y[3]); //рисуем
end;

procedure TForm1.Timer2Timer(Sender: TObject);
var i:integer;
 begin
 for i:=1 to 3 do begin
x[i]:=round(x[i]*cos(15*3.14/180)-y[i]*sin(15*3.14/180));
y[i]:=round(x[i]*sin(15*3.14/180)+y[i]*cos(15*3.14/180));
end;
form1.Repaint;

end;

end.
П.с. знаю сразу же можно базис векторами наколдовать легче будет на много но опяпь таки хочется не написать а понять все это(

Последний раз редактировалось Тамерлан Абилов; 12.03.2014 в 23:45.
Тамерлан Абилов вне форума Ответить с цитированием
Старый 13.03.2014, 00:09   #2
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Код:
 for i:=1 to 3 do begin
x[i]:=round(x[i]*cos(15*3.14/180)-y[i]*sin(15*3.14/180));
y[i]:=round(x[i]*sin(15*3.14/180)+y[i]*cos(15*3.14/180));
end;
выделенное должно быть равным в обеих формулах
Smogg вне форума Ответить с цитированием
Старый 13.03.2014, 00:11   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,427
По умолчанию

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  x0, y0: integer;
  x, y: array [1 .. 3] of integer;
  p: real;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  p := 0;
  x0 := clientwidth div 2;
  y0 := clientheight div 2;
  x[1] := 0;
  y[1] := 0;
  x[2] := 0;
  y[2] := -100;
  x[3] := 100;
  y[3] := 0;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  i, a, b: integer;
begin
  a := x0 + round(x[3] * cos(p) - y[3] * sin(p));
  b := y0 + round(x[3] * sin(p) + y[3] * cos(p));
  Canvas.MoveTo(a, b);
  for i := 1 to 3 do
  begin
    a := x0 + round(x[i] * cos(p) - y[i] * sin(p));
    b := y0 + round(x[i] * sin(p) + y[i] * cos(p));
    Canvas.LineTo(a, b);
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  p := p + 15 * Pi / 180;
  if p > 2 * Pi then
    p := p - 2 * Pi;
  repaint;
end;

end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 13.03.2014, 00:35   #4
Тамерлан Абилов
Пользователь
 
Регистрация: 03.03.2013
Сообщений: 70
По умолчанию re

Спасибо понял.но все же.общее понятие всего этого что изучать что читать помогло бы мне

Последний раз редактировалось Тамерлан Абилов; 13.03.2014 в 00:43.
Тамерлан Абилов вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Матрица поворота Murashov Qt и кроссплатформенное программирование С/С++ 0 07.12.2012 19:29
Поворот изображения, матрица поворота kordax Помощь студентам 9 19.01.2012 23:21
Непонятки с DirectX (матрица поворота, камера, матрица проекции) ROD Общие вопросы C/C++ 2 17.09.2010 17:00
Угол поворота KoBRaAndrey Общие вопросы Delphi 7 29.08.2010 18:08
Процедура поворота изображения Илья PHoeNiX Общие вопросы Delphi 3 08.06.2008 13:59