-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdistance.h
110 lines (87 loc) · 2.54 KB
/
distance.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#pragma once
#include "utils.h"
#include <iostream>
#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Dense>
#include <list>
#include <math.h>
#include <vector>
#include <random>
#include <memory>
using namespace std;
using namespace Eigen;
struct AxisAlignedBoundingBox
{
double width;
double depth;
double height;
};
struct DistanceStruct
{
double distance;
Vector3d witnessA;
Vector3d witnessB;
};
class PointCloud;
class GeometricPrimitives
{
public:
Matrix4d htm;
virtual AxisAlignedBoundingBox getAABB() = 0;
virtual double distanceToPoint(Vector3d point, double h = 0) = 0;
virtual Vector3d projection(Vector3d point, double h = 0) = 0;
virtual GeometricPrimitives* copy() = 0;
virtual PointCloud generatePointCloud(double delta=0.01) = 0;
static DistanceStruct computeDist(GeometricPrimitives* objA, GeometricPrimitives* objB, Vector3d pointA0 = Vector3d::Random(), double h = 0,
double tol=0.001);
};
class Box : public GeometricPrimitives
{
public:
double width;
double depth;
double height;
Box(Matrix4d htm0, double widthVal, double depthVal, double heightVal);
AxisAlignedBoundingBox getAABB();
double distanceToPoint(Vector3d point, double h = 0);
Vector3d projection(Vector3d point, double h = 0);
GeometricPrimitives* copy();
PointCloud generatePointCloud(double delta=0.01);
};
class Cylinder : public GeometricPrimitives
{
public:
double radius;
double height;
Cylinder(Matrix4d htm0, double radiusVal, double heightVal);
AxisAlignedBoundingBox getAABB();
double distanceToPoint(Vector3d point, double h = 0);
Vector3d projection(Vector3d point, double h = 0);
GeometricPrimitives* copy();
PointCloud generatePointCloud(double delta=0.01);
};
class Sphere : public GeometricPrimitives
{
public:
double radius;
Sphere(Matrix4d htm0, double radiusVal);
AxisAlignedBoundingBox getAABB();
double distanceToPoint(Vector3d point, double h = 0);
Vector3d projection(Vector3d point, double h = 0);
GeometricPrimitives* copy();
PointCloud generatePointCloud(double delta=0.01);
};
class PointCloud : public GeometricPrimitives
{
public:
vector<Vector3d> points;
double minx, maxx;
double miny, maxy;
double minz, maxz;
PointCloud(vector<Vector3d> pointsVal);
AxisAlignedBoundingBox getAABB();
double distanceToPoint(Vector3d point, double h = 0);
Vector3d projection(Vector3d point, double h = 0);
GeometricPrimitives* copy();
PointCloud generatePointCloud(double delta=0.01);
};