39 virtual bool is_inside(
vec3 p)
const
44 virtual bool is_all_inside(std::vector<vec3> pos)
const
56 virtual void clamp_vector(
const vec3& p,
vec3& v)
const
61 virtual vec3 project(
const vec3& p)
const
67 enum class SetType { Union, Intersection};
71 std::vector<std::shared_ptr<Geometry>> geometries;
85 const std::vector<std::shared_ptr<Geometry>> &get_geometries(){
89 void add_geometry(std::shared_ptr<Geometry> geometry)
91 geometries.push_back(geometry);
98 void remove_geometry(std::shared_ptr<Geometry> geometry)
100 auto pos = std::find(geometries.begin(), geometries.end(), geometry);
101 if (pos != geometries.end()){
102 geometries.erase(pos);
106 virtual bool is_inside(
vec3 p)
const
108 if (setType == SetType::Intersection){
109 for (
auto geometry : geometries)
111 if(!geometry->is_inside(p))
117 }
else if (setType == SetType::Union) {
118 for (
auto geometry : geometries)
120 if(geometry->is_inside(p))
131 virtual void clamp_vector(
const vec3& p,
vec3& v)
const
133 for (
auto geometry : geometries)
135 geometry->clamp_vector(p, v);
139 virtual vec3 project(
const vec3& p)
const
142 double dist = INFINITY;
143 for (
auto geometry : geometries)
145 vec3 pp = geometry->project(p);
146 if(sqr_length(pp - p) < dist)
148 dist = sqr_length(pp - p);
167 virtual bool is_inside(
vec3 p)
const override
169 return sqr_length(p - point) < EPSILON;
172 vec3 get_point()
const {
188 virtual bool is_inside(
vec3 p)
const override
190 bool res = sqr_length(p - point) < radius2;
197 vec3 get_point()
const {
201 double get_radius()
const {
202 return sqrt(radius2);
209 std::array<vec3, 3> directions;
214 directions[0] = normalize(x);
215 directions[1] = normalize(y);
216 directions[2] = normalize(cross(directions[0], directions[1]));
219 vec3 get_size()
const {
223 std::array<vec3, 3> get_directions()
const {
227 virtual bool is_inside(
vec3 p)
const override
231 for(
int i = 0; i < 3; i++)
233 double d = dot(p - point, directions[i]);
234 if(std::abs(d) > size[i])
241 for(
int i = 0; i < 3; i++)
243 double d = dot(p - point, directions[i]);
244 if(std::abs(d) > size[i] - EPSILON)
252 virtual void clamp_vector(
const vec3& p,
vec3& v)
const override
254 if(is_inside(p+v) != is_inside(p))
256 for (
int i = 0; i < 3; i++) {
258 double t = Util::intersection_ray_plane(p, v, point + size[i]*directions[i], directions[i]);
259 if(t >= 0. && t < 1.)
263 t = Util::intersection_ray_plane(p, v, point - size[i]*directions[i], -directions[i]);
264 if(t >= 0. && t < 1.)
272 virtual vec3 project(
const vec3& p)
const
275 double dist = INFINITY;
276 for (
int i = 0; i < 3; i++) {
277 vec3 pp = Util::project_point_plane(p, point + size[i]*directions[i], directions[i]);
278 if(sqr_length(pp - p) < dist)
280 dist = sqr_length(pp - p);
283 pp = Util::project_point_plane(p, point - size[i]*directions[i], -directions[i]);
284 if(sqr_length(pp - p) < dist)
286 dist = sqr_length(pp - p);
297 double sqr_radius, height;
300 Cylinder(
vec3 c,
double r,
double h,
vec3 up =
vec3(0., 1., 0.)) :
Point(c), sqr_radius(r*r), height(0.5*h), up_direction(normalize(up))
305 Cylinder(
vec3 c,
double r,
vec3 up) :
Point(c), sqr_radius(r*r), height(0.5*length(up)), up_direction(normalize(up))
310 double get_radius()
const {
311 return sqrt(sqr_radius);
314 double get_height()
const {
318 vec3 get_up_direction()
const {
322 virtual bool is_inside(
vec3 p)
const override
324 double d = dot(p - point, up_direction);
325 if(std::abs(d) > height)
330 vec3 p_proj = p - up_direction * d;
331 return sqr_length(p_proj - point) < sqr_radius;
334 virtual void clamp_vector(
const vec3& p,
vec3& v)
const override
337 if(is_inside(p+v) != is_inside(p))
343 virtual vec3 project(
const vec3& p)
const
360 virtual bool is_inside(
vec3 p)
const override
362 return std::abs(dot(p - point, normal)) < EPSILON;
365 vec3 get_normal()
const {
382 Square(
vec3 center,
double width,
double height,
vec3 width_dir,
vec3 height_dir) :
Cube(center,
vec3(width, height, 2.*EPSILON), width_dir, height_dir)
387 Square(
vec3 center,
vec3 width,
vec3 height) :
Cube(center,
vec3(length(width), length(height), 2.*EPSILON), normalize(width), normalize(height))
Definition: geometry.h:69
Definition: geometry.h:24
Definition: geometry.h:379
A 3D double vector.
Definition: Vec3d.h:26
Definition: geometry.h:295
Definition: geometry.h:177
Definition: geometry.h:350
Definition: geometry.h:157
Definition: geometry.h:206
Definition: geometry.h:370