Здравствуйте! Мы начали изучать новую дисциплину «Компьютерная графика». У меня есть задание по лабе на тему "Поворот фигуры на определенное количество градусов". Задание хотелось бы выполнить самостоятельно, но тема оказалась тяжела для понимания. Подскажите, как реализовать поворот точки на осях координат вокруг их центра на 90 градусов. Если я это пойму, тогда возможно и свою фигуру смогу повернуть самостоятельно.
Оси вроде бы правильно составлены. Вот они:
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; // масштаб
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;
TarasBer
15.03.2012 19:14
Ну смотри, есть точка (x,y) Чтобы найти её положение относительно центра (xc,yc), надо взять
(x1 = x-xc, y1=y-yc)
Потом эту точку поворачиваем на 90 градусов стандартным способом:
(x2=-y1, y2=x1)
Потом из положения относительно центра переводим в положение относительно экрана.
(xn=x2+xc; yn=y2+xc).
Гость
16.03.2012 1:07
Если не трудно, можно кусочек кода привести в качестве примера?
мисс_граффити
16.03.2012 2:41
с чего я бы посоветовала начать - сделать функции перевода "экранных" координат в математические и обратно, чтобы каждый раз в них не путаться.
теперь, собственно, про поворот точки вокруг начала координат (в математических координатах). x_new:=x*cos(fi)-y*sin(fi); y_new:=x*sin(fi)+y*cos(fi);
fi - угол в радианах, х и y - начальные координаты.
если фигура простенькая, то можно так каждую точку повернуть. если сложная - умножать матрицы...
Екатерина
16.03.2012 3:27
Цитата
сделать функции перевода "экранных" координат в математические и обратно
- если не секрет, подскажите как это сделать.
TarasBer
16.03.2012 15:18
> Если не трудно, можно кусочек кода привести в качестве примера?
// перевод из экранных в математические x1 := x-xc; y1 := y-yc;
// поворот на 90 градусов x2 := -y1; y2 := x1;
// перевод из математических в экранные xn := x2+xc; yn := y2+yc;
Екатерина
23.03.2012 18:06
Здравствуйте! Нужна ваша подсказка. Будьте добры, посмотрите пожалуйста программу. 1)Правильно ли я написала процедуру масштабирования моей фигуры для соответствующей кнопки? (Т.е. не совсем по дилетантски?) 2)Никак не получается написать код для кнопки « Перенос». Подскажите, если не сложно 3)Возможно ли сделать так, чтобы значение угла вращения (Label1) менялось не от 0 до 10, а от 0 до 360 градусов?
procedure TForm1.Button2Click(Sender: TObject); //Процедура переноса фигуры begin Image1.Picture:=nil; DrawCoo;
end;
procedure TForm1.DrawCoo; //Построение осей координат var m, i : Integer; begin m := 25; // масштаб Image1.Canvas.Pen.Color := clBlack; // координатная плоскость Image1.Canvas.MoveTo(0, y0); Image1.Canvas.LineTo(ClientWidth, y0); Image1.Canvas.MoveTo(x0, 0); Image1.Canvas.LineTo(x0, ClientHeight); // шкалирование осей for i := -7 to 7 do begin Image1.Canvas.MoveTo(x0 + i * m, y0 - 5); Image1.Canvas.LineTo(x0 + i * m, y0 - (-5)); if I <> 0 then Image1.Canvas.TextOut(x0 + i * m - 5, y0 + 10, IntToStr(i));
Image1.Canvas.MoveTo(x0 + 5, y0 - m * i); Image1.Canvas.LineTo(x0 - 5, y0 - m * i); if I <> 0 then Image1.Canvas.TextOut(x0 - 20, y0 + i * m - 5, IntToStr(-i)); end; end;
procedure TForm1.DrawRect; // Построение параллелограмма var I : Integer; begin Image1.Canvas.Pen.Color := clBlack;
for I := 0 to 4 do begin RectCooLast[i].X := Round(RectCooOrg[i].X * cosa - RectCooOrg[i].Y * sina + x0); RectCooLast[i].Y := Round(RectCooOrg[i].Y * cosa + RectCooOrg[i].X * sina + y0); end;
Что это за числа? Я про 50,70,120... Они же у тебя встречаются в procedure TForm1.FormCreate(Sender: TObject); Их лучше сделать константами. А ещё лучше вычислять по формулам по размерам формы.
Дальше, зачем StrToInt считать столько раз? Лучше сохранить во временную переменную dScale, заодно понятнее будет, что там такое.
Что такое Button1, Edit1? В инспекторе объектов задай компонентам нормальные названия (поле Name).
> 3)Возможно ли сделать так, чтобы значение угла вращения (Label1) менялось не от 0 до 10, а от 0 до 360 градусов?
Поменять 10 на 360 в procedure TForm1.TrackBar1Change(Sender: TObject);?
> 2)Никак не получается написать код для кнопки « Перенос». Подскажите, если не сложно
Меняешь x0,y0 видимо
Екатерина
24.03.2012 0:53
Спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.