Приветствую Вас Гость | RSS

Delphi заготовки

Четверг, 02.05.2024, 02:33
Главная » Файлы » Мои файлы

Простые примеры работы с векторным изображением Delphi
[ Скачать с сервера (175.2 Kb) ] 13.05.2012, 12:25
как оперделить длину отрезка AB если известны координаты отрезка

 Function Dlina(a,b:Tpoint):real;
var x1,y1,x2,y2:real;
begin
x1:=a.x;
y1:=a.y;
x2:=b.x;
y2:=b.y;
   result:=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))
end;

как определить угол наклона отрезка A B в координатах
uses math;

Function Ugol(a,b:Tpoint):real;
var Ch:integer;
begin
  result:=arctan2((a.y-b.y),(a.x-b.x));
end;


как создать векторный объект
  type
    TMyObject=record
      cx,cy:integer; // Центр фигуры
      h,w:integer; // Высота и ширина объекта
      n:integer; // кол-во вершин
      m:array of Tpoint; //  массив точек векторного объекта
    end;

определим векторный объект

var
  pr:TMyObject; // Прямоугольник


напишем процедуру создания векторного объекта

cx,cy - центр объекта
h,W - Ширина и высота объекта
a1 - начальный угол поворота



 Function CreateMyObject4(cx,cy,h,w:integer;a1:integer):TMyObject;
 const n=4;
 var an,a:real;
     r:Extended;
     x:integer;
     h1,x1,y1:integer;
 begin
   a:=360/n;
   r:=SQRT(w*w+h*h);
   result.cx:=cx;
   result.cy:=cy;
   result.n:=n;
   if length(result.m)<n then
   setlength(result.m,n+1);
   an:=a1;
   r:=r/2;
   for x:=0 to n-1 do begin
     if x=0 then begin
       x1:=round(cx+r*cos((360-arctan(h/w)*180/pi+a1)*pi/180));
       y1:=round(cy+r*sin((360-arctan(h/w)*180/pi+a1)*pi/180));
       form1.Image1.Canvas.MoveTo(cx,cy);
       form1.Image1.Canvas.Lineto(x1,y1);
   end
   else
begin
   an:=an+a;
   if (x mod 2) <> 0 then h1:=h else h1:=w;
     x1:=round(x1+h1*cos(an*pi/180));
     y1:=round(y1+h1*sin(an*pi/180));
    end;
     result.m[x].X:=x1;
     result.m[x].y:=y1;
   end;
     result.m[n].X:=result.m[0].X;
     result.m[n].y:=result.m[0].y;
 end;




создадим процедуру поворота векторного объекта вокруг определенной точки

Procedure Povorot(var Val:TMyObject;cx,cy:integer;a:integer);
var i:integer;n:integer;
    d1:real; // расстояние от точки cx,cy до точки объекта
    a1:real; // текущий угол наклона
    x1,y1:integer; // новый угол поворота
begin
  n:=val.n;

     d1:=Dlina(point(val.cx,val.cy),point(cx,cy));
     a1:=Ugol(point(val.cx,val.cy),point(cx,cy));
// перетаскиваем центр тяжести объекта
     val.cx:=cx+round(d1*cos(a1+a*pi/180));
     val.cy:=cy+round(d1*sin(a1+a*pi/180));

  for I:=0 to n-1 do begin
     d1:=Dlina(point(val.m[i].x,val.m[i].y),point(cx,cy));
     a1:=Ugol(point(val.m[i].x,val.m[i].y),point(cx,cy));
     x1:=cx+Round(d1*cos(a1+a*pi/180));
     y1:=cy+Round(d1*sin(a1+a*pi/180));
     val.m[i].X:=x1;
     val.m[i].y:=y1;
  end;
     val.m[n].X:=val.m[0].X;
     val.m[n].y:=val.m[0].y;
end;



процедура перерисовки нашего векторного объекта выглядит просто

 form1.Image1.Canvas.Polygon(pr.m);
 form1.Image1.Canvas.Rectangle(pr.cx-5,pr.cy-5,pr.cx+5,pr.cy+5); // центр векторного объекта
пример ниже





решил написать второй пример
поворот многоугольника вокруг точки на Delphi
Pascal
с возможностью переноса точки центра вращения  мышью
/59_povorot_vokrug_tochki.zip
Категория: Мои файлы | Добавил: NetSoftWare | Теги: Угол наклона, Dlina, векторное изображение, Ugol
Просмотров: 3253 | Загрузок: 181 | Комментарии: 1 | Рейтинг: 5.0/1
Всего комментариев: 1
1 Evgen  
0
Это не работа с векторными изображениями, ебанарот!
Это графические примитивы, блеать!

Имя *:
Email *:
Код *: