Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.03.2012, 16:17
koroleva25 koroleva25 вне форума
Прохожий
 
Регистрация: 17.03.2012
Сообщения: 32
Репутация: 10
По умолчанию Летящий параллелепипед

Здравствуйте! Delphi 2009.
Пытаюсь освоить новую тему по компьютерной графике – Операции поворота вокруг центра координат на угол α, трансляции и масштабирования", но никак не получается,
боюсь сойти с ума, т.к. уже две недели пытаюсь решить задачу.
Помогите написать код для кнопки "Поворот". Надо чтобы мой параллелограмм поворачивался вокруг центра координат по щелчку на кнопку "Поворот" на определенное количество градусов, выбранное пользователем в компоненте Tetracbar.
Информации в интернете конечно много, но все примеры почему-то с изображениями, а не с геометрическими фигурами.
Всё что смогла сделать – построить оси координат и параллелограмм.

Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    Button3: TButton;
    Button5: TButton;
    TrackBar1: TTrackBar;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
    x,y: Real;
    x0, y0: Integer;
    m: Integer;
    i: Integer;
    n: Integer;
begin
  x0 := Image1.Width div 2; // центр координатной плоскости по х оси
  y0 := Image1.Height div 2; // центр координатной плоскости по у оси
  m := 25;      // масштаб

  // координатная плоскость
  Image1.Canvas.MoveTo(0, y0);
  Image1.Canvas.LineTo(ClientWidth, y0);
  Image1.Canvas.MoveTo(x0, 0);
  Image1.Canvas.LineTo(x0, ClientHeight);

  x := -7; // стартовое значение функции
  n := Abs(Round(x)); // конечное значение функции

  // шкалирование осей
  for i := Round(x) to n do
    begin
      Image1.Canvas.MoveTo(x0+i*m, y0-5);
      Image1.Canvas.LineTo(x0+i*m, y0-(-5));
      Image1.Canvas.TextOut(x0+i*m, y0+10, IntToStr(i));
      Image1.Canvas.MoveTo(x0+5, y0-m*i);
      Image1.Canvas.LineTo(x0-5, y0-m*i);
      Image1.Canvas.TextOut(x0-15, y0+i*m, IntToStr(-i));
    end;


end;

procedure TForm1.Button2Click(Sender: TObject);
begin
form1.Close;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
//координаты вершин многоугольника
point: array[1..4] of TPoint;
begin
//Координаты первой точки
point[1].X:=450; point[1].Y:=150;
//Координаты второй точки
point[2].X:=500; point[2].Y:=100;
//Координаты третьей точки
point[3].X:=600; point[3].Y:=100;
//Координаты четвертой точки
point[4].X:=550; point[4].Y:=150;
Image1.Canvas.Polygon(point);
end;

end.
Вложения
Тип файла: rar Поворот.rar (227.2 Кбайт, 5 просмотров)

Последний раз редактировалось koroleva25, 17.03.2012 в 16:20.
Ответить с цитированием
  #2  
Старый 17.03.2012, 16:46
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

поворот вершин осуществляется по след. формулам

xn=cosA*x-sina*y
yn=cosA*y+sina*x

где x,y-коодинаты вершин вашего параллелограмма
Ответить с цитированием
Этот пользователь сказал Спасибо Pilot_Red за это полезное сообщение:
koroleva25 (17.03.2012)
  #3  
Старый 17.03.2012, 18:07
koroleva25 koroleva25 вне форума
Прохожий
 
Регистрация: 17.03.2012
Сообщения: 32
Репутация: 10
По умолчанию

Допустим угол поворота: 90 градусов.
Согласно этим формулам расчеты получаются следующими:
xn=cos90*450-sin90*150 = -150
yn=cos90*450+sin90*150 = 150
------------------------------------
xn=cos90*500-sin90*100 = -100
yn=cos90*500+sin90*100 = 100
-------------------------------------
xn=cos90*600-sin90*100 = -100
yn=cos90*600+sin90*100 = 100
-------------------------------------
xn=cos90*550-sin90*150 = -150
yn=cos90*550+sin90*150 = 100
-------------------------------------
Так должно быть?
Если да, то как использовать найденные xn и yn ?
Ответить с цитированием
  #4  
Старый 17.03.2012, 18:41
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Цитата:
Сообщение от koroleva25
Допустим угол поворота: 90 градусов.
Согласно этим формулам расчеты получаются следующими:
xn=cos90*450-sin90*150 = -150
yn=cos90*450+sin90*150 = 150
------------------------------------
xn=cos90*500-sin90*100 = -100
yn=cos90*500+sin90*100 = 100
-------------------------------------
xn=cos90*600-sin90*100 = -100
yn=cos90*600+sin90*100 = 100
-------------------------------------
xn=cos90*550-sin90*150 = -150
yn=cos90*550+sin90*150 = 100
-------------------------------------
Так должно быть?
Если да, то как использовать найденные xn и yn ?

Повнимательней формулу посмотрите. Там x c y меняются местами..
После того как найдете xn,yn. отрисовывайте ваш параллелограмм именно по этим координатам...
Ответить с цитированием
  #5  
Старый 17.03.2012, 18:54
koroleva25 koroleva25 вне форума
Прохожий
 
Регистрация: 17.03.2012
Сообщения: 32
Репутация: 10
По умолчанию

Ой, простите, сейчас исправлюсь.
Попробую нарисовать, результат покажу.
Ответить с цитированием
  #6  
Старый 17.03.2012, 19:09
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Это на всякий случай, если что-то не получиться

Последний раз редактировалось Pilot_Red, 29.06.2012 в 15:50.
Ответить с цитированием
Этот пользователь сказал Спасибо Pilot_Red за это полезное сообщение:
koroleva25 (17.03.2012)
  #7  
Старый 17.03.2012, 20:52
koroleva25 koroleva25 вне форума
Прохожий
 
Регистрация: 17.03.2012
Сообщения: 32
Репутация: 10
По умолчанию

Что-то я совсем запуталась. Ерунда какая-то у меня компилируется. Видимо я уже совсем перегрелась. Отдохну и снова сяду за работу.
Вложения
Тип файла: rar Поворот.rar (230.3 Кбайт, 6 просмотров)
Ответить с цитированием
  #8  
Старый 17.03.2012, 22:10
koroleva25 koroleva25 вне форума
Прохожий
 
Регистрация: 17.03.2012
Сообщения: 32
Репутация: 10
По умолчанию

А вы можете показать как будет выглядеть ваш код, если квадрат крутить не вокруг своей оси, а вокруг какой-нибудь точки?
Ответить с цитированием
  #9  
Старый 17.03.2012, 22:20
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Цитата:
Сообщение от koroleva25
А вы можете показать как будет выглядеть ваш код, если квадрат крутить не вокруг своей оси, а вокруг какой-нибудь точки?
к исходным координатам прибавляй координаты точки, вокруг которой собираешься вращать.
на примере x:

xn=cosA*(px+x)-sina*(py+y)
Ответить с цитированием
  #10  
Старый 17.03.2012, 22:22
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Такой код устроит?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #11  
Старый 17.03.2012, 22:27
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Цитата:
Сообщение от angvelem
Такой код устроит?
angvelem дай человеку хоть с 2d разобраться
Ответить с цитированием
  #12  
Старый 17.03.2012, 22:32
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Я больше не буууду.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #13  
Старый 17.03.2012, 22:39
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Цитата:
Сообщение от angvelem
Я больше не буууду.
............................
Ответить с цитированием
  #14  
Старый 17.03.2012, 23:25
koroleva25 koroleva25 вне форума
Прохожий
 
Регистрация: 17.03.2012
Сообщения: 32
Репутация: 10
По умолчанию

Я тут немножко переоформила ваш код, сделала его на Canvase Image (таковы требования преподавателя).
Цитата:
к исходным координатам прибавляй координаты точки, вокруг которой собираешься вращать
на примере вашего кода:
Код:
begin
     form1.Image1.Canvas.lineTo(200+xn[i],200+yn[i]);
    xn[i]:=round(x[i]*cosa-y[i]*sina) ;
    yn[i]:=round(x[i]*sina+y[i]*cosa);
    form1.Canvas.MoveTo(200+xn[i],200+yn[i]);
end;
если мне нужно вращать вокруг точки, являющейся центром координат, (центр x0 := Image1.Width div 2; // центр координатной плоскости по х оси
y0 := Image1.Height div 2; // центр координатной плоскости по у оси
)
это будет выглядеть как?
Ответить с цитированием
  #15  
Старый 18.03.2012, 04:08
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Цитата:
Сообщение от koroleva25
Я тут немножко переоформила ваш код, сделала его на Canvase Image (таковы требования преподавателя).

на примере вашего кода:
Код:
begin
     form1.Image1.Canvas.lineTo(200+xn[i],200+yn[i]);
    xn[i]:=round(x[i]*cosa-y[i]*sina) ;
    yn[i]:=round(x[i]*sina+y[i]*cosa);
    form1.Canvas.MoveTo(200+xn[i],200+yn[i]);
end;
если мне нужно вращать вокруг точки, являющейся центром координат, (центр x0 := Image1.Width div 2; // центр координатной плоскости по х оси
y0 := Image1.Height div 2; // центр координатной плоскости по у оси
)
это будет выглядеть как?
да...............
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:55.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter