Approximation

From
Alex Malashonok (2:4635/1024.64)
To
tim@kti.nsib.ru
Date
2002-08-15T10:57:11Z
Area
RU.ALGORITHMS
Привет tim@kti.nsib.ru!

Среда Авгyст 14 2002 18:33, ROman Ryabko -> tim@kti.nsib.ru:

 t>> Есть проблема. Имеется набор точек (упорядоченный, т.е. ломанная)
 t>> Надо ее аппроксимировать набором дуг окружностей (не эллипсов) и
 t>> прямых. Аппроксимировать гладко (в смысле непрерывности 1
 t>> производной). Вопрос в том как сделать это оптимально и быстро
 t>> ? Наверняка есть готовые алгоритмы. --
Пусть имеется набор точек:
  P1(x1, y1), P2(x2, y2), P3(x3, y3) ... Pn(xn, yn)
В общем случае задача сводится к поиску центра i-й окружности для i-го отрезка.

Считаем, что центр окружности N1 известен - т.е. задаем его сами, и далее
будем проводить дуги, соединяющие каждые две соседние точки так, чтобы (см. рис.) радиус-вектор одной окружности был перпендикулярен не только своей касательной, но и касательной к "следующей" дуге в точке стыка, т.е. чтобы касательные совпадали.

 Р1
 o
 o            C1
 o            |
  o           |
  o           |
   o          | -> радиус-вектор
    oo        |
      oo      |
        ooo   |
...........oooР2...................
                oo        ^
                  o       |
                  o       касательная
               Р3o


Общее уравнение касательной к окружности в точке (x0,y0) имеет вид:

   (x-Cx)*(x0-Cx) + (y-Cy)*(y0-Cy) = R^2, где Сх, Су - координаты центра, R - радиус.

запишем это в точке P2 для наших двух окружностей:

  касат. N1: (x-Cx1)*(x2-Cx1) + (y-Cy1)*(y2-Cy1) = R1^2
  касат. N2: (x-Cx2)*(x2-Cx2) + (y-Cy2)*(y2-Cy2) = R2^2

Раскрывая скобки получим:

  x*(x2-Cx1) + y*(y2-Cy1) - Cx1*(x2-Cx1) - Cy1*(y2-Cy1) - R1^2 = 0
  x*(x2-Cx2) + y*(y2-Cy2) - Cx2*(x2-Cx2) - Cy2*(y2-Cy2) - R2^2 = 0

запишем короче:

  x*a1 + y*b1 + c1 = 0
  x*a2 + y*b2 + c2 = 0

Условие "одинаковости" прямых:

  a1/a2 = b1/b2 = c1/c2

получается системма, которую надо решить и найти Cx2, Cy2 и R2 (Cx1 и Cy1 - изначально известны, R1 тоже). Вроде 3 ур-я, 3 неизвестных...

зы: напишешь, поделишься графической интерпритацией?

Alex

--- Советую стереть эту строку...
 * Origin: 416C6578616E646572204D616C6173686F6E6F6B (2:4635/1024.64)