1 /***********************************************************************/
2 /* Open Visualization Data Explorer                                    */
3 /* (C) Copyright IBM Corp. 1989,1999                                   */
4 /* ALL RIGHTS RESERVED                                                 */
5 /* This code licensed under the                                        */
6 /*    "IBM PUBLIC LICENSE - Open Visualization Data Explorer"          */
7 /***********************************************************************/
8 /*
9  * $Header: /src/master/dx/src/exec/dxmods/bounds.c,v 1.3 1999/05/10 15:45:22 gda Exp $
10  */
11 
12 #include <dxconfig.h>
13 
14 
15 #include <math.h>
16 #include <dx/dx.h>
17 #include <string.h>
18 #include "bounds.h"
19 
20 
21 /* general bounding box functions */
22 
_dxf_BBoxPoint(Object o,Point * p,int flag)23 Object _dxf_BBoxPoint(Object o, Point *p, int flag)
24 {
25     Point b[8];
26 
27     if(!p || !DXBoundingBox(o, b))
28         return NULL;
29 
30 
31     switch(flag) {
32 
33       case BB_CENTER:
34         p->x = (b[7].x + b[0].x) / 2;
35         p->y = (b[7].y + b[0].y) / 2;
36         p->z = (b[7].z + b[0].z) / 2;
37         break;
38 
39       case BB_FRONT:
40         p->x = (b[7].x + b[0].x) / 2;
41         p->y = (b[7].y + b[0].y) / 2;
42         p->z = b[7].z;
43         break;
44 
45       case BB_BACK:
46         p->x = (b[7].x + b[0].x) / 2;
47         p->y = (b[7].y + b[0].y) / 2;
48         p->z = b[0].z;
49         break;
50 
51       case BB_RIGHT:
52         p->x = b[7].x;
53         p->y = (b[7].y + b[0].y) / 2;
54         p->z = (b[7].z + b[0].z) / 2;
55         break;
56 
57       case BB_LEFT:
58         p->x = b[0].x;
59         p->y = (b[7].y + b[0].y) / 2;
60         p->z = (b[7].z + b[0].z) / 2;
61         break;
62 
63       case BB_TOP:
64         p->x = (b[7].x + b[0].x) / 2;
65         p->y = b[7].y;
66         p->z = (b[7].z + b[0].z) / 2;
67         break;
68 
69       case BB_BOTTOM:
70         p->x = (b[7].x + b[0].x) / 2;
71         p->y = b[0].y;
72         p->z = (b[7].z + b[0].z) / 2;
73         break;
74 
75 
76       case BB_FRONTTOPRIGHT:
77         p->x = b[7].x;
78         p->y = b[7].y;
79         p->z = b[7].z;
80         break;
81 
82       case BB_FRONTTOPLEFT:
83         p->x = b[0].x;
84         p->y = b[7].y;
85         p->z = b[7].z;
86         break;
87 
88       case BB_FRONTBOTRIGHT:
89         p->x = b[7].x;
90         p->y = b[0].y;
91         p->z = b[7].z;
92         break;
93 
94       case BB_FRONTBOTLEFT:
95         p->x = b[0].x;
96         p->y = b[0].y;
97         p->z = b[7].z;
98         break;
99 
100       case BB_BACKTOPRIGHT:
101         p->x = b[7].x;
102         p->y = b[7].y;
103         p->z = b[0].z;
104         break;
105 
106       case BB_BACKTOPLEFT:
107         p->x = b[0].x;
108         p->y = b[7].y;
109         p->z = b[0].z;
110         break;
111 
112       case BB_BACKBOTRIGHT:
113         p->x = b[7].x;
114         p->y = b[0].y;
115         p->z = b[0].z;
116         break;
117 
118       case BB_BACKBOTLEFT:
119         p->x = b[0].x;
120         p->y = b[0].y;
121         p->z = b[0].z;
122         break;
123 
124 
125       default:
126         DXSetError(ERROR_BAD_PARAMETER, "bad flag value");
127         return NULL;
128     }
129 
130     return o;
131 }
132 
133 
_dxf_BBoxDistance(Object o,float * distance,int flag)134 Object _dxf_BBoxDistance(Object o, float *distance, int flag)
135 {
136     Point b[8];
137     Vector v;
138 
139     if(!distance || !DXBoundingBox(o, b))
140         return NULL;
141 
142     v = DXSub(b[7], b[0]);
143 
144     switch(flag) {
145       case BB_WIDTH:
146         *distance = v.x;
147         break;
148 
149       case BB_HEIGHT:
150         *distance = v.y;
151         break;
152 
153       case BB_DEPTH:
154         *distance = v.z;
155         break;
156 
157       case BB_DIAGONAL:
158         *distance = DXLength(v);
159         break;
160 
161       default:
162         DXSetError(ERROR_BAD_PARAMETER, "bad flag value");
163         return NULL;
164     }
165 
166 
167     return o;
168 }
169