Николай
Суббота, 01 Ноября 2008, 22:08
Цитата(vitg @ Суббота, 01 Ноября 2008, 20:16)
на скольких точках апроксимации Вы интерполируете
Пожалуйста. Я разбиваю массив точек на набор прямых методом подбора (сначала беру 3 первые точки, осредняю прямой, считаю среднее расстояние этих точек от этой прямой, затем беру 4 точки, опять осредняю прямой, опять считаю среднее расстояние. Если оно больше предельного, оставляю 3 точки и начинаю новую прямую, если меньше - беру 5 точек и т.д.). Полученные прямые у меня не соединяюся друг с другом (их концы я не знаю, т.к. имею только среднюю точку и направление), поэтому ищу точки пересечения соседних линий. Вот здесь-то и коза. Вероятно, соседние линии близки по направлению (почти параллельны) и точки их пересечения где-то далеко. Конечно, если нет готовых программ, придется рыть дальше. Буду благодарен за подсказки. Код мой, но алгоритмы, примеры и функцию обработки матрицы собраны из разных источников.
PointF xlines(PointF L11, PointF L12, PointF L21, PointF L22) {
double a1, b1, c1, a2, b2, c2; // вычисление точки пересечения 2-х линий
PointF p = newPointF(); p.X=0; p.Y=0;
a1=L12.Y-L11.Y; a2=L22.Y-L21.Y;
b1=L11.X-L12.X; b2=L21.X-L22.X;
if (a2*b1==b2*a1) return p; // параллельны
c1=-L11.X*a1-L11.Y*b1; c2=-L21.X*a2-L21.Y*b2;
p.X=(float)((b2*c1-b1*c2)/(a2*b1-a1*b2));
p.Y=(float)((a1*c2-a2*c1)/(a2*b1-a1*b2));
return p;
}
float pline(PointF p, PointF l1, PointF l2) {
double a, b, c, t, r; // расстояние точки от прямой
a=l2.Y-l1.Y;
b=l1.X-l2.X;
c=-l1.X*a-l1.Y*b;
t=Math.Sqrt(a*a+b*
;
r=Math.Abs((a*p.X+b*p.Y+c)/t);
return (float)r;
}
unsafeprivatebool getLine(int n, PointF[] v, PointF *ro1, PointF *ro2, float r) {
int i; // осреднение массива точек прямой
double xx, xy, yy;
double[] d = newdouble[2];
double[,] a = newdouble[2,2];
double[,] w = newdouble[2,2];
PointF u = newPointF();
PointF p = newPointF();
PointF dir = newPointF();
if (n<2 ) returnfalse;
p.X=0; p.Y=0; // средняя точка линии
for (i=0; i<n; i++) { p.X+=v[i].X; p.Y+=v[i].Y; } // суммируем координаты точек
p.X/=(float)n; p.Y/=(float)n; // средние значения координат точек
xx=xy=yy=0F; // вычитаем из координат точек их средние значения
for (i=0; i<n; i++) { u.X=v[i].X-p.X; u.Y=v[i].Y-p.Y; xx+=u.X*u.X; xy+=u.X*u.Y; yy+=u.Y*u.Y; }
a[0,0]=xx; a[0,1]=xy; a[1,0]=xy; a[1,1]=yy; // заносим в матрицу
jacobi(2,a,d,w);
if (d[0]>d[1]) { dir.X=(float)w[0,0]; dir.Y=(float)w[1,0]; } // единичный вектор (направление линии)
else { dir.X=(float)w[0,1]; dir.Y=(float)w[1,1]; }
(*ro1).X=(float)(p.X-r*dir.X); // начало линии
(*ro1).Y=(float)(p.Y-r*dir.Y);
(*ro2).X=(float)(p.X+r*dir.X); // конец линии