Аффинные преобразования - математика
Добавлено: 29 дек 2008, 00:24
Геоинформационные системы (ГИС) и Дистанционное зондирование Земли
https://gis-lab.info/forum/
Код: Выделить всё
X = a0 + a1 x + a2 y
Y = b0 + b1 x + b2 y
Код: Выделить всё
x = -((a2*b0 - a0*b2 + b2*X - a2*Y)/(a2*b1 - a1*b2))
y = -((-(a1*b0) + a0*b1 - b1*X + a1*Y)/(a2*b1 - a1*b2))
Код: Выделить всё
x = -((a2*b0 - a0*b2)/(a2*b1 - a1*b2)) - X*b2/(a2*b1 - a1*b2) + Y*a2/(a2*b1 - a1*b2)
y = -((-(a1*b0) + a0*b1)/(a2*b1 - a1*b2)) + X*b1/(a2*b1 - a1*b2) - Y*a1/(a2*b1 - a1*b2)
Код: Выделить всё
> x.old = runif(20,1000,2000)
> y.old = runif(20,3000,7000)
> a10= 330; a11= 1.3; a12=-0.5;
> a20=-567; a21=-0.7; a22= 0.3;
>
> mtr = rbind(c(a10,a20),
+ c(a11,a21),
+ c(a12,a22) )
> print(mtr)
[,1] [,2]
[1,] 330.0 -567.0
[2,] 1.3 -0.7
[3,] -0.5 0.3
>
> coord.old = cbind(rep(1,length(x.old)),x.old,y.old)
> coord.new = coord.old %*% mtr
>
> x.new = coord.new[,1]
> y.new = coord.new[,2]
>
> coef.x.forw = coef(lm(x.new~1+x.old+y.old))
> coef.y.forw = coef(lm(y.new~1+x.old+y.old))
> print(rbind(coef.x.forw,coef.y.forw))
(Intercept) x.old y.old
coef.x.forw 330 1.3 -0.5
coef.y.forw -567 -0.7 0.3
>
> coef.x.back = coef(lm(x.old~1+x.new+y.new))
> coef.y.back = coef(lm(y.old~1+x.new+y.new))
> print(rbind(coef.x.back,coef.y.back))
(Intercept) x.new y.new
coef.x.back 4612.5 7.5 12.5
coef.y.back 12652.5 17.5 32.5
>
> mtr.back = cbind(coef.x.back,coef.y.back)
> coord.tst = cbind(rep(1,length(x.old)),coord.new) %*% mtr.back
>
> summary(coord.tst - cbind(x.old,y.old))
coef.x.back coef.y.back
Min. :-2.728e-12 Min. :-3.638e-12
1st Qu.:-1.364e-12 1st Qu.:-3.638e-12
Median :-9.095e-13 Median :-2.728e-12
Mean :-9.095e-13 Mean :-2.592e-12
3rd Qu.:-4.547e-13 3rd Qu.:-1.819e-12
Max. : 0.000e+00 Max. : 0.000e+00