Форум: "Игры";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
ВнизВторой контур Найти похожие ветки
← →
D-Man (2005-04-25 01:36) [0]Есть: Массив вершин, он же многоугольник.
Надо: Получить второй такой же массив вершин, который будет окружать первый на каком-то расстоянии. Другими словами, раздвинуть все точки первого многоугольника, чтобы получить его второй контур.
Вопрос: Как?
← →
Sapersky (2005-04-25 10:20) [1]В Graphics32 была процедура.
← →
D-Man (2005-04-25 11:23) [2]Я надеюсь она OpenSource?
← →
Sapersky (2005-04-25 13:18) [3]Исходники в комплекте есть. Или что подразумевается под OpenSource? Лицензия?
Ещё есть GDI"ный WidenPath. Но на GDI надеяться...
Да и вручную дело нехитрое. Берем перпендикуляры к каждому отрезку, усредняем для соседних и сдвигаем по ним. Или можно не усреднять - просто сдвинуть и искать точки их пересечения (вершины сдвинутого многоугольника).
← →
MBo © (2005-04-25 13:39) [4]неоптимизировано, да и не очень нужно было:
procedure TForm1.CalcPoly(const 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;
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.013 c