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


Новичок
*

Группа: Пользователи
Сообщений: 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 килобайт ) Кол-во скачиваний: 332
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 





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