|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Летящий параллелепипед
Здравствуйте! 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. Последний раз редактировалось koroleva25, 17.03.2012 в 16:20. |
#2
|
||||
|
||||
поворот вершин осуществляется по след. формулам
xn=cosA*x-sina*y yn=cosA*y+sina*x где x,y-коодинаты вершин вашего параллелограмма |
Этот пользователь сказал Спасибо Pilot_Red за это полезное сообщение: | ||
koroleva25 (17.03.2012)
|
#3
|
|||
|
|||
Допустим угол поворота: 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
|
||||
|
||||
Цитата:
Повнимательней формулу посмотрите. Там x c y меняются местами.. После того как найдете xn,yn. отрисовывайте ваш параллелограмм именно по этим координатам... |
#5
|
|||
|
|||
Ой, простите, сейчас исправлюсь.
Попробую нарисовать, результат покажу. |
#6
|
||||
|
||||
Это на всякий случай, если что-то не получиться
Последний раз редактировалось Pilot_Red, 29.06.2012 в 15:50. |
Этот пользователь сказал Спасибо Pilot_Red за это полезное сообщение: | ||
koroleva25 (17.03.2012)
|
#7
|
|||
|
|||
Что-то я совсем запуталась. Ерунда какая-то у меня компилируется. Видимо я уже совсем перегрелась. Отдохну и снова сяду за работу.
|
#8
|
|||
|
|||
А вы можете показать как будет выглядеть ваш код, если квадрат крутить не вокруг своей оси, а вокруг какой-нибудь точки?
|
#9
|
||||
|
||||
Цитата:
на примере x: xn=cosA*(px+x)-sina*(py+y) |
#12
|
||||
|
||||
Я больше не буууду.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#13
|
||||
|
||||
Цитата:
|
#14
|
|||
|
|||
Я тут немножко переоформила ваш код, сделала его на 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; y0 := Image1.Height div 2; // центр координатной плоскости по у оси ) это будет выглядеть как? |
#15
|
||||
|
||||
Цитата:
|