Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Второй контур


D-Man ©   (2005-04-25 01:36:00) 

Есть: Массив вершин, он же многоугольник.
Надо: Получить второй такой же массив вершин, который будет окружать первый на каком-то расстоянии. Другими словами, раздвинуть все точки первого многоугольника, чтобы получить его второй контур.
Вопрос: Как?


MBo   (2005-04-25 13:39:00) [1]

неоптимизировано, да и не очень нужно было:

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;


Sapersky   (2005-04-25 13:18:00) [2]

Исходники в комплекте есть. Или что подразумевается под OpenSource? Лицензия?
Ещё есть GDI'ный WidenPath. Но на GDI надеяться...
Да и вручную дело нехитрое. Берем перпендикуляры к каждому отрезку, усредняем для соседних и сдвигаем по ним. Или можно не усреднять - просто сдвинуть и искать точки их пересечения (вершины сдвинутого многоугольника).


D-Man   (2005-04-25 11:23:00) [3]

Я надеюсь она OpenSource?


Sapersky   (2005-04-25 10:20:00) [4]

В Graphics32 была процедура.


Наверх

Титульная страница Поиск, карта сайта Написать письмо