-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathcylinder.h
88 lines (70 loc) · 2.01 KB
/
cylinder.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#ifndef CYLINDER_H
#define CYLINDER_H
#include "primitive.h"
#include "geometryutils.h"
class Cylinder : public Primitive3d
{
public:
Cylinder(const Eigen::Vector3f ¢er, const Eigen::Vector3f &axis, float radius, float height = 0)
: Primitive3d(center)
, mAxis(axis)
, mRadius(radius)
, mHeight(height)
{
}
const Eigen::Vector3f& axis() const
{
return mAxis;
}
void axis(const Eigen::Vector3f &axis)
{
mAxis = axis;
}
float radius() const
{
return mRadius;
}
void radius(float radius)
{
mRadius = radius;
}
float height() const
{
return mHeight;
}
void height(float height)
{
mHeight = height;
}
float getSignedDistanceFromSurface(const Eigen::Vector3f &point) const override
{
return Line3d(this->center(), this->center() + mAxis).distanceToPoint(point) - mRadius;
}
Eigen::Vector3f normalAt(const Eigen::Vector3f &point) const override
{
return (point - Line3d(this->center(), this->center() + mAxis).closestPointToPoint(point)).normalized();
}
std::pair<Eigen::Vector3f, Eigen::Vector3f> extremities() const
{
return std::make_pair(this->center() + mAxis * mHeight / 2, this->center() - mAxis * mHeight / 2);
}
bool containsRect(Rect3d rect) const
{
std::vector<Eigen::Vector3f> vertices;
rect.getVertices(vertices);
Line3d axis(Primitive3d::center(), Primitive3d::center() + mAxis);
for (size_t i = 0; i < vertices.size(); i++)
{
Eigen::Vector3f closestPoint = axis.closestPointToPoint(vertices[i]);
if ((vertices[i] - closestPoint).norm() > mRadius) return false;
}
return true;
}
void setHeight(const Eigen::Matrix<float, 3, -1> &points);
void leastSquares(const Eigen::Matrix<float, 3, -1> &points) override;
private:
Eigen::Vector3f mAxis;
float mRadius;
float mHeight;
};
#endif // CYLINDER_H