Форум: "Потрепаться";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизПостроение буферной зоны. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.03 c