2018-07-18 18:05:34 +00:00
package lin
import "opslag.de/schobers/geom"
func basisToPoints ( p1 , p2 , p3 , p4 geom . PointF32 ) geom . Matrix3x3F32 {
var m = geom . Mx3x3F32 ( geom . Vec3F32 ( p1 . X , p1 . Y , 1 ) , geom . Vec3F32 ( p2 . X , p2 . Y , 1 ) , geom . Vec3F32 ( p3 . X , p3 . Y , 1 ) )
2019-03-06 18:06:08 +00:00
var v = m . Adj ( ) . MulVec ( geom . Vec3F32 ( p4 . X , p4 . Y , 1 ) )
return m . MulMx ( geom . Mx3x3F32 ( geom . Vec3F32 ( v . X , 0 , 0 ) , geom . Vec3F32 ( 0 , v . Y , 0 ) , geom . Vec3F32 ( 0 , 0 , v . Z ) ) )
2018-07-18 18:05:34 +00:00
}
// Projection32 calculates the projection matrix to transformation a point in rectangle src1, src2, src3, src4 to a point in rectangle dst1, dst2, dst3 and dst4.
func Projection32 ( src1 , dst1 , src2 , dst2 , src3 , dst3 , src4 , dst4 geom . PointF32 ) geom . Matrix3x3F32 {
var s = basisToPoints ( src1 , src2 , src3 , src4 )
var d = basisToPoints ( dst1 , dst2 , dst3 , dst4 )
2019-03-06 18:06:08 +00:00
return d . MulMx ( s . Adj ( ) )
2018-07-18 18:05:34 +00:00
}
// Project32 projects a point pt using the projection matrix p and returns the resulting point.
func Project32 ( p geom . Matrix3x3F32 , pt geom . PointF32 ) geom . PointF32 {
2019-03-06 18:06:08 +00:00
var res = p . MulVec ( geom . Vec3F32 ( pt . X , pt . Y , 1 ) )
2018-07-18 18:05:34 +00:00
return geom . PtF32 ( res . X / res . Z , res . Y / res . Z )
}