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