| 20 |
|
#define TOLERANCE 1e-13 |
| 21 |
|
#define ZERO(x) ((x)<TOLERANCE && (x)>-TOLERANCE) |
| 22 |
|
|
| 23 |
< |
#define X(i) quad[i][0] /* quadrilateral x and y */ |
| 24 |
< |
#define Y(i) quad[i][1] |
| 23 |
> |
#define X(i) qdrl[i][0] /* quadrilateral x and y */ |
| 24 |
> |
#define Y(i) qdrl[i][1] |
| 25 |
|
|
| 26 |
|
/* |
| 27 |
|
* pmap_quad_rect: find mapping between quadrilateral and rectangle. |
| 28 |
|
* The correspondence is: |
| 29 |
|
* |
| 30 |
< |
* quad[0] --> (u0,v0) |
| 31 |
< |
* quad[1] --> (u1,v0) |
| 32 |
< |
* quad[2] --> (u1,v1) |
| 33 |
< |
* quad[3] --> (u0,v1) |
| 30 |
> |
* qdrl[0] --> (u0,v0) |
| 31 |
> |
* qdrl[1] --> (u1,v0) |
| 32 |
> |
* qdrl[2] --> (u1,v1) |
| 33 |
> |
* qdrl[3] --> (u0,v1) |
| 34 |
|
* |
| 35 |
|
* This method of computing the adjoint numerically is cheaper than |
| 36 |
|
* computing it symbolically. |
| 37 |
|
*/ |
| 38 |
|
|
| 39 |
< |
pmap_quad_rect(u0, v0, u1, v1, quad, QR) |
| 39 |
> |
pmap_quad_rect(u0, v0, u1, v1, qdrl, QR) |
| 40 |
|
double u0, v0, u1, v1; /* bounds of rectangle */ |
| 41 |
< |
double quad[4][2]; /* vertices of quadrilateral */ |
| 42 |
< |
double QR[3][3]; /* quad->rect transform (returned) */ |
| 41 |
> |
double qdrl[4][2]; /* vertices of quadrilateral */ |
| 42 |
> |
double QR[3][3]; /* qdrl->rect transform (returned) */ |
| 43 |
|
{ |
| 44 |
|
int ret; |
| 45 |
|
double du, dv; |
| 46 |
< |
double RQ[3][3]; /* rect->quad transform */ |
| 46 |
> |
double RQ[3][3]; /* rect->qdrl transform */ |
| 47 |
|
|
| 48 |
|
du = u1-u0; |
| 49 |
|
dv = v1-v0; |
| 53 |
|
} |
| 54 |
|
|
| 55 |
|
/* first find mapping from unit uv square to xy quadrilateral */ |
| 56 |
< |
ret = pmap_square_quad(quad, RQ); |
| 56 |
> |
ret = pmap_square_quad(qdrl, RQ); |
| 57 |
|
if (ret==PMAP_BAD) return PMAP_BAD; |
| 58 |
|
|
| 59 |
|
/* concatenate transform from uv rectangle (u0,v0,u1,v1) to unit square */ |
| 78 |
|
* pmap_square_quad: find mapping between unit square and quadrilateral. |
| 79 |
|
* The correspondence is: |
| 80 |
|
* |
| 81 |
< |
* (0,0) --> quad[0] |
| 82 |
< |
* (1,0) --> quad[1] |
| 83 |
< |
* (1,1) --> quad[2] |
| 84 |
< |
* (0,1) --> quad[3] |
| 81 |
> |
* (0,0) --> qdrl[0] |
| 82 |
> |
* (1,0) --> qdrl[1] |
| 83 |
> |
* (1,1) --> qdrl[2] |
| 84 |
> |
* (0,1) --> qdrl[3] |
| 85 |
|
*/ |
| 86 |
|
|
| 87 |
< |
pmap_square_quad(quad, SQ) |
| 88 |
< |
register double quad[4][2]; /* vertices of quadrilateral */ |
| 89 |
< |
register double SQ[3][3]; /* square->quad transform */ |
| 87 |
> |
pmap_square_quad(qdrl, SQ) |
| 88 |
> |
register double qdrl[4][2]; /* vertices of quadrilateral */ |
| 89 |
> |
register double SQ[3][3]; /* square->qdrl transform */ |
| 90 |
|
{ |
| 91 |
|
double px, py; |
| 92 |
|
|