TurУбрал фиксированные оси заменил на вычисления.
Код:
Delta:=Determinant(M3);
cent[0] := a[0]*cos(alfa)*cos(alfa)+2*a[2]*sin(alfa)*cos(alfa)+a[1]*sin(alfa)*sin(alfa);
cent[1] := a[0]*sin(alfa)*sin(alfa)-2*a[2]*sin(alfa)*cos(alfa)+a[1]*cos(alfa)*cos(alfa);
a_axis:= Sqrt(abs( -Delta/(cent[0]*cent[0]*cent[1])));
b_axis:= Sqrt(abs( -Delta/(cent[0]*cent[1]*cent[1])));
Ни слова не понял
Цитата:
Изредка косяки. Но в нуль не уходит.
В старом варианте косяки один на тысячу и это неприемлимо. Ведь каждый день тесятки тысяч таблеток, сотни тысяч дуг и это только по одному каналу.
Fizykochemik, спасибо за отклик. Вы понимаете правильно. Речь идет об анализе изображений, последовательности фреймов. Есть много контуров таблеток. Эти контуры аппроксимированы эллипсами. Найдены средние значения полуосей a и b. Их я называю нормативным эллипсом. Дуга это непрерывная последовательность пикселей изображения.
Для каждой дуги нужно найти центр тела к которому относится эта дуга. Поскольку нормативный эллипс известен, то если дугу аппроксимировать этим эллипсом, то его центр можно считать центром тела. Поэтому задача в том чтобы по координатам точек дуги и нормативным длинам полуосей a и b найти координаты центра нормативного эллипса для этой конкретной дуги.
Любой эллипс полностью задан если известны его полуоси a и b, его центр Мо и его наклон. Поэтому если в уравнение
подставить новые значения x и y смещенные на координаты центра xo yo и повернутые на угол
то получим вместо уравнения
(*)
получим его же в преобразованном виде
т.е. здесь коэ-ты а11 а12.. выражены через полуоси a и b координаты центра xo yo и угол наклона
Из этого ур-я можно получить угол
Еще раз. Есть точки дуги x y. Подставляем их в ур-е (*), получаем переопределенную систему относительно а11 а22..., решаем ее и находим а11 а22... и из ур-я
находим
Затем из системы уравнений :
находим центр
Но оказалось что по чисто техническим причинам не удается всегда верно найти коэф-ты а11 а22... В старом варианте программы я находил отношения а11/а33 а22/а33..., поэтому как правило все работало почти всегда, но для эллипса вообще, а не для конкретного с осями а и b
Поэтому в принципе, т.е. с т. зр. математики эта задача уже решена, но технически пока не удается верно посчитать коэф-ты а11 а22..., т.к. как говорит Pavia происходит перегрузка double в строке (**) см ниже
Код:
function [a11 a12 a13 a22 a23 a33] = aquadric(x, y)
% входные x, y - координаты точек дуги
x2 = x.*x; y2 = y.*y; xy = x.*y;
one = ones(length(x),1);
X = [x2 y2 xy x y 1]; Y = one;
R = (X'*X)^(-1)*X'*Y; % (**)
a11 = R(1); a22 = R(2); a12 = R(3)/2;
a13 = R(4)/2; a23 = R(5)/2;
a33 = R(6) - 1;
end
Кстати, Pavia, я так и не понял почему следует вычитать единицу a33 = R(6) - 1 , а не просто уравнять а33 = R(6) ?
Emergency, все верно