268 lines
4.3 KiB
Text
Executable file
268 lines
4.3 KiB
Text
Executable file
.TH ARITH3 2
|
|
.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
|
|
.B
|
|
#include <draw.h>
|
|
.br
|
|
.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 /sys/src/libgeometry
|
|
.SH "SEE ALSO
|
|
.IR matrix (2)
|