mirror of
git://git.9front.org/plan9front/plan9front
synced 2025-01-12 11:10:06 +00:00
libgeometry: add ptincylinder and ptincone
This commit is contained in:
parent
b6b5e569e9
commit
708ff097a6
3 changed files with 70 additions and 0 deletions
|
@ -78,6 +78,8 @@ Point3 crossvec3(Point3, Point3);
|
||||||
double vec3len(Point3);
|
double vec3len(Point3);
|
||||||
Point3 normvec3(Point3);
|
Point3 normvec3(Point3);
|
||||||
int lineXsphere(Point3*, Point3, Point3, Point3, double, int);
|
int lineXsphere(Point3*, Point3, Point3, Point3, double, int);
|
||||||
|
int ptincylinder(Point3, Point3, Point3, double);
|
||||||
|
int ptincone(Point3, Point3, Point3, double);
|
||||||
|
|
||||||
/* Matrix */
|
/* Matrix */
|
||||||
void identity(Matrix);
|
void identity(Matrix);
|
||||||
|
|
|
@ -90,6 +90,8 @@ double vec3len(Point3 v)
|
||||||
Point3 normvec3(Point3 v)
|
Point3 normvec3(Point3 v)
|
||||||
int lineXsphere(Point3 *rp, Point3 p0, Point3 p1,
|
int lineXsphere(Point3 *rp, Point3 p0, Point3 p1,
|
||||||
Point3 c, double rad, int isaray)
|
Point3 c, double rad, int isaray)
|
||||||
|
int ptincylinder(Point3 p, Point3 p0, Point3 p1, double r)
|
||||||
|
int ptincone(Point3 p, Point3 p0, Point3 p1, double br)
|
||||||
.PB
|
.PB
|
||||||
/* Matrix */
|
/* Matrix */
|
||||||
void identity(Matrix m)
|
void identity(Matrix m)
|
||||||
|
@ -389,6 +391,24 @@ to
|
||||||
The function returns the number of intersections (up to two) and, if
|
The function returns the number of intersections (up to two) and, if
|
||||||
.I rp
|
.I rp
|
||||||
is not nil, it is filled with the resulting points.
|
is not nil, it is filled with the resulting points.
|
||||||
|
.TP
|
||||||
|
.B ptincylinder(\fIp\fP,\fIp0\fP,\fIp1\fP,\fIr\fP)
|
||||||
|
Tests if the point
|
||||||
|
.I p
|
||||||
|
is inside a cylinder with an axis defined by the line between
|
||||||
|
.I p0
|
||||||
|
and
|
||||||
|
.IR p1 ,
|
||||||
|
and a radius r.
|
||||||
|
.TP
|
||||||
|
.B ptincone(\fIp\fP,\fIp0\fP,\fIp1\fP,\fIbr\fP)
|
||||||
|
Tests if the point
|
||||||
|
.I p
|
||||||
|
is inside a cone with its apex at
|
||||||
|
.I p0
|
||||||
|
and its base centered at
|
||||||
|
.IR p1 ,
|
||||||
|
with a radius of br.
|
||||||
.SS Matrices
|
.SS Matrices
|
||||||
.TP
|
.TP
|
||||||
Name
|
Name
|
||||||
|
|
|
@ -248,3 +248,51 @@ lineXsphere(Point3 *rp, Point3 p0, Point3 p1, Point3 c, double r, int isaray)
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* p is the point to test
|
||||||
|
* p0 and p1 are the centers of the circles at each end of the cylinder
|
||||||
|
* r is the radius of these circles
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ptincylinder(Point3 p, Point3 p0, Point3 p1, double r)
|
||||||
|
{
|
||||||
|
Point3 p01, p0p, p1p;
|
||||||
|
double h;
|
||||||
|
|
||||||
|
p01 = subpt3(p1, p0);
|
||||||
|
p0p = subpt3(p, p0);
|
||||||
|
p1p = subpt3(p, p1);
|
||||||
|
h = vec3len(p01);
|
||||||
|
|
||||||
|
if(h == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return dotvec3(p0p, p01) >= 0 &&
|
||||||
|
dotvec3(p1p, p01) <= 0 &&
|
||||||
|
vec3len(crossvec3(p0p, p01))/h <= r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* p is the point to test
|
||||||
|
* p0 is the apex
|
||||||
|
* p1 is the center of the base
|
||||||
|
* br is the radius of the base
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ptincone(Point3 p, Point3 p0, Point3 p1, double br)
|
||||||
|
{
|
||||||
|
Point3 p01, p0p;
|
||||||
|
double h, d, r;
|
||||||
|
|
||||||
|
p01 = subpt3(p1, p0);
|
||||||
|
p0p = subpt3(p, p0);
|
||||||
|
h = vec3len(p01);
|
||||||
|
d = dotvec3(p0p, normvec3(p01));
|
||||||
|
|
||||||
|
if(h == 0 || d < 0 || d > h)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
r = d/h * br;
|
||||||
|
return vec3len(crossvec3(p0p, p01))/h <= r;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue