source: trunk/SRC/Interpolation/quadrilateral2square.pro @ 378

Last change on this file since 378 was 372, checked in by pinsard, 16 years ago

improvements of headers (alignments)

  • Property svn:keywords set to Id
File size: 4.9 KB
Line 
1;+
2;
3; @file_comments
4; warm (or map) an arbitrary quadrilateral onto a unit square
5; according to the 4-point correspondences:
6;  - (x0,y0) -> (0,0)
7;  - (x1,y1) -> (1,0)
8;  - (x2,y2) -> (1,1)
9;  - (x3,y3) -> (0,1)
10;
11; This is the inverse function of <pro>square2quadrilateral</pro>.
12;
13; The mapping is done using perspective transformation which preserve
14; lines in all orientations and permit quadrilateral to quadrilateral
15; mappings. see ref. below.
16;
17; @categories
18; Picture, Grid
19;
20; @param x0in {in}{required}
21; @param y0in {in}{required}
22; @param x1in {in}{required}
23; @param y1in {in}{required}
24; @param x2in {in}{required}
25; @param y2in {in}{required}
26; @param x3in {in}{required}
27; @param y3in  {in}{required}
28; the coordinates of the quadrilateral
29; (see above for correspondence with the unit square). Can be
30; scalar or array. (x0,y0), (x1,y1), (x2,y2) and (x3,y3) are
31; given in the anticlockwise order.
32;
33; @param xxin {in}{required}
34; the coordinates of the point(s) for which we want to do the mapping.
35; Can be scalar or array.
36;
37; @param yyin {in}{required}
38; the coordinates of the point(s) for which we want to do the mapping.
39; Can be scalar or array.
40;
41; @keyword PERF {type=salar 0 or 1}{default=0}
42; activate to print the elapsed time spent within quadrilateral2square
43;
44; @keyword DOUBLE {type=salar 0 or 1}{default=0}
45; activate to perform double precision computation
46;
47; @returns
48; (2,n) array: the new coordinates (xout,yout) of the (xin,yin) point(s) after
49; mapping.
50; If xin is a scalar, then n is equal to the number of elements of x0.
51; If xin is an array, then n is equal to the number of elements of xin.
52;
53; @restrictions
54; I think degenerated quadrilateral (e.g. flat of twisted) is not work.
55; This has to be tested.
56;
57; @examples
58;
59;   IDL> splot,[0,5],[0,3],/nodata,xstyle=1,ystyle=1
60;   IDL> tracegrille, findgen(11)*.1, findgen(11)*.1,color=indgen(12)*20
61;   IDL> xin = (findgen(11)*.1)#replicate(1, 11)
62;   IDL> yin = replicate(1, 11)#(findgen(11)*.1)
63;   IDL> out = square2quadrilateral(2,1,3,0,5,1,2,3, xin, yin)
64;   IDL> tracegrille, reform(out[0,*],11,11), reform(out[1,*],11,11),color=indgen(12)*20
65;
66;   IDL> inorg=quadrilateral2square(2,1,3,0,5,1,2,3,out[0,*],out[1,*])
67;   IDL> tracegrille, reform(inorg[0,*],11,11), reform(inorg[1,*],11,11),color=indgen(12)*20
68;
69; @history
70;      Sebastien Masson (smasson\@lodyc.jussieu.fr)
71;      August 2003
72;      Based on "Digital Image Warping" by G. Wolberg
73;      IEEE Computer Society Press, Los Alamitos, California
74;      Chapter 3, see p 52-56
75;
76;
77; @version
78; $Id$
79;
80;-
81FUNCTION quadrilateral2square, x0in, y0in, x1in, y1in, x2in, y2in $
82                             , x3in, y3in, xxin, yyin $
83                             , PERF=perf, DOUBLE=double
84;
85  compile_opt idl2, strictarrsubs
86;
87tempsone = systime(1)
88;
89; Warning, wrong definition of (x2,y2) and (x3,y3) at the bottom of
90; page 54 of Wolberg's book, see figure 3.7 page 56 for the good
91; definition.
92;
93  IF keyword_set(double) THEN BEGIN
94    x0 = double(x0in)
95    x1 = double(x1in)
96    x2 = double(x2in)
97    x3 = double(x3in)
98    y0 = double(y0in)
99    y1 = double(y1in)
100    y2 = double(y2in)
101    y3 = double(y3in)
102    xin = double(xxin)
103    yin = double(yyin)
104  ENDIF ELSE BEGIN
105    x0 = float(x0in)
106    x1 = float(x1in)
107    x2 = float(x2in)
108    x3 = float(x3in)
109    y0 = float(y0in)
110    y1 = float(y1in)
111    y2 = float(y2in)
112    y3 = float(y3in)
113    xin = float(xxin)
114    yin = float(yyin)
115  ENDELSE
116;
117; get the matrix A
118;
119  a = square2quadrilateral(x0in, y0in, x1in, y1in, x2in, y2in, x3in, y3in, DOUBLE = double)
120;
121; compute the adjoint matrix
122;
123  IF keyword_set(double) THEN adj = dblarr(9, n_elements(x0)) $
124  ELSE adj = fltarr(9, n_elements(x0))
125;
126  adj[0, *] = a[4, *]        -a[7, *]*a[5, *]
127  adj[1, *] = a[7, *]*a[2, *]-a[1, *]
128  adj[2, *] = a[1, *]*a[5, *]-a[4, *]*a[2, *]
129  adj[3, *] = a[6, *]*a[5, *]-a[3, *]
130  adj[4, *] = a[0, *]        -a[6, *]*a[2, *]
131  adj[5, *] = a[3, *]*a[2, *]-a[0, *]*a[5, *]
132  adj[6, *] = a[3, *]*a[7, *]-a[6, *]*a[4, *]
133  adj[7, *] = a[6, *]*a[1, *]-a[0, *]*a[7, *]
134  adj[8, *] = a[0, *]*a[4, *]-a[3, *]*a[1, *]
135;
136  IF n_elements(xin) EQ 1 THEN BEGIN
137    xin = replicate(xin, n_elements(x0))
138    yin = replicate(yin, n_elements(x0))
139  ENDIF
140;
141; compute xprime, yprime and wprime
142;
143  IF n_elements(x0) EQ 1 THEN BEGIN
144    wpr = 1./(adj[6]*xin + adj[7]*yin + adj[8])
145  ENDIF ELSE BEGIN
146    wpr = 1./(adj[6, *]*xin + adj[7, *]*yin + adj[8, *])
147  ENDELSE
148  xpr = xin*wpr
149  ypr = yin*wpr
150;
151  IF keyword_set(double) THEN res = dblarr(2, n_elements(xin)) $
152  ELSE res = fltarr(2, n_elements(xin))
153;
154  IF n_elements(x0) EQ 1 THEN BEGIN
155    res[0, *] = xpr*adj[0] + ypr*adj[1] +wpr*adj[2]
156    res[1, *] = xpr*adj[3] + ypr*adj[4] +wpr*adj[5]
157  ENDIF ELSE BEGIN
158    res[0, *] = xpr*adj[0, *] + ypr*adj[1, *] +wpr*adj[2, *]
159    res[1, *] = xpr*adj[3, *] + ypr*adj[4, *] +wpr*adj[5, *]
160  ENDELSE
161;
162  IF keyword_set(perf) THEN print, 'time quadrilateral2square', systime(1)-tempsone
163
164  RETURN, res
165END
Note: See TracBrowser for help on using the repository browser.