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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2011, 19:32   #1
Николая Ленин
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 39
По умолчанию Копирование полигона

как произвести копирование полигона точек? и после копирования строить такие же со смещением?
Николая Ленин вне форума Ответить с цитированием
Старый 04.06.2011, 14:11   #2
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

Код:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}
type
 Tpolygon = array of tpoint;

procedure copyPolygon(Src: Tpolygon; var Dst: Tpolygon);
 var i: integer;
 begin
  setlength(Dst, length(src));
  for i := 0 to length(src) - 1 do  dst[i] := src[i];
 end;

function ShiftPolygon(src: Tpolygon; Dx, Dy: integer): Tpolygon;
 var i: integer;
 begin
  setlength(result, length(src));
  for i := 0 to length(src) - 1 do
   begin
    result[i].x := src[i].x + dx;
    result[i].y := src[i].y + dy;
   end
 end;

 function RotatePolygon(src: Tpolygon; Cx, Cy: integer; Fi: real): Tpolygon;
 var i: integer;
     tx: integer;
 begin
  Fi := DegToRad(fi);
  setlength(result, length(src));
  for i := 0 to length(src) - 1 do
   begin
    result[i].x := src[i].x - cx;
    result[i].y := src[i].y - cy;

    tx := result[i].x;
    result[i].x := round(tx * cos(fi) +  result[i].y * sin(fi));
    result[i].y := round(-tx * sin(fi) + result[i].y * cos(fi));

    result[i].x := result[i].x + cx;
    result[i].y := result[i].y + cy;

   end
 end;
 
procedure TForm1.FormClick(Sender: TObject);
var 
 p1, p2: Tpolygon;
 i : integer;
begin
//создали полигон
 setlength(p1, 12);

 p1[0] := Point(-30,-10);
 p1[1] := Point(-11,3);
 p1[2] := Point(-22,32);
 p1[3] := Point(5,14);
 p1[4] := Point(36,34);
 p1[5] := Point(36,34);
 p1[6] := Point(21,4);
 p1[7] := Point(43,-12);
 p1[8] := Point(12,-11);
 p1[9] := Point(12,-11);
 p1[10] := Point(3,-30);
 p1[11] := Point(-5,-11);

 // скопировали полигон
 copyPolygon(p1, p2);

// выводим кучу полигонов
 for i := 0 to 399 do
  Canvas.Polygon(ShiftPolygon(RotatePolygon(p2,0,0,random(360)), random(width - 60) + 30, random(Height - 60) + 30));

end;

end.
Звездный мир XD
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 04.06.2011, 14:47   #3
Николая Ленин
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 39
По умолчанию

Огромное спасибо! А нельзя связать ту задачу, где полигон создаешь и крутишь с это задача, чтобы тот можно было копировать?
Николая Ленин вне форума Ответить с цитированием
Старый 04.06.2011, 14:56   #4
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

да без проблем

объявляешь перменную
Код:
Polygon: Tpolygon;
Код:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
 i: integer;
begin
 if button = mbLeft then
  begin
   i := length(Polygon);
   SetLength (Polygon,i + 1);
   Polygon[i].X := x;
   Polygon[i].Y := y;
  end
 else
  begin
   Center.X := x;
   Center.Y := y;
  end;
 Draw;
end
теперь копируй из Polygon куда хочешь, можно выводить со смещением даже не копируя,

Код:
  Canvas.Polygon(ShiftPolygon(RotatePolygon(Polygon,cx,cx,fi), dx,dy));
cx, cy - координаты точки поворота
fi - уголо поворота
dx, dy - смещение полигона
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Старый 04.06.2011, 17:39   #5
Николая Ленин
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 39
По умолчанию

И будут точки полигона строиться по нажатию мышки? Если да куда тогда деть точки, которые у тебя заданы в этом коде?
Николая Ленин вне форума Ответить с цитированием
Старый 04.06.2011, 22:07   #6
Swarog
Форумчанин
 
Аватар для Swarog
 
Регистрация: 26.01.2010
Сообщений: 215
По умолчанию

а переопределить свои обработчики слабо? за Вас и так почти все написали, вам только разобрать два примера на кирпичики и построить свой "дом"
Могу лишь пнуть в нужном направлении (ну или как получится)
Swarog вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поворот полигона Николая Ленин Общие вопросы Delphi 9 02.06.2011 23:05
площадь полигона boomeer Помощь студентам 5 17.10.2010 14:17
Рисование затекстурированного полигона в OpenGL. Вадим Буренков Мультимедиа в Delphi 2 17.08.2009 16:22
Копирование VVVasek Microsoft Office Excel 13 20.09.2008 23:12