|  | .TH ARITH3 3 | 
|  | .SH NAME | 
|  | 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 | 
|  | .SH SYNOPSIS | 
|  | .PP | 
|  | .B | 
|  | #include <draw.h> | 
|  | .PP | 
|  | .B | 
|  | #include <geometry.h> | 
|  | .PP | 
|  | .B | 
|  | Point3 add3(Point3 a, Point3 b) | 
|  | .PP | 
|  | .B | 
|  | Point3 sub3(Point3 a, Point3 b) | 
|  | .PP | 
|  | .B | 
|  | Point3 neg3(Point3 a) | 
|  | .PP | 
|  | .B | 
|  | Point3 div3(Point3 a, double b) | 
|  | .PP | 
|  | .B | 
|  | Point3 mul3(Point3 a, double b) | 
|  | .PP | 
|  | .B | 
|  | int eqpt3(Point3 p, Point3 q) | 
|  | .PP | 
|  | .B | 
|  | int closept3(Point3 p, Point3 q, double eps) | 
|  | .PP | 
|  | .B | 
|  | double dot3(Point3 p, Point3 q) | 
|  | .PP | 
|  | .B | 
|  | Point3 cross3(Point3 p, Point3 q) | 
|  | .PP | 
|  | .B | 
|  | double len3(Point3 p) | 
|  | .PP | 
|  | .B | 
|  | double dist3(Point3 p, Point3 q) | 
|  | .PP | 
|  | .B | 
|  | Point3 unit3(Point3 p) | 
|  | .PP | 
|  | .B | 
|  | Point3 midpt3(Point3 p, Point3 q) | 
|  | .PP | 
|  | .B | 
|  | Point3 lerp3(Point3 p, Point3 q, double alpha) | 
|  | .PP | 
|  | .B | 
|  | Point3 reflect3(Point3 p, Point3 p0, Point3 p1) | 
|  | .PP | 
|  | .B | 
|  | Point3 nearseg3(Point3 p0, Point3 p1, Point3 testp) | 
|  | .PP | 
|  | .B | 
|  | double pldist3(Point3 p, Point3 p0, Point3 p1) | 
|  | .PP | 
|  | .B | 
|  | double vdiv3(Point3 a, Point3 b) | 
|  | .PP | 
|  | .B | 
|  | Point3 vrem3(Point3 a, Point3 b) | 
|  | .PP | 
|  | .B | 
|  | Point3 pn2f3(Point3 p, Point3 n) | 
|  | .PP | 
|  | .B | 
|  | Point3 ppp2f3(Point3 p0, Point3 p1, Point3 p2) | 
|  | .PP | 
|  | .B | 
|  | Point3 fff2p3(Point3 f0, Point3 f1, Point3 f2) | 
|  | .PP | 
|  | .B | 
|  | Point3 pdiv4(Point3 a) | 
|  | .PP | 
|  | .B | 
|  | Point3 add4(Point3 a, Point3 b) | 
|  | .PP | 
|  | .B | 
|  | Point3 sub4(Point3 a, Point3 b) | 
|  | .SH DESCRIPTION | 
|  | These routines do arithmetic on points and planes in affine or projective 3-space. | 
|  | Type | 
|  | .B Point3 | 
|  | is | 
|  | .IP | 
|  | .EX | 
|  | .ta 6n | 
|  | typedef struct Point3 Point3; | 
|  | struct Point3{ | 
|  | double x, y, z, w; | 
|  | }; | 
|  | .EE | 
|  | .PP | 
|  | Routines whose names end in | 
|  | .B 3 | 
|  | operate on vectors or ordinary points in affine 3-space, represented by their Euclidean | 
|  | .B (x,y,z) | 
|  | coordinates. | 
|  | (They assume | 
|  | .B w=1 | 
|  | in their arguments, and set | 
|  | .B w=1 | 
|  | in their results.) | 
|  | .TF reflect3 | 
|  | .TP | 
|  | Name | 
|  | Description | 
|  | .TP | 
|  | .B add3 | 
|  | Add the coordinates of two points. | 
|  | .TP | 
|  | .B sub3 | 
|  | Subtract coordinates of two points. | 
|  | .TP | 
|  | .B neg3 | 
|  | Negate the coordinates of a point. | 
|  | .TP | 
|  | .B mul3 | 
|  | Multiply coordinates by a scalar. | 
|  | .TP | 
|  | .B div3 | 
|  | Divide coordinates by a scalar. | 
|  | .TP | 
|  | .B eqpt3 | 
|  | Test two points for exact equality. | 
|  | .TP | 
|  | .B closept3 | 
|  | Is the distance between two points smaller than | 
|  | .IR eps ? | 
|  | .TP | 
|  | .B dot3 | 
|  | Dot product. | 
|  | .TP | 
|  | .B cross3 | 
|  | Cross product. | 
|  | .TP | 
|  | .B len3 | 
|  | Distance to the origin. | 
|  | .TP | 
|  | .B dist3 | 
|  | Distance between two points. | 
|  | .TP | 
|  | .B unit3 | 
|  | A unit vector parallel to | 
|  | .IR p . | 
|  | .TP | 
|  | .B midpt3 | 
|  | The midpoint of line segment | 
|  | .IR pq . | 
|  | .TP | 
|  | .B lerp3 | 
|  | Linear interpolation between | 
|  | .I p | 
|  | and | 
|  | .IR q . | 
|  | .TP | 
|  | .B reflect3 | 
|  | The reflection of point | 
|  | .I p | 
|  | in the segment joining | 
|  | .I p0 | 
|  | and | 
|  | .IR p1 . | 
|  | .TP | 
|  | .B nearseg3 | 
|  | The closest point to | 
|  | .I testp | 
|  | on segment | 
|  | .IR "p0 p1" . | 
|  | .TP | 
|  | .B pldist3 | 
|  | The distance from | 
|  | .I p | 
|  | to segment | 
|  | .IR "p0 p1" . | 
|  | .TP | 
|  | .B vdiv3 | 
|  | Vector divide \(em the length of the component of | 
|  | .I a | 
|  | parallel to | 
|  | .IR b , | 
|  | in units of the length of | 
|  | .IR b . | 
|  | .TP | 
|  | .B vrem3 | 
|  | Vector remainder \(em the component of | 
|  | .I a | 
|  | perpendicular to | 
|  | .IR b . | 
|  | Ignoring roundoff, we have | 
|  | .BR "eqpt3(add3(mul3(b, vdiv3(a, b)), vrem3(a, b)), a)" . | 
|  | .PD | 
|  | .PP | 
|  | The following routines convert amongst various representations of points | 
|  | and planes.  Planes are represented identically to points, by duality; | 
|  | a point | 
|  | .B p | 
|  | is on a plane | 
|  | .B q | 
|  | whenever | 
|  | .BR p.x*q.x+p.y*q.y+p.z*q.z+p.w*q.w=0 . | 
|  | Although when dealing with affine points we assume | 
|  | .BR p.w=1 , | 
|  | we can't make the same assumption for planes. | 
|  | The names of these routines are extra-cryptic.  They contain an | 
|  | .B f | 
|  | (for `face') to indicate a plane, | 
|  | .B p | 
|  | for a point and | 
|  | .B n | 
|  | for a normal vector. | 
|  | The number | 
|  | .B 2 | 
|  | abbreviates the word `to.' | 
|  | The number | 
|  | .B 3 | 
|  | reminds us, as before, that we're dealing with affine points. | 
|  | Thus | 
|  | .B pn2f3 | 
|  | takes a point and a normal vector and returns the corresponding plane. | 
|  | .TF reflect3 | 
|  | .TP | 
|  | Name | 
|  | Description | 
|  | .TP | 
|  | .B pn2f3 | 
|  | Compute the plane passing through | 
|  | .I p | 
|  | with normal | 
|  | .IR n . | 
|  | .TP | 
|  | .B ppp2f3 | 
|  | Compute the plane passing through three points. | 
|  | .TP | 
|  | .B fff2p3 | 
|  | Compute the intersection point of three planes. | 
|  | .PD | 
|  | .PP | 
|  | The names of the following routines end in | 
|  | .B 4 | 
|  | because they operate on points in projective 4-space, | 
|  | represented by their homogeneous coordinates. | 
|  | .TP | 
|  | pdiv4 | 
|  | Perspective division.  Divide | 
|  | .B p.w | 
|  | into | 
|  | .IR p 's | 
|  | coordinates, converting to affine coordinates. | 
|  | If | 
|  | .B p.w | 
|  | is zero, the result is the same as the argument. | 
|  | .TP | 
|  | add4 | 
|  | Add the coordinates of two points. | 
|  | .PD | 
|  | .TP | 
|  | sub4 | 
|  | Subtract the coordinates of two points. | 
|  | .SH SOURCE | 
|  | .B \*9/src/libgeometry | 
|  | .SH "SEE ALSO | 
|  | .IR matrix (3) |