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