Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Построение буферной зоны.   Найти похожие ветки 

 
Skier ©   (2005-06-01 11:29) [0]

Как построить буферную зону вокруг ломаной на расстоянии delta?
Буду признателен за любую инфомацию или помощь.


 
MBo ©   (2005-06-01 11:33) [1]


procedure TForm1.CalcPoly(p1: array of TPoint; var p2: array of TPoint;
 Dist: Integer);
var
 n, n1, i: integer;
 prev, next: integer;
 la, lb: double;
 fia, fib: extended;
 dxa, dxb, dya, dyb: integer;
 ppx, ppy, pnx, pny: array of double;
 d, a1, b1, a2, b2: double;
begin
 n := high(p1);
 n1 := n + 1;
 setlength(ppx, n1);
 setlength(ppy, n1);
 setlength(pnx, n1);
 setlength(pny, n1);
 for i := 0 to n do begin
   prev := (i + n1 - 1) mod n1;
   next := (i + 1) mod n1;
   dxa := -p1[i].x + p1[prev].x;
   dxb := p1[next].x - p1[i].x;
   dya := -p1[i].y + p1[prev].y;
   dyb := p1[next].y - p1[i].y;
   la := Hypot(dxa, dya);
   lb := Hypot(dxb, dyb);
   fia := arctan2(dya, dxa);
   fib := arctan2(dyb, dxb);
   d := dist / sin(fib - fia);
   ppx[i] := p1[prev].x - (la - d) * cos(fia);
   ppy[i] := p1[prev].y - (la - d) * sin(fia);
   pnx[i] := p1[next].x - (lb - d) * cos(fib);
   pny[i] := p1[next].y - (lb - d) * sin(fib);
 end;
 for i := 0 to n do begin
   prev := (i + n1 - 1) mod n1;
   next := (i + 1) mod n1;
   d := ppx[i] - pnx[next];
   a1 := (ppy[i] - pny[next]) / d;
   b1 := (pny[next] * ppx[i] - ppy[i] * pnx[next]) / d;
   d := ppx[prev] - pnx[i];
   a2 := (ppy[prev] - pny[i]) / d;
   b2 := (pny[i] * ppx[prev] - ppy[prev] * pnx[i]) / d;
   d := a2 - a1;
   p2[i].x := round((b1 - b2) / d);
   p2[i].y := round((a2 * b1 - a1 * b2) / d);
 end;
end;



 
MBo ©   (2005-06-01 11:35) [2]

Вообще уточни проблему.


 
Skier ©   (2005-06-01 11:40) [3]

>MBo ©   (01.06.05 11:35) [2]
Большое спасибо !


> Вообще уточни проблему.

Вообще, моя проблема несколько проще :
есть отрезок на плоскости и мне нужно его "описать" четырехугольником, с расстоянием до отрезка равным некоторой delta.

А где можно найти теорию по этому вопросу ? не подскажешь ?


 
Alx2 ©   (2005-06-01 11:45) [4]

Skier ©   (01.06.05 11:40) [3]

Отрезок можно представить как часть прямой a*x+b*y+c=0, где a^2+b^2=1 (для простоты). Варьируя "с" добиваемся параллельного переноса "над" и "под" отрезок, получая тем самым "верхнюю" и "нижнюю" грани четырехугольника.


 
Думкин ©   (2005-06-01 11:52) [5]

>  [4] Alx2 ©   (01.06.05 11:45)

А потом меняя a и b и у одного из них и знак - получаем аналогично боковые грани. :)


 
Skier ©   (2005-06-01 12:14) [6]

>MBo ©   (01.06.05 11:33) [1]
Для отрезка
P1 (128, 104)-P2 (148, 204), sin(fib - fia) получается равным нулю...в этом случае чему должно быть равно d в выражении d := dist / sin(fib - fia); ?


 
TUser ©   (2005-06-01 12:20) [7]

> есть отрезок на плоскости и мне нужно его "описать" четырехугольником, с расстоянием до отрезка равным некоторой delta.

Отрезок - это по сути вектор. Строим к нему перпендикуляр (скал. произведение равно 0), помещаем в нужную точку - имеем один из углов. Остальные углы четырехугольника получаем простыми действиями с полученным перпедикуляром.


 
MBo ©   (2005-06-01 12:29) [8]


procedure TForm1.Button4Click(Sender: TObject);
var
 q0, q1: TPoint;
 Pts: array[0..3] of TPoint;
 cf, sf: Extended;
 Dist: Integer;
begin
 q0 := Point(350, 200);
 q1 := Point(200, 300);
 Canvas.Pen.Color := clRed;
 Canvas.Pen.Width := 3;
 Canvas.MoveTo(q0.X, q0.y);
 Canvas.LineTo(q1.X, q1.y);
 Dist := 30;
 SinCos(ArcTan2(q1.Y - q0.Y, q1.X - q0.X), sf, cf);
 Pts[0] := Point(Round(-Dist * sf + q0.X), Round(Dist * cf + q0.Y));
 Pts[1] := Point(Round(Dist * sf + q0.X), Round(-Dist * cf + q0.Y));
 Pts[2] := Point(Round(Dist * sf + q1.X), Round(-Dist * cf + q1.Y));
 Pts[3] := Point(Round(-Dist * sf + q1.X), Round(Dist * cf + q1.Y));
 Canvas.Brush.Style := bsClear;
 Canvas.Pen.Color := clBlack;
 Canvas.Pen.Width := 1;
 Canvas.Polygon(Pts);
end;



 
MBo ©   (2005-06-01 12:43) [9]

в целых числах:

procedure TForm1.Button4Click(Sender: TObject);
var
 q0, q1: TPoint;
 Pts: array[0..3] of TPoint;
 dx, dy, l, Dist: Integer;
begin
 q0 := Point(200, 250);
 q1 := Point(300, 300);
 dx := q1.X - q0.X;
 dy := q1.Y - q0.Y;
 l := Round(Hypot(dx, dy));
 Canvas.Pen.Color := clRed;
 Canvas.Pen.Width := 3;
 Canvas.MoveTo(q0.X, q0.y);
 Canvas.LineTo(q1.X, q1.y);
 Dist := 30;
 dx := Dist * dx div l;
 dy := Dist * dy div l;
 Pts[0] := Point(-dy + q0.X, dx + q0.Y);
 Pts[1] := Point(dy + q0.X, -dx + q0.Y);
 Pts[2] := Point(dy + q1.X, -dx + q1.Y);
 Pts[3] := Point(-dy + q1.X, dx + q1.Y);
 Canvas.Brush.Style := bsClear;
 Canvas.Pen.Color := clBlack;
 Canvas.Pen.Width := 1;
 Canvas.Polygon(Pts);
end;



 
evvcom ©   (2005-06-01 12:46) [10]


> нужно его "описать" четырехугольником, с расстоянием до
> отрезка равным некоторой delta.

Вообще-то вокруг концов отрезка зона будет полукруглой. Или это не важно?


 
Skier ©   (2005-06-01 12:46) [11]

MBo ©   (01.06.05 12:43) [9]
Огромное спасибо !



Страницы: 1 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.032 c
1-1117806282
fagot
2005-06-03 17:44
2005.06.29
Побудка


14-1117721784
able
2005-06-02 18:16
2005.06.29
php && rtf


1-1117614507
SergeiX
2005-06-01 12:28
2005.06.29
использование TListBox и TEdit


14-1117479218
NailMan
2005-05-30 22:53
2005.06.29
Надо есть правильные сладости! :-)))


14-1117366399
sofs
2005-05-29 15:33
2005.06.29
JBuilder