1 |
– |
/* Copyright (c) 1995 Regents of the University of California */ |
2 |
– |
|
1 |
|
#ifndef lint |
2 |
< |
static char SCCSid[] = "$SunId$ LBL"; |
2 |
> |
static const char RCSid[] = "$Id$"; |
3 |
|
#endif |
6 |
– |
|
4 |
|
/* |
5 |
|
* pmapgen.c: general routines for 2-D perspective mappings. |
6 |
|
* These routines are independent of the poly structure, |
17 |
|
#define TOLERANCE 1e-13 |
18 |
|
#define ZERO(x) ((x)<TOLERANCE && (x)>-TOLERANCE) |
19 |
|
|
20 |
< |
#define X(i) quad[i][0] /* quadrilateral x and y */ |
21 |
< |
#define Y(i) quad[i][1] |
20 |
> |
#define X(i) qdrl[i][0] /* quadrilateral x and y */ |
21 |
> |
#define Y(i) qdrl[i][1] |
22 |
|
|
23 |
|
/* |
24 |
|
* pmap_quad_rect: find mapping between quadrilateral and rectangle. |
25 |
|
* The correspondence is: |
26 |
|
* |
27 |
< |
* quad[0] --> (u0,v0) |
28 |
< |
* quad[1] --> (u1,v0) |
29 |
< |
* quad[2] --> (u1,v1) |
30 |
< |
* quad[3] --> (u0,v1) |
27 |
> |
* qdrl[0] --> (u0,v0) |
28 |
> |
* qdrl[1] --> (u1,v0) |
29 |
> |
* qdrl[2] --> (u1,v1) |
30 |
> |
* qdrl[3] --> (u0,v1) |
31 |
|
* |
32 |
|
* This method of computing the adjoint numerically is cheaper than |
33 |
|
* computing it symbolically. |
34 |
|
*/ |
35 |
|
|
36 |
< |
pmap_quad_rect(u0, v0, u1, v1, quad, QR) |
36 |
> |
pmap_quad_rect(u0, v0, u1, v1, qdrl, QR) |
37 |
|
double u0, v0, u1, v1; /* bounds of rectangle */ |
38 |
< |
double quad[4][2]; /* vertices of quadrilateral */ |
39 |
< |
double QR[3][3]; /* quad->rect transform (returned) */ |
38 |
> |
double qdrl[4][2]; /* vertices of quadrilateral */ |
39 |
> |
double QR[3][3]; /* qdrl->rect transform (returned) */ |
40 |
|
{ |
41 |
|
int ret; |
42 |
|
double du, dv; |
43 |
< |
double RQ[3][3]; /* rect->quad transform */ |
43 |
> |
double RQ[3][3]; /* rect->qdrl transform */ |
44 |
|
|
45 |
|
du = u1-u0; |
46 |
|
dv = v1-v0; |
50 |
|
} |
51 |
|
|
52 |
|
/* first find mapping from unit uv square to xy quadrilateral */ |
53 |
< |
ret = pmap_square_quad(quad, RQ); |
53 |
> |
ret = pmap_square_quad(qdrl, RQ); |
54 |
|
if (ret==PMAP_BAD) return PMAP_BAD; |
55 |
|
|
56 |
|
/* concatenate transform from uv rectangle (u0,v0,u1,v1) to unit square */ |
75 |
|
* pmap_square_quad: find mapping between unit square and quadrilateral. |
76 |
|
* The correspondence is: |
77 |
|
* |
78 |
< |
* (0,0) --> quad[0] |
79 |
< |
* (1,0) --> quad[1] |
80 |
< |
* (1,1) --> quad[2] |
81 |
< |
* (0,1) --> quad[3] |
78 |
> |
* (0,0) --> qdrl[0] |
79 |
> |
* (1,0) --> qdrl[1] |
80 |
> |
* (1,1) --> qdrl[2] |
81 |
> |
* (0,1) --> qdrl[3] |
82 |
|
*/ |
83 |
|
|
84 |
< |
pmap_square_quad(quad, SQ) |
85 |
< |
register double quad[4][2]; /* vertices of quadrilateral */ |
86 |
< |
register double SQ[3][3]; /* square->quad transform */ |
84 |
> |
pmap_square_quad(qdrl, SQ) |
85 |
> |
register double qdrl[4][2]; /* vertices of quadrilateral */ |
86 |
> |
register double SQ[3][3]; /* square->qdrl transform */ |
87 |
|
{ |
88 |
|
double px, py; |
89 |
|
|