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

Вниз

Второй контур   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.039 c
1-1122313034
Aldaris
2005-07-25 21:37
2005.08.14
Чтение Boolean переменных из *.ini файлов.


6-1115050639
read_me
2005-05-02 20:17
2005.08.14
получить размер файла из интернета


1-1122464533
Русланка
2005-07-27 15:42
2005.08.14
А можно как то осортировать строки в DBComboBox


1-1122284113
sarcin
2005-07-25 13:35
2005.08.14
Resize функция для IntraWeb


3-1120470697
Zhekson
2005-07-04 13:51
2005.08.14
Распечатка DBGrid_a