mirror of https://github.com/vitalif/openscad
allow resize to use CGAL's engine to deal with precision issues per discussion
with Marius and Gilestransformprecision
parent
79f6baf264
commit
80df04074d
|
@ -28,7 +28,8 @@ public:
|
||||||
CGAL_Nef_polyhedron &minkowski(const CGAL_Nef_polyhedron &other);
|
CGAL_Nef_polyhedron &minkowski(const CGAL_Nef_polyhedron &other);
|
||||||
CGAL_Nef_polyhedron *copy() const;
|
CGAL_Nef_polyhedron *copy() const;
|
||||||
class PolySet *convertToPolyset() const;
|
class PolySet *convertToPolyset() const;
|
||||||
void transform( const Transform3d &matrix );
|
void transform( const CGAL_Nef_polyhedron3::Aff_transformation_3 &t );
|
||||||
|
void transform( const Transform3d &t );
|
||||||
shared_ptr<CGAL_Nef_polyhedron3> p3;
|
shared_ptr<CGAL_Nef_polyhedron3> p3;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -42,21 +42,38 @@ std::string CGAL_Nef_polyhedron::dump() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CGAL_Nef_polyhedron::transform( const Transform3d &matrix )
|
void CGAL_Nef_polyhedron::transform( const CGAL_Nef_polyhedron3::Aff_transformation_3 &t )
|
||||||
{
|
{
|
||||||
if (!this->isEmpty()) {
|
if (!this->isEmpty()) {
|
||||||
if (matrix.matrix().determinant() == 0) {
|
if (CGAL::sign_of_determinant<NT3>(
|
||||||
|
t.cartesian(0,0),t.cartesian(0,1),t.cartesian(0,2),
|
||||||
|
t.cartesian(1,0),t.cartesian(1,1),t.cartesian(1,2),
|
||||||
|
t.cartesian(2,0),t.cartesian(2,1),t.cartesian(2,2)
|
||||||
|
)==0) {
|
||||||
PRINT("Warning: Scaling a 3D object with 0 - removing object");
|
PRINT("Warning: Scaling a 3D object with 0 - removing object");
|
||||||
this->reset();
|
this->reset();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
CGAL_Aff_transformation t(
|
|
||||||
matrix(0,0), matrix(0,1), matrix(0,2), matrix(0,3),
|
|
||||||
matrix(1,0), matrix(1,1), matrix(1,2), matrix(1,3),
|
|
||||||
matrix(2,0), matrix(2,1), matrix(2,2), matrix(2,3), matrix(3,3));
|
|
||||||
this->p3->transform(t);
|
this->p3->transform(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CGAL_Nef_polyhedron::transform( const Transform3d &t )
|
||||||
|
{
|
||||||
|
if (!this->isEmpty()) {
|
||||||
|
if (t.matrix().determinant()==0) {
|
||||||
|
PRINT("Warning: Scaling a 3D object with 0 - removing object");
|
||||||
|
this->reset();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
CGAL_Nef_polyhedron3::Aff_transformation_3 aff(
|
||||||
|
t(0,0),t(0,1),t(0,2),t(0,3),
|
||||||
|
t(1,0),t(1,1),t(1,2),t(1,3),
|
||||||
|
t(2,0),t(2,1),t(2,2),t(2,3),t(3,3) );
|
||||||
|
this->p3->transform(aff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif // ENABLE_CGAL
|
#endif // ENABLE_CGAL
|
||||||
|
|
|
@ -203,13 +203,12 @@ void GeometryEvaluator::applyResize3D(CGAL_Nef_polyhedron &N,
|
||||||
if (autosize[i] && newsize[i]==0) scale[i] = autoscale;
|
if (autosize[i] && newsize[i]==0) scale[i] = autoscale;
|
||||||
}
|
}
|
||||||
|
|
||||||
Eigen::Matrix4d t;
|
CGAL_Nef_polyhedron3::Aff_transformation_3 aff(
|
||||||
t << CGAL::to_double(scale[0]), 0, 0, 0,
|
scale[0], 0, 0,
|
||||||
0, CGAL::to_double(scale[1]), 0, 0,
|
0, scale[1], 0,
|
||||||
0, 0, CGAL::to_double(scale[2]), 0,
|
0, 0, scale[2], 1 );
|
||||||
0, 0, 0, 1;
|
|
||||||
|
|
||||||
N.transform(Transform3d(t));
|
N.transform( aff );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -842,6 +842,7 @@ list(APPEND CGALPNGTEST_FILES ${FEATURES_FILES} ${SCAD_DXF_FILES} ${EXAMPLE_FILE
|
||||||
list(APPEND CGALPNGTEST_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/include-tests.scad
|
list(APPEND CGALPNGTEST_FILES ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/include-tests.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/use-tests.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/use-tests.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/transform-nan-inf-tests.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/transform-nan-inf-tests.scad
|
||||||
|
${CMAKE_SOURCE_DIR}/../testdata/scad/bugs/transform-precision.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/localfiles-test.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/localfiles-test.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/localfiles_dir/localfiles-compatibility-test.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/localfiles_dir/localfiles-compatibility-test.scad
|
||||||
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/rotate-empty-bbox.scad
|
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/rotate-empty-bbox.scad
|
||||||
|
|
Loading…
Reference in New Issue