Итак, если я подсталяю данные штрих-кода, полученные прямым путем, то при обратном вычислении исходный треугольник получается. Но на параметры штрих-кода наверняка накладываются ограничения (они не могут быть произвольными). Эти ограничения можно обнаружить, анализируя формулы прямой модели. Чем сейчас и занимаюсь.
Например, я беру данные из треугольника, где корректировал штрих-код:
Код:
restart;xc:=.8038324325:yc:=2.367245957:c:=9.873863542: if xc=0 then xc:=.000000001 fi:b:=sqrt(xc^2+yc^2):a:=sqrt((c-xc)^2+yc^2):k:=yc*(a-b)/((xc-b)*a+(c-xc)*b):plot({k*x-k*b,k*x-k*(c-a),k*x-c/b*(k*xc-yc),yc/xc*x,0*x,yc/(xc-c)*x-yc/(xc-c)*c},x=-1..11,y=-7..3,thickness=3);k:=evalf(k);p1:=evalf(-k*b);p2:=evalf(-k*(c-a));p3:=evalf(-c/b*(k*xc-yc));
Получил в итоге k := 2.401635764 ; P1 := -6.004089410 ; P2 := -1.200817875 ; P3 := 1.724897763 ;
Запустил эти данные в обратную модель:
Код:
restart;b:=-p1/k;c:=a-p2/k;xc:=1/2/c*(b^2+c^2-a^2);yc:=sqrt(b^2-xc^2);t:=k*xc-yc+b/c*p3;k:=2.401635764;p1:=-6.004089410;p2:=-1.200817875;p3:=1.724897763;a:=evalf(solve(t=0,a));b:=evalf(b);c:=evalf(c);xc:=evalf(xc);yc:=evalf(yc);plot({k*x+p1,k*x+p2,k*x+p3,yc/xc*x,yc*(x-c)/(xc-c)},x=-2..10,y=-1..4,thickness=2);
и получил исходный треугольник:
Описываю обратную модель:
Заданы 4 переметра параллельных прямых штрих-кода:
k, P1, P2, P3. Уравнения прямых:
Y1 = kx + P1 ; Y2 = kx + P2 ; Y3 = kx + P3.
Алгоритм вычислений:
1)
b = - P1/k2)
c = a - P2/k3)
Xc = (b^2+c^2-a^2)/(2c)4)
Yc = sqrt(b^2 - Xc^2)5) сторона
a ищется как положительный корень уравнения
kXc - Yc + b P3 / c = 0 . (В программе это оператор
a:=evalf(solve(t=0,a));).
Здесь
Xc, Yc - координаты вершины
С треугольника.