Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2010, 23:07   #1
newStudent
Пользователь
 
Аватар для newStudent
 
Регистрация: 07.07.2010
Сообщений: 44
По умолчанию GDI Графика в Delphi

Создал фигуры многоугольника и окружности.
Вопрос: какие алгоритмы можно использовать для преобразования систем координат на плоскости для след. ситуаций?
- Отразить относительно оси X;
- увеличить по оси X на 150%, по оси Y - в 2 раза;
- повернуть на 30 градусов против часовой стрелки.



Исходный код:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var x,x1,y,y1,r,xc,yc: integer;
begin
 // Рисование оси координат
 x:=Form1.Width;
 y:=Form1.Height;
 x1 := x div 2;
 y1 := y div 2;
 Canvas.MoveTo(x1,0);
 Canvas.LineTo(x1,y);
 Canvas.MoveTo(0,y1);
 Canvas.LineTo(x,y1);

 // Рисование окружности
 r:=60;
 xc:=215;
 yc:=415;
 canvas.Ellipse(xc-r,yc-r,xc+r,yc+r);

 // Рисование многоугольника
 Canvas.MoveTo(253,333);
 Canvas.LineTo(233,396);
 Canvas.LineTo(188,399);
 Canvas.LineTo(210,435);
 Canvas.LineTo(109,482);
 Canvas.LineTo(58,443);
 Canvas.LineTo(89,408);
 Canvas.LineTo(52,375);
 Canvas.LineTo(100,340);
 Canvas.LineTo(121,372);
 Canvas.LineTo(164,336);
 Canvas.LineTo(253,333);

end;

end.

Последний раз редактировалось newStudent; 10.11.2010 в 23:11.
newStudent вне форума Ответить с цитированием
Старый 11.11.2010, 01:39   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
Отразить относительно оси X
Все координаты X умножить на -1?
Цитата:
увеличить по оси X на 150%, по оси Y - в 2 раза
Умножить все координаты X на 1,5, а все Y на 2?
Цитата:
повернуть на 30 градусов против часовой стрелки
Воспользоваться Cos и Sin?
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 11.11.2010, 16:34   #3
newStudent
Пользователь
 
Аватар для newStudent
 
Регистрация: 07.07.2010
Сообщений: 44
По умолчанию

не совсем понятно

Цитата:
Умножить все координаты X на 1,5, а все Y на 2?
какие именно координаты в данном примере?
newStudent вне форума Ответить с цитированием
Старый 11.11.2010, 20:10   #4
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Лампочка

Хм..... Вообще бы надо сначала подправить сам подход...
Мы рисуем на клиентской области окна, поэтому нужно писать не Form1.Width, а Form1.ClientWidth...
И нам постоянно писать Canvas.LineTo(109,482) и вбивать/изменять все цифры вручную чтоль? Ну хоть массивом бы сделали... И они же должны зависеть от (x1, y1)...
Да и вывод фигур нужно делать в OnFormPaint...

Ну вот такой примерчик набросал:
Код:
var Form1: TForm1; koordinates_1: array of TPoint; x0, y0: Integer;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.DoubleBuffered:=True; // чтоб не мелькало
end;

procedure TForm1.FormResize(Sender: TObject);
begin
x0:=Form1.ClientWidth Div 2;
y0:=Form1.ClientHeight Div 2;
Form1.Repaint;
end;

procedure TForm1.FormPaint(Sender: TObject);
var i: Integer;
begin
Canvas.MoveTo(0, y0);
Canvas.LineTo(x0*2, y0);
Canvas.MoveTo(x0, 0);
Canvas.LineTo(x0, y0*2); // оси координат
if Length(koordinates_1)>2 then
      begin
      Canvas.MoveTo(x0+koordinates_1[0].X, y0+koordinates_1[0].Y);
      for i:=0 to Length(koordinates_1)-1 do
            Canvas.LineTo(x0+koordinates_1[i].X, y0+koordinates_1[i].Y);
      Canvas.LineTo(x0+koordinates_1[0].X, y0+koordinates_1[0].Y);
      end;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var k: Integer;
begin
k:=Length(koordinates_1);
SetLength(koordinates_1, k+1); // добавим новый узел
koordinates_1[k].X:=X-x0;
koordinates_1[k].Y:=Y-y0;
Form1.Repaint;
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
for i:=0 to Length(koordinates_1)-1 do
      koordinates_1[i].X:=Round(koordinates_1[i].X*1.5); // увеличим (растянем) в полтора раза по X
Form1.Repaint;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i: Integer;
begin
for i:=0 to Length(koordinates_1)-1 do
      koordinates_1[i].X:=koordinates_1[i].X*-1; // отразим относительно оси X
Form1.Repaint;
end;
I am the First of Cyber Evolution...
I am the First to Program your Future...

Последний раз редактировалось DomiNick; 11.11.2010 в 21:13.
DomiNick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графика в Delphi kiss2 Общие вопросы Delphi 2 15.06.2010 13:52
GDI: графика в Delphi. Вячеславик Помощь студентам 1 27.04.2010 16:30
Начал делать игру и застрял... GDI-графика CyberOrcX Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 20.10.2008 08:54
GDI+ в Delphi BOBAH13 Мультимедиа в Delphi 2 04.10.2008 13:45
GDI+ и альфа канал в Delphi for Win32 murtix Мультимедиа в Delphi 2 06.10.2007 00:09