IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Графика в Delphi, Поворот на 90 градусов
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский
Реальное имя: Екатерина

Репутация: -  0  +


Здравствуйте! Мы начали изучать новую дисциплину «Компьютерная графика». У меня есть задание по лабе на тему "Поворот фигуры на определенное количество градусов". Задание хотелось бы выполнить самостоятельно, но тема оказалась тяжела для понимания.
Подскажите, как реализовать поворот точки на осях координат вокруг их центра на 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; // масштаб

// координатная плоскость
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;


Сообщение отредактировано: Екатерина -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Ну смотри, есть точка
(x,y)
Чтобы найти её положение относительно центра (xc,yc), надо взять

(x1 = x-xc, y1=y-yc)

Потом эту точку поворачиваем на 90 градусов стандартным способом:

(x2=-y1, y2=x1)

Потом из положения относительно центра переводим в положение относительно экрана.

(xn=x2+xc; yn=y2+xc).


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Если не трудно, можно кусочек кода привести в качестве примера?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


с чего я бы посоветовала начать - сделать функции перевода "экранных" координат в математические и обратно, чтобы каждый раз в них не путаться.

теперь, собственно, про поворот точки вокруг начала координат (в математических координатах).
x_new:=x*cos(fi)-y*sin(fi);
y_new:=x*sin(fi)+y*cos(fi);

fi - угол в радианах, х и y - начальные координаты.

если фигура простенькая, то можно так каждую точку повернуть. если сложная - умножать матрицы...


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский
Реальное имя: Екатерина

Репутация: -  0  +


Цитата
сделать функции перевода "экранных" координат в математические и обратно
- если не секрет, подскажите как это сделать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Если не трудно, можно кусочек кода привести в качестве примера?


// перевод из экранных в математические
x1 := x-xc;
y1 := y-yc;

// поворот на 90 градусов
x2 := -y1;
y2 := x1;

// перевод из математических в экранные
xn := x2+xc;
yn := y2+yc;



--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский
Реальное имя: Екатерина

Репутация: -  0  +


Здравствуйте! Нужна ваша подсказка.
Будьте добры, посмотрите пожалуйста программу.
1)Правильно ли я написала процедуру масштабирования моей фигуры для соответствующей кнопки? (Т.е. не совсем по дилетантски?)
2)Никак не получается написать код для кнопки « Перенос». Подскажите, если не сложно
3)Возможно ли сделать так, чтобы значение угла вращения (Label1) менялось не от 0 до 10, а от 0 до 360 градусов?

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Label1: TLabel;
TrackBar1: TTrackBar;
Image1: TImage;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
procedure FormCreate(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
procedure DrawCoo;
procedure DrawRect;

public
{ Public declarations }
end;

var
Form1: TForm1;
x0, y0 : Integer;
cosa, sina : Double;
RectCooOrg, RectCooLast : array[0..4] of TPoint;

const
pi2 = 2 * pi;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
x0 := Image1.Width div 2; // центр координатной плоскости по х оси
y0 := Image1.Height div 2; // центр координатной плоскости по у оси
// Координаты
RectCooOrg[0].X := 50;
RectCooOrg[0].Y := 70;
RectCooOrg[1].X := 120;
RectCooOrg[1].Y := 70;
RectCooOrg[2].X := 130;
RectCooOrg[2].Y := 30;
RectCooOrg[3].X := 60;
RectCooOrg[3].Y := 30;
RectCooOrg[4].X := 50;
RectCooOrg[4].Y := 70;

RectCooLast := RectCooOrg;

DrawCoo; // Оси

cosa := cos(pi2 * trackBar1.Position / 360);
sina := sin(pi2 * trackBar1.Position / 360);

DrawRect;// Процедура построения параллелограмма

end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
label1.Caption := Inttostr(TrackBar1.Position);
Image1.Canvas.FillRect(Rect(0, 0, Width, Height));

DrawCoo;

cosa := cos(10*pi2 * trackBar1.Position / 100);
sina := sin(10*pi2 * trackBar1.Position / 100);

DrawRect;
end;

procedure TForm1.Button1Click(Sender: TObject); //процедура маштабирования
begin
Image1.Picture:=nil;
DrawCoo;

RectCooOrg[0].X := 50 * (StrToInt(edit1.text));
RectCooOrg[0].Y := 70 * (StrToInt(edit1.text));
RectCooOrg[1].X := 120 * (StrToInt(edit1.text));
RectCooOrg[1].Y := 70 * (StrToInt(edit1.text));
RectCooOrg[2].X := 130 * (StrToInt(edit1.text));
RectCooOrg[2].Y := 30 * (StrToInt(edit1.text));
RectCooOrg[3].X := 60 * (StrToInt(edit1.text));
RectCooOrg[3].Y := 30 * (StrToInt(edit1.text));
RectCooOrg[4].X := 50 * (StrToInt(edit1.text));
RectCooOrg[4].Y := 70 * (StrToInt(edit1.text));

DrawRect;
end;

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;

Image1.Canvas.Polyline(RectCooLast);
end;

end.


Сообщение отредактировано: Екатерина -


Прикрепленные файлы
Прикрепленный файл  ________________.rar ( 236.93 килобайт ) Кол-во скачиваний: 325
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


>
RectCooOrg[0].X := 50 * (StrToInt(edit1.text));
RectCooOrg[0].Y := 70 * (StrToInt(edit1.text));
RectCooOrg[1].X := 120 * (StrToInt(edit1.text));
RectCooOrg[1].Y := 70 * (StrToInt(edit1.text));
RectCooOrg[2].X := 130 * (StrToInt(edit1.text));
RectCooOrg[2].Y := 30 * (StrToInt(edit1.text));
RectCooOrg[3].X := 60 * (StrToInt(edit1.text));
RectCooOrg[3].Y := 30 * (StrToInt(edit1.text));
RectCooOrg[4].X := 50 * (StrToInt(edit1.text));
RectCooOrg[4].Y := 70 * (StrToInt(edit1.text));

Что это за числа? Я про 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 видимо


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 24
Пол: Женский
Реальное имя: Екатерина

Репутация: -  0  +


Спасибо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 5:47
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name