Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
Slic3r::TriangleSelector::Circle Class Reference

#include <src/libslic3r/TriangleSelector.hpp>

+ Inheritance diagram for Slic3r::TriangleSelector::Circle:
+ Collaboration diagram for Slic3r::TriangleSelector::Circle:

Public Member Functions

 Circle ()=delete
 
 Circle (const Vec3f &center_, const Vec3f &source_, float radius_world, const Transform3d &trafo_, const ClippingPlane &clipping_plane_)
 
 ~Circle () override=default
 
bool is_mesh_point_inside (const Vec3f &point) const override
 
bool is_edge_inside_cursor (const Triangle &tr, const std::vector< Vertex > &vertices) const override
 
bool is_facet_visible (int facet_idx, const std::vector< Vec3f > &face_normals) const override
 
bool is_pointer_in_triangle (const Vec3f &p1, const Vec3f &p2, const Vec3f &p3) const override
 
bool is_pointer_in_triangle (const Triangle &tr, const std::vector< Vertex > &vertices) const
 
virtual int vertices_inside (const Triangle &tr, const std::vector< Vertex > &vertices) const
 

Static Public Member Functions

static std::unique_ptr< Cursorcursor_factory (const Vec3f &center, const Vec3f &camera_pos, const float cursor_radius, const CursorType cursor_type, const Transform3d &trafo_matrix, const ClippingPlane &clipping_plane)
 
static bool is_facet_visible (const Cursor &cursor, int facet_idx, const std::vector< Vec3f > &face_normals)
 

Protected Attributes

Vec3f center
 
Transform3f trafo
 
Vec3f source
 
bool uniform_scaling
 
Transform3f trafo_normal
 
float radius
 
float radius_sqr
 
Vec3f dir = Vec3f(0.f, 0.f, 0.f)
 
ClippingPlane clipping_plane
 
friend TriangleSelector
 

Detailed Description

Constructor & Destructor Documentation

◆ Circle() [1/2]

Slic3r::TriangleSelector::Circle::Circle ( )
delete

◆ Circle() [2/2]

Slic3r::TriangleSelector::Circle::Circle ( const Vec3f center_,
const Vec3f source_,
float  radius_world,
const Transform3d trafo_,
const ClippingPlane clipping_plane_ 
)
inlineexplicit
141 : SinglePointCursor(center_, source_, radius_world, trafo_, clipping_plane_){};

◆ ~Circle()

Slic3r::TriangleSelector::Circle::~Circle ( )
overridedefault

Member Function Documentation

◆ cursor_factory()

static std::unique_ptr< Cursor > Slic3r::TriangleSelector::SinglePointCursor::cursor_factory ( const Vec3f center,
const Vec3f camera_pos,
const float  cursor_radius,
const CursorType  cursor_type,
const Transform3d trafo_matrix,
const ClippingPlane clipping_plane 
)
inlinestaticinherited
85 {
87 if (cursor_type == TriangleSelector::CursorType::SPHERE)
88 return std::make_unique<TriangleSelector::Sphere>(center, camera_pos, cursor_radius, trafo_matrix, clipping_plane);
89 else
90 return std::make_unique<TriangleSelector::Circle>(center, camera_pos, cursor_radius, trafo_matrix, clipping_plane);
91 }
ClippingPlane clipping_plane
Definition TriangleSelector.hpp:71
Vec3f center
Definition TriangleSelector.hpp:96
@ SPHERE
Definition TriangleSelector.hpp:27
@ CIRCLE
Definition TriangleSelector.hpp:26

References Slic3r::TriangleSelector::SinglePointCursor::center, Slic3r::TriangleSelector::CIRCLE, Slic3r::TriangleSelector::Cursor::clipping_plane, and Slic3r::TriangleSelector::SPHERE.

Referenced by Slic3r::GUI::GLGizmoPainterBase::gizmo_event().

+ Here is the caller graph for this function:

◆ is_edge_inside_cursor()

bool Slic3r::TriangleSelector::Circle::is_edge_inside_cursor ( const Triangle tr,
const std::vector< Vertex > &  vertices 
) const
overridevirtual

Implements Slic3r::TriangleSelector::Cursor.

1029{
1030 std::array<Vec3f, 3> pts;
1031 for (int i = 0; i < 3; ++i) {
1032 pts[i] = vertices[tr.verts_idxs[i]].v;
1033 if (!this->uniform_scaling)
1034 pts[i] = this->trafo * pts[i];
1035 }
1036
1037 const Vec3f &p = this->center;
1038 for (int side = 0; side < 3; ++side) {
1039 const Vec3f &a = pts[side];
1040 const Vec3f &b = pts[side < 2 ? side + 1 : 0];
1041 Vec3f s = (b - a).normalized();
1042 float t = (p - a).dot(s);
1043 Vec3f vector = a + t * s - p;
1044
1045 // vector is 3D vector from center to the intersection. What we want to
1046 // measure is length of its projection onto plane perpendicular to dir.
1047 float dist_sqr = vector.squaredNorm() - std::pow(vector.dot(this->dir), 2.f);
1048 if (dist_sqr < this->radius_sqr && t >= 0.f && t <= (b - a).norm())
1049 return true;
1050 }
1051 return false;
1052}
Transform3f trafo
Definition TriangleSelector.hpp:62
bool uniform_scaling
Definition TriangleSelector.hpp:65
float radius_sqr
Definition TriangleSelector.hpp:68
Eigen::Matrix< float, 3, 1, Eigen::DontAlign > Vec3f
Definition Point.hpp:49
T dot(const boost::geometry::model::d2::point_xy< T > &v1, const boost::geometry::model::d2::point_xy< T > &v2)
Definition ExtrusionSimulator.cpp:143

References Slic3r::dot(), and Slic3r::TriangleSelector::Triangle::verts_idxs.

+ Here is the call graph for this function:

◆ is_facet_visible() [1/2]

bool Slic3r::TriangleSelector::Cursor::is_facet_visible ( const Cursor cursor,
int  facet_idx,
const std::vector< Vec3f > &  face_normals 
)
staticinherited
989{
990 assert(facet_idx < int(face_normals.size()));
991 Vec3f n = face_normals[facet_idx];
992 if (!cursor.uniform_scaling)
993 n = cursor.trafo_normal * n;
994 return n.dot(cursor.dir) < 0.f;
995}

References Slic3r::TriangleSelector::Cursor::dir, Slic3r::TriangleSelector::Cursor::trafo_normal, and Slic3r::TriangleSelector::Cursor::uniform_scaling.

◆ is_facet_visible() [2/2]

bool Slic3r::TriangleSelector::Circle::is_facet_visible ( int  facet_idx,
const std::vector< Vec3f > &  face_normals 
) const
inlineoverridevirtual

Implements Slic3r::TriangleSelector::Cursor.

147 {
148 return TriangleSelector::Cursor::is_facet_visible(*this, facet_idx, face_normals);
149 }
virtual bool is_facet_visible(int facet_idx, const std::vector< Vec3f > &face_normals) const =0

References Slic3r::TriangleSelector::Cursor::is_facet_visible().

+ Here is the call graph for this function:

◆ is_mesh_point_inside()

bool Slic3r::TriangleSelector::Circle::is_mesh_point_inside ( const Vec3f point) const
overridevirtual

Implements Slic3r::TriangleSelector::Cursor.

1839{
1840 const Vec3f transformed_point = uniform_scaling ? point : Vec3f(trafo * point);
1841 const Vec3f diff = center - transformed_point;
1842
1843 if ((diff - diff.dot(dir) * dir).squaredNorm() < radius_sqr)
1845
1846 return false;
1847}
Vec3f dir
Definition TriangleSelector.hpp:69
static bool is_mesh_point_not_clipped(const Vec3f &point, const TriangleSelector::ClippingPlane &clipping_plane)
Definition TriangleSelector.cpp:1822
Slic3r::Polygons diff(const Slic3r::Polygon &subject, const Slic3r::Polygon &clip, ApplySafetyOffset do_safety_offset)
Definition ClipperUtils.cpp:672

References Slic3r::diff(), and Slic3r::is_mesh_point_not_clipped().

+ Here is the call graph for this function:

◆ is_pointer_in_triangle() [1/2]

bool Slic3r::TriangleSelector::Cursor::is_pointer_in_triangle ( const Triangle tr,
const std::vector< Vertex > &  vertices 
) const
inherited
980 {
981 const Vec3f& p1 = vertices[tr.verts_idxs[0]].v;
982 const Vec3f& p2 = vertices[tr.verts_idxs[1]].v;
983 const Vec3f& p3 = vertices[tr.verts_idxs[2]].v;
984 return this->is_pointer_in_triangle(p1, p2, p3);
985}
bool is_pointer_in_triangle(const Triangle &tr, const std::vector< Vertex > &vertices) const
Definition TriangleSelector.cpp:980

References Slic3r::TriangleSelector::Triangle::verts_idxs.

◆ is_pointer_in_triangle() [2/2]

bool Slic3r::TriangleSelector::SinglePointCursor::is_pointer_in_triangle ( const Vec3f p1,
const Vec3f p2,
const Vec3f p3 
) const
overridevirtualinherited

Implements Slic3r::TriangleSelector::Cursor.

1924{
1926}
static bool is_circle_pointer_inside_triangle(const Vec3f &p1_, const Vec3f &p2_, const Vec3f &p3_, const Vec3f &center, const Vec3f &dir, const bool uniform_scaling, const Transform3f &trafo)
Definition TriangleSelector.cpp:1901

References Slic3r::is_circle_pointer_inside_triangle().

+ Here is the call graph for this function:

◆ vertices_inside()

int Slic3r::TriangleSelector::Cursor::vertices_inside ( const Triangle tr,
const std::vector< Vertex > &  vertices 
) const
virtualinherited
999{
1000 int inside = 0;
1001 for (size_t i = 0; i < 3; ++i)
1002 if (this->is_mesh_point_inside(vertices[tr.verts_idxs[i]].v))
1003 ++inside;
1004
1005 return inside;
1006}
virtual bool is_mesh_point_inside(const Vec3f &point) const =0
bool inside(const Polygons &polygons, const Point &p)

References Slic3r::TriangleSelector::Triangle::verts_idxs.

Member Data Documentation

◆ center

Vec3f Slic3r::TriangleSelector::SinglePointCursor::center
protectedinherited

◆ clipping_plane

ClippingPlane Slic3r::TriangleSelector::Cursor::clipping_plane
protectedinherited

◆ dir

◆ radius

float Slic3r::TriangleSelector::Cursor::radius
protectedinherited

◆ radius_sqr

float Slic3r::TriangleSelector::Cursor::radius_sqr
protectedinherited

◆ source

◆ trafo

◆ trafo_normal

Transform3f Slic3r::TriangleSelector::Cursor::trafo_normal
protectedinherited

◆ TriangleSelector

friend Slic3r::TriangleSelector::Cursor::TriangleSelector
protectedinherited

◆ uniform_scaling


The documentation for this class was generated from the following files: