Blame


1 058b0118 2005-01-03 devnull .TH ARITH3 3
2 058b0118 2005-01-03 devnull .SH NAME
3 058b0118 2005-01-03 devnull add3, sub3, neg3, div3, mul3, eqpt3, closept3, dot3, cross3, len3, dist3, unit3, midpt3, lerp3, reflect3, nearseg3, pldist3, vdiv3, vrem3, pn2f3, ppp2f3, fff2p3, pdiv4, add4, sub4 \- operations on 3-d points and planes
4 058b0118 2005-01-03 devnull .SH SYNOPSIS
5 058b0118 2005-01-03 devnull .PP
6 058b0118 2005-01-03 devnull .B
7 058b0118 2005-01-03 devnull #include <draw.h>
8 058b0118 2005-01-03 devnull .PP
9 058b0118 2005-01-03 devnull .B
10 058b0118 2005-01-03 devnull #include <geometry.h>
11 058b0118 2005-01-03 devnull .PP
12 058b0118 2005-01-03 devnull .B
13 058b0118 2005-01-03 devnull Point3 add3(Point3 a, Point3 b)
14 058b0118 2005-01-03 devnull .PP
15 058b0118 2005-01-03 devnull .B
16 058b0118 2005-01-03 devnull Point3 sub3(Point3 a, Point3 b)
17 058b0118 2005-01-03 devnull .PP
18 058b0118 2005-01-03 devnull .B
19 058b0118 2005-01-03 devnull Point3 neg3(Point3 a)
20 058b0118 2005-01-03 devnull .PP
21 058b0118 2005-01-03 devnull .B
22 058b0118 2005-01-03 devnull Point3 div3(Point3 a, double b)
23 058b0118 2005-01-03 devnull .PP
24 058b0118 2005-01-03 devnull .B
25 058b0118 2005-01-03 devnull Point3 mul3(Point3 a, double b)
26 058b0118 2005-01-03 devnull .PP
27 058b0118 2005-01-03 devnull .B
28 058b0118 2005-01-03 devnull int eqpt3(Point3 p, Point3 q)
29 058b0118 2005-01-03 devnull .PP
30 058b0118 2005-01-03 devnull .B
31 058b0118 2005-01-03 devnull int closept3(Point3 p, Point3 q, double eps)
32 058b0118 2005-01-03 devnull .PP
33 058b0118 2005-01-03 devnull .B
34 058b0118 2005-01-03 devnull double dot3(Point3 p, Point3 q)
35 058b0118 2005-01-03 devnull .PP
36 058b0118 2005-01-03 devnull .B
37 058b0118 2005-01-03 devnull Point3 cross3(Point3 p, Point3 q)
38 058b0118 2005-01-03 devnull .PP
39 058b0118 2005-01-03 devnull .B
40 058b0118 2005-01-03 devnull double len3(Point3 p)
41 058b0118 2005-01-03 devnull .PP
42 058b0118 2005-01-03 devnull .B
43 058b0118 2005-01-03 devnull double dist3(Point3 p, Point3 q)
44 058b0118 2005-01-03 devnull .PP
45 058b0118 2005-01-03 devnull .B
46 058b0118 2005-01-03 devnull Point3 unit3(Point3 p)
47 058b0118 2005-01-03 devnull .PP
48 058b0118 2005-01-03 devnull .B
49 058b0118 2005-01-03 devnull Point3 midpt3(Point3 p, Point3 q)
50 058b0118 2005-01-03 devnull .PP
51 058b0118 2005-01-03 devnull .B
52 058b0118 2005-01-03 devnull Point3 lerp3(Point3 p, Point3 q, double alpha)
53 058b0118 2005-01-03 devnull .PP
54 058b0118 2005-01-03 devnull .B
55 058b0118 2005-01-03 devnull Point3 reflect3(Point3 p, Point3 p0, Point3 p1)
56 058b0118 2005-01-03 devnull .PP
57 058b0118 2005-01-03 devnull .B
58 058b0118 2005-01-03 devnull Point3 nearseg3(Point3 p0, Point3 p1, Point3 testp)
59 058b0118 2005-01-03 devnull .PP
60 058b0118 2005-01-03 devnull .B
61 058b0118 2005-01-03 devnull double pldist3(Point3 p, Point3 p0, Point3 p1)
62 058b0118 2005-01-03 devnull .PP
63 058b0118 2005-01-03 devnull .B
64 058b0118 2005-01-03 devnull double vdiv3(Point3 a, Point3 b)
65 058b0118 2005-01-03 devnull .PP
66 058b0118 2005-01-03 devnull .B
67 058b0118 2005-01-03 devnull Point3 vrem3(Point3 a, Point3 b)
68 058b0118 2005-01-03 devnull .PP
69 058b0118 2005-01-03 devnull .B
70 058b0118 2005-01-03 devnull Point3 pn2f3(Point3 p, Point3 n)
71 058b0118 2005-01-03 devnull .PP
72 058b0118 2005-01-03 devnull .B
73 058b0118 2005-01-03 devnull Point3 ppp2f3(Point3 p0, Point3 p1, Point3 p2)
74 058b0118 2005-01-03 devnull .PP
75 058b0118 2005-01-03 devnull .B
76 058b0118 2005-01-03 devnull Point3 fff2p3(Point3 f0, Point3 f1, Point3 f2)
77 058b0118 2005-01-03 devnull .PP
78 058b0118 2005-01-03 devnull .B
79 058b0118 2005-01-03 devnull Point3 pdiv4(Point3 a)
80 058b0118 2005-01-03 devnull .PP
81 058b0118 2005-01-03 devnull .B
82 058b0118 2005-01-03 devnull Point3 add4(Point3 a, Point3 b)
83 058b0118 2005-01-03 devnull .PP
84 058b0118 2005-01-03 devnull .B
85 058b0118 2005-01-03 devnull Point3 sub4(Point3 a, Point3 b)
86 058b0118 2005-01-03 devnull .SH DESCRIPTION
87 058b0118 2005-01-03 devnull These routines do arithmetic on points and planes in affine or projective 3-space.
88 058b0118 2005-01-03 devnull Type
89 058b0118 2005-01-03 devnull .B Point3
90 058b0118 2005-01-03 devnull is
91 058b0118 2005-01-03 devnull .IP
92 058b0118 2005-01-03 devnull .EX
93 058b0118 2005-01-03 devnull .ta 6n
94 058b0118 2005-01-03 devnull typedef struct Point3 Point3;
95 058b0118 2005-01-03 devnull struct Point3{
96 058b0118 2005-01-03 devnull double x, y, z, w;
97 058b0118 2005-01-03 devnull };
98 058b0118 2005-01-03 devnull .EE
99 058b0118 2005-01-03 devnull .PP
100 058b0118 2005-01-03 devnull Routines whose names end in
101 058b0118 2005-01-03 devnull .B 3
102 058b0118 2005-01-03 devnull operate on vectors or ordinary points in affine 3-space, represented by their Euclidean
103 058b0118 2005-01-03 devnull .B (x,y,z)
104 058b0118 2005-01-03 devnull coordinates.
105 058b0118 2005-01-03 devnull (They assume
106 058b0118 2005-01-03 devnull .B w=1
107 058b0118 2005-01-03 devnull in their arguments, and set
108 058b0118 2005-01-03 devnull .B w=1
109 058b0118 2005-01-03 devnull in their results.)
110 058b0118 2005-01-03 devnull .TF reflect3
111 058b0118 2005-01-03 devnull .TP
112 058b0118 2005-01-03 devnull Name
113 058b0118 2005-01-03 devnull Description
114 058b0118 2005-01-03 devnull .TP
115 058b0118 2005-01-03 devnull .B add3
116 058b0118 2005-01-03 devnull Add the coordinates of two points.
117 058b0118 2005-01-03 devnull .TP
118 058b0118 2005-01-03 devnull .B sub3
119 058b0118 2005-01-03 devnull Subtract coordinates of two points.
120 058b0118 2005-01-03 devnull .TP
121 058b0118 2005-01-03 devnull .B neg3
122 058b0118 2005-01-03 devnull Negate the coordinates of a point.
123 058b0118 2005-01-03 devnull .TP
124 058b0118 2005-01-03 devnull .B mul3
125 058b0118 2005-01-03 devnull Multiply coordinates by a scalar.
126 058b0118 2005-01-03 devnull .TP
127 058b0118 2005-01-03 devnull .B div3
128 058b0118 2005-01-03 devnull Divide coordinates by a scalar.
129 058b0118 2005-01-03 devnull .TP
130 058b0118 2005-01-03 devnull .B eqpt3
131 058b0118 2005-01-03 devnull Test two points for exact equality.
132 058b0118 2005-01-03 devnull .TP
133 058b0118 2005-01-03 devnull .B closept3
134 058b0118 2005-01-03 devnull Is the distance between two points smaller than
135 058b0118 2005-01-03 devnull .IR eps ?
136 058b0118 2005-01-03 devnull .TP
137 058b0118 2005-01-03 devnull .B dot3
138 058b0118 2005-01-03 devnull Dot product.
139 058b0118 2005-01-03 devnull .TP
140 058b0118 2005-01-03 devnull .B cross3
141 058b0118 2005-01-03 devnull Cross product.
142 058b0118 2005-01-03 devnull .TP
143 058b0118 2005-01-03 devnull .B len3
144 058b0118 2005-01-03 devnull Distance to the origin.
145 058b0118 2005-01-03 devnull .TP
146 058b0118 2005-01-03 devnull .B dist3
147 058b0118 2005-01-03 devnull Distance between two points.
148 058b0118 2005-01-03 devnull .TP
149 058b0118 2005-01-03 devnull .B unit3
150 058b0118 2005-01-03 devnull A unit vector parallel to
151 058b0118 2005-01-03 devnull .IR p .
152 058b0118 2005-01-03 devnull .TP
153 058b0118 2005-01-03 devnull .B midpt3
154 058b0118 2005-01-03 devnull The midpoint of line segment
155 058b0118 2005-01-03 devnull .IR pq .
156 058b0118 2005-01-03 devnull .TP
157 058b0118 2005-01-03 devnull .B lerp3
158 058b0118 2005-01-03 devnull Linear interpolation between
159 058b0118 2005-01-03 devnull .I p
160 058b0118 2005-01-03 devnull and
161 058b0118 2005-01-03 devnull .IR q .
162 058b0118 2005-01-03 devnull .TP
163 058b0118 2005-01-03 devnull .B reflect3
164 058b0118 2005-01-03 devnull The reflection of point
165 058b0118 2005-01-03 devnull .I p
166 058b0118 2005-01-03 devnull in the segment joining
167 058b0118 2005-01-03 devnull .I p0
168 058b0118 2005-01-03 devnull and
169 058b0118 2005-01-03 devnull .IR p1 .
170 058b0118 2005-01-03 devnull .TP
171 058b0118 2005-01-03 devnull .B nearseg3
172 058b0118 2005-01-03 devnull The closest point to
173 058b0118 2005-01-03 devnull .I testp
174 058b0118 2005-01-03 devnull on segment
175 058b0118 2005-01-03 devnull .IR "p0 p1" .
176 058b0118 2005-01-03 devnull .TP
177 058b0118 2005-01-03 devnull .B pldist3
178 058b0118 2005-01-03 devnull The distance from
179 058b0118 2005-01-03 devnull .I p
180 058b0118 2005-01-03 devnull to segment
181 058b0118 2005-01-03 devnull .IR "p0 p1" .
182 058b0118 2005-01-03 devnull .TP
183 058b0118 2005-01-03 devnull .B vdiv3
184 058b0118 2005-01-03 devnull Vector divide \(em the length of the component of
185 058b0118 2005-01-03 devnull .I a
186 058b0118 2005-01-03 devnull parallel to
187 058b0118 2005-01-03 devnull .IR b ,
188 058b0118 2005-01-03 devnull in units of the length of
189 058b0118 2005-01-03 devnull .IR b .
190 058b0118 2005-01-03 devnull .TP
191 058b0118 2005-01-03 devnull .B vrem3
192 058b0118 2005-01-03 devnull Vector remainder \(em the component of
193 058b0118 2005-01-03 devnull .I a
194 058b0118 2005-01-03 devnull perpendicular to
195 058b0118 2005-01-03 devnull .IR b .
196 058b0118 2005-01-03 devnull Ignoring roundoff, we have
197 058b0118 2005-01-03 devnull .BR "eqpt3(add3(mul3(b, vdiv3(a, b)), vrem3(a, b)), a)" .
198 058b0118 2005-01-03 devnull .PD
199 058b0118 2005-01-03 devnull .PP
200 058b0118 2005-01-03 devnull The following routines convert amongst various representations of points
201 058b0118 2005-01-03 devnull and planes. Planes are represented identically to points, by duality;
202 058b0118 2005-01-03 devnull a point
203 058b0118 2005-01-03 devnull .B p
204 058b0118 2005-01-03 devnull is on a plane
205 058b0118 2005-01-03 devnull .B q
206 058b0118 2005-01-03 devnull whenever
207 058b0118 2005-01-03 devnull .BR p.x*q.x+p.y*q.y+p.z*q.z+p.w*q.w=0 .
208 058b0118 2005-01-03 devnull Although when dealing with affine points we assume
209 058b0118 2005-01-03 devnull .BR p.w=1 ,
210 058b0118 2005-01-03 devnull we can't make the same assumption for planes.
211 058b0118 2005-01-03 devnull The names of these routines are extra-cryptic. They contain an
212 058b0118 2005-01-03 devnull .B f
213 058b0118 2005-01-03 devnull (for `face') to indicate a plane,
214 058b0118 2005-01-03 devnull .B p
215 058b0118 2005-01-03 devnull for a point and
216 058b0118 2005-01-03 devnull .B n
217 058b0118 2005-01-03 devnull for a normal vector.
218 058b0118 2005-01-03 devnull The number
219 058b0118 2005-01-03 devnull .B 2
220 058b0118 2005-01-03 devnull abbreviates the word `to.'
221 058b0118 2005-01-03 devnull The number
222 058b0118 2005-01-03 devnull .B 3
223 058b0118 2005-01-03 devnull reminds us, as before, that we're dealing with affine points.
224 058b0118 2005-01-03 devnull Thus
225 058b0118 2005-01-03 devnull .B pn2f3
226 058b0118 2005-01-03 devnull takes a point and a normal vector and returns the corresponding plane.
227 058b0118 2005-01-03 devnull .TF reflect3
228 058b0118 2005-01-03 devnull .TP
229 058b0118 2005-01-03 devnull Name
230 058b0118 2005-01-03 devnull Description
231 058b0118 2005-01-03 devnull .TP
232 058b0118 2005-01-03 devnull .B pn2f3
233 058b0118 2005-01-03 devnull Compute the plane passing through
234 058b0118 2005-01-03 devnull .I p
235 058b0118 2005-01-03 devnull with normal
236 058b0118 2005-01-03 devnull .IR n .
237 058b0118 2005-01-03 devnull .TP
238 058b0118 2005-01-03 devnull .B ppp2f3
239 058b0118 2005-01-03 devnull Compute the plane passing through three points.
240 058b0118 2005-01-03 devnull .TP
241 058b0118 2005-01-03 devnull .B fff2p3
242 058b0118 2005-01-03 devnull Compute the intersection point of three planes.
243 058b0118 2005-01-03 devnull .PD
244 058b0118 2005-01-03 devnull .PP
245 058b0118 2005-01-03 devnull The names of the following routines end in
246 058b0118 2005-01-03 devnull .B 4
247 058b0118 2005-01-03 devnull because they operate on points in projective 4-space,
248 058b0118 2005-01-03 devnull represented by their homogeneous coordinates.
249 058b0118 2005-01-03 devnull .TP
250 058b0118 2005-01-03 devnull pdiv4
251 058b0118 2005-01-03 devnull Perspective division. Divide
252 058b0118 2005-01-03 devnull .B p.w
253 058b0118 2005-01-03 devnull into
254 058b0118 2005-01-03 devnull .IR p 's
255 058b0118 2005-01-03 devnull coordinates, converting to affine coordinates.
256 058b0118 2005-01-03 devnull If
257 058b0118 2005-01-03 devnull .B p.w
258 058b0118 2005-01-03 devnull is zero, the result is the same as the argument.
259 058b0118 2005-01-03 devnull .TP
260 058b0118 2005-01-03 devnull add4
261 058b0118 2005-01-03 devnull Add the coordinates of two points.
262 058b0118 2005-01-03 devnull .PD
263 058b0118 2005-01-03 devnull .TP
264 058b0118 2005-01-03 devnull sub4
265 058b0118 2005-01-03 devnull Subtract the coordinates of two points.
266 058b0118 2005-01-03 devnull .SH SOURCE
267 c3674de4 2005-01-11 devnull .B \*9/src/libgeometry
268 058b0118 2005-01-03 devnull .SH "SEE ALSO
269 d32deab1 2020-08-16 rsc .MR matrix (3)