Здравствуйте! Мы начали изучать новую дисциплину «Компьютерная графика». У меня есть задание по лабе на тему "Поворот фигуры на определенное количество градусов". Задание хотелось бы выполнить самостоятельно, но тема оказалась тяжела для понимания. Подскажите, как реализовать поворот точки на осях координат вокруг их центра на 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;
с чего я бы посоветовала начать - сделать функции перевода "экранных" координат в математические и обратно, чтобы каждый раз в них не путаться.
теперь, собственно, про поворот точки вокруг начала координат (в математических координатах). x_new:=x*cos(fi)-y*sin(fi); y_new:=x*sin(fi)+y*cos(fi);
fi - угол в радианах, х и y - начальные координаты.
если фигура простенькая, то можно так каждую точку повернуть. если сложная - умножать матрицы...
--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует. На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
Здравствуйте! Нужна ваша подсказка. Будьте добры, посмотрите пожалуйста программу. 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)Никак не получается написать код для кнопки « Перенос». Подскажите, если не сложно