NAME:quadrilateral2square
PURPOSE:warm (or map) an arbitrary quadrilateral onto a unit square
according to the 4-point correspondences:
(x0,y0) -> (0,0)
(x1,y1) -> (1,0)
(x2,y2) -> (1,1)
(x3,y3) -> (0,1)
This is the inverse function of square2quadrilateral.pro
The mapping is done using perspective transformation which preserve
lines in all orientations and permit quadrilateral to quadrilateral
mappings. see ref. bellow.
CATEGORY:image/grid manipulation
CALLING SEQUENCE:
res = square2quadrilateral(x0,y0,x1,y1,x2,y2,x3,y3,xin,yin)
INPUTS:
x0,y0,x1,y1,x2,y2,x3,y3 the coordinates of the quadrilateral
(see above for correspondance with the unit square). Can be
scalar or array. (x0,y0), (x1,y1), (x2,y2) and (x3,y3) are
given in the anticlockwise order.
xin,yin:the coordinates of the point(s) for which we want to do the
mapping. Can be scalar or array.
KEYWORD PARAMETERS:
/DOUBLE: use double precision to perform the computation
OUTPUTS:
(2,n) array: the new coodinates (xout, yout) of the (xin,yin)
point(s) after mapping.
If xin is a scalar, then n is equal to the number of elements of
x0. If xin is an array , then n is equal to the number of
elements of xin.
COMMON BLOCKS:none
SIDE EFFECTS:
RESTRICTIONS: I think degenerated quadrilateral (e.g. flat of
twisted) is not work. This has to be tested.
EXAMPLE:
IDL> splot,[0,5],[0,3],/nodata,xstyle=1,ystyle=1
IDL> tracegrille, findgen(11)*.1, findgen(11)*.1,color=indgen(12)*20
IDL> xin = (findgen(11)*.1)#replicate(1, 11)
IDL> yin = replicate(1, 11)#(findgen(11)*.1)
IDL> out = square2quadrilateral(2,1,3,0,5,1,2,3, xin, yin)
IDL> tracegrille, reform(out[0,*],11,11), reform(out[1,*],11,11),color=indgen(12)*20
IDL> inorg=quadrilateral2square(2,1,3,0,5,1,2,3,out[0,*],out[1,*])
IDL> tracegrille, reform(inorg[0,*],11,11), reform(inorg[1,*],11,11),color=indgen(12)*20
MODIFICATION HISTORY: