.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) |