discuss@lists.openscad.org

OpenSCAD general discussion Mailing-list

View all threads

Polyhedron: degenerated triangles are allowed, but quads...

R
Ronaldo
Wed, Jan 4, 2017 3:26 PM

Consider the following code of a prism degenerated in a tetrahedron:

v = [ [0,0,0], [50,0,0], [0,50,0],
[0,0,50], [0,0,50], [0,0,50] ];

f1 = [ [0,1,2],  //base
[1,0,3,4], // three degenerated quads -> triangles
[2,1,4,5],
[0,2,5,3],
[3,4,5] ]; // triangle degenerated to a point

f2 = [ [0,1,2],        // base
[0,4,1], [0,3,4],  // one degenerated triangle
[1,5,2], [1,4,5],  // one degenerated triangle
[2,3,0], [2,5,3],  // one degenerated triangle
[3,4,5]  ]; // triangle degenerated in a point

polyhedron(v,f1);

translate([60,0,0]) polyhedron(v,f2);

translate([0,70,0]) cube(10);

The´polyhedron (v,f1) has a triangular face ([3,4,5]) degenerated to a point
and 3 quads degenerated in triangles. The polyhedron (v,f2) has the same
degenerated triangular face and 3 other triangular faces degenerated in line
segments.

The surprising result is: (v,f2) is previewed and rendered (with (v,f1)
commented) correctly even with the presence of the cube; but (v,f2) preview
and render has 3 missing faces even when it is alone. In short: degenerated
triangles are allowed in polyhedron, degenerated quads are suppressed.

A preview:
http://forum.openscad.org/file/n19917/Degenerated_faces.png

What is even more striking: if we insert three additional vertex in the
edges of the tetrahedron base and change (v,f1) accordingly, the quad faces
turns to degenerated pentagons and the model is previewed and rendered
correctly!!!

v3 = [ [0,0,0], [50,0,0], [0,50,0],
[0,0,50], [0,0,50], [0,0,50], [25,0,0], [25,25,0], [0,25,0] ];

f3 = [ [0,6,1,7,2,8],
[1,6,0,3,4], [2,7,1,4,5], [0,8,2,5,3], [3,4,5] ];

polyhedron(v3,f3);
cube();

I have got the same results with versions 2015.03-2 and 2016.11.11.

This is breaking some of my loft codes.

--
View this message in context: http://forum.openscad.org/Polyhedron-degenerated-triangles-are-allowed-but-quads-tp19917.html
Sent from the OpenSCAD mailing list archive at Nabble.com.

Consider the following code of a prism degenerated in a tetrahedron: > v = [ [0,0,0], [50,0,0], [0,50,0], > [0,0,50], [0,0,50], [0,0,50] ]; > > f1 = [ [0,1,2], //base > [1,0,3,4], // three degenerated quads -> triangles > [2,1,4,5], > [0,2,5,3], > [3,4,5] ]; // triangle degenerated to a point > > f2 = [ [0,1,2], // base > [0,4,1], [0,3,4], // one degenerated triangle > [1,5,2], [1,4,5], // one degenerated triangle > [2,3,0], [2,5,3], // one degenerated triangle > [3,4,5] ]; // triangle degenerated in a point > > polyhedron(v,f1); > > translate([60,0,0]) polyhedron(v,f2); > > translate([0,70,0]) cube(10); The´polyhedron (v,f1) has a triangular face ([3,4,5]) degenerated to a point and 3 quads degenerated in triangles. The polyhedron (v,f2) has the same degenerated triangular face and 3 other triangular faces degenerated in line segments. The surprising result is: (v,f2) is previewed and rendered (with (v,f1) commented) correctly even with the presence of the cube; but (v,f2) preview and render has 3 missing faces even when it is alone. In short: degenerated triangles are allowed in polyhedron, degenerated quads are suppressed. A preview: <http://forum.openscad.org/file/n19917/Degenerated_faces.png> What is even more striking: if we insert three additional vertex in the edges of the tetrahedron base and change (v,f1) accordingly, the quad faces turns to degenerated pentagons and the model is previewed and rendered correctly!!! > v3 = [ [0,0,0], [50,0,0], [0,50,0], > [0,0,50], [0,0,50], [0,0,50], [25,0,0], [25,25,0], [0,25,0] ]; > > f3 = [ [0,6,1,7,2,8], > [1,6,0,3,4], [2,7,1,4,5], [0,8,2,5,3], [3,4,5] ]; > > polyhedron(v3,f3); > cube(); I have got the same results with versions 2015.03-2 and 2016.11.11. This is breaking some of my loft codes. -- View this message in context: http://forum.openscad.org/Polyhedron-degenerated-triangles-are-allowed-but-quads-tp19917.html Sent from the OpenSCAD mailing list archive at Nabble.com.
P
Parkinbot
Wed, Jan 4, 2017 4:57 PM

It seems that polyhedron does some silent "repair" (exclusion) of degenerate
triags, but not of degenerate quads or larger polygons.
Despite that I wouldn't build on degenerated stuff like that and don't like
silent repairs at all, you could try to turn your quads (and larger
polygons) into triags and trust on polyhedron to filter your triag soup
appropriately. But be sure to check the results at STL level.

If you don't check by inserting a dummy boolean operation into your design,
OpenSCAD for now also lets you create and export degenerate 3D objects like
the following.

v = [ [0,0,0], [50,0,0], [0,50,0], [0,0,50] ];

polyhedron(v,[[0,1,2]]);
polyhedron(v,[[0,2,3]]);
polyhedron(v,[[0,3,1]]);
polyhedron(v,[[1,3,2]]);

I don't see much reason why this should be a false approach, besides the
little fact, that it is not specified for the language OpenSCAD to construct
3D Objects by a union of surfaces defined by polyhedrons.

While the STL-Exporter creates some faulty thing out of this, the
AMF-Exporter suprisingly does the job.

--
View this message in context: http://forum.openscad.org/Polyhedron-degenerated-triangles-are-allowed-but-quads-tp19917p19920.html
Sent from the OpenSCAD mailing list archive at Nabble.com.

It seems that polyhedron does some silent "repair" (exclusion) of degenerate triags, but not of degenerate quads or larger polygons. Despite that I wouldn't build on degenerated stuff like that and don't like silent repairs at all, you could try to turn your quads (and larger polygons) into triags and trust on polyhedron to filter your triag soup appropriately. But be sure to check the results at STL level. If you don't check by inserting a dummy boolean operation into your design, OpenSCAD for now also lets you create and export degenerate 3D objects like the following. > v = [ [0,0,0], [50,0,0], [0,50,0], [0,0,50] ]; > > polyhedron(v,[[0,1,2]]); > polyhedron(v,[[0,2,3]]); > polyhedron(v,[[0,3,1]]); > polyhedron(v,[[1,3,2]]); I don't see much reason why this should be a false approach, besides the little fact, that it is not specified for the language OpenSCAD to construct 3D Objects by a union of surfaces defined by polyhedrons. While the STL-Exporter creates some faulty thing out of this, the AMF-Exporter suprisingly does the job. -- View this message in context: http://forum.openscad.org/Polyhedron-degenerated-triangles-are-allowed-but-quads-tp19917p19920.html Sent from the OpenSCAD mailing list archive at Nabble.com.
R
Ronaldo
Wed, Jan 4, 2017 5:53 PM

I have found that degenerated triangles are discarded, quads degenerated in
triangles are also discarded but pentagons degenerated in quads are not! And
this seems to be a bug or, at least, an very idiosyncratic repair.

Your example is also striking. After render, the console shows there are 2
volumes (which ones?). If any of the polyhedron is dropped, the render will
warn for possible non-manifold and consider only one volume. I have checked
the stl: it has 8 facets, two for each one you have defined with opposed
normals and inverted circulation. The generated stl for just one of your
polyhedron (just one facet) will have just one facet. A real mess.

I surely can avoid degenerated quads by checking or I can triangulate every
quad. But why I should do that (which will double the number of facets to
send to polyhedron) if there is a automatic triangulation inside the
OpenSCAD code? Either it works with all cases or it is worthless.

--
View this message in context: http://forum.openscad.org/Polyhedron-degenerated-triangles-are-allowed-but-quads-tp19917p19922.html
Sent from the OpenSCAD mailing list archive at Nabble.com.

I have found that degenerated triangles are discarded, quads degenerated in triangles are also discarded but pentagons degenerated in quads are not! And this seems to be a bug or, at least, an very idiosyncratic repair. Your example is also striking. After render, the console shows there are 2 volumes (which ones?). If any of the polyhedron is dropped, the render will warn for possible non-manifold and consider only one volume. I have checked the stl: it has 8 facets, two for each one you have defined with opposed normals and inverted circulation. The generated stl for just one of your polyhedron (just one facet) will have just one facet. A real mess. I surely can avoid degenerated quads by checking or I can triangulate every quad. But why I should do that (which will double the number of facets to send to polyhedron) if there is a automatic triangulation inside the OpenSCAD code? Either it works with all cases or it is worthless. -- View this message in context: http://forum.openscad.org/Polyhedron-degenerated-triangles-are-allowed-but-quads-tp19917p19922.html Sent from the OpenSCAD mailing list archive at Nabble.com.
P
Parkinbot
Wed, Jan 4, 2017 6:19 PM

the count of the rendered volumes generally seems to have an offset of 1. Try

translate([0,70,0]) cube(10);
translate([0,-70,0]) cube(10);

--
View this message in context: http://forum.openscad.org/Polyhedron-degenerated-triangles-are-allowed-but-quads-tp19917p19923.html
Sent from the OpenSCAD mailing list archive at Nabble.com.

the count of the rendered volumes generally seems to have an offset of 1. Try translate([0,70,0]) cube(10); translate([0,-70,0]) cube(10); -- View this message in context: http://forum.openscad.org/Polyhedron-degenerated-triangles-are-allowed-but-quads-tp19917p19923.html Sent from the OpenSCAD mailing list archive at Nabble.com.
R
Ronaldo
Thu, Jan 5, 2017 10:48 PM

I have found more strange behaviors of the degenerated cases. When I render
just the polyhedron (v,f1) ( the one that has degenerated quads) the result
is the same of the preview: it displays just the base eliminating all quads.
The generated stl has only one face.

But if I render polyhedron (v,f1) and something else (like a cube) both are
displayed correctly and the generated stl is also correct. This suggests
that when the scene has just one model, OpenSCAD does "repairs" that are not
done when there is more than one object in the scene. And the bug is just in
this repair.

--
View this message in context: http://forum.openscad.org/Polyhedron-degenerated-triangles-are-allowed-but-quads-tp19917p19930.html
Sent from the OpenSCAD mailing list archive at Nabble.com.

I have found more strange behaviors of the degenerated cases. When I render just the polyhedron (v,f1) ( the one that has degenerated quads) the result is the same of the preview: it displays just the base eliminating all quads. The generated stl has only one face. But if I render polyhedron (v,f1) and something else (like a cube) both are displayed correctly and the generated stl is also correct. This suggests that when the scene has just one model, OpenSCAD does "repairs" that are not done when there is more than one object in the scene. And the bug is just in this repair. -- View this message in context: http://forum.openscad.org/Polyhedron-degenerated-triangles-are-allowed-but-quads-tp19917p19930.html Sent from the OpenSCAD mailing list archive at Nabble.com.
MK
Marius Kintel
Thu, Jan 5, 2017 11:19 PM

Could you provide a self-contained, minimal example?

-Marius

On Jan 5, 2017, at 17:48, Ronaldo rcmpersiano@gmail.com wrote:

I have found more strange behaviors of the degenerated cases. When I render
just the polyhedron (v,f1) ( the one that has degenerated quads) the result
is the same of the preview: it displays just the base eliminating all quads.
The generated stl has only one face.

But if I render polyhedron (v,f1) and something else (like a cube) both are
displayed correctly and the generated stl is also correct. This suggests
that when the scene has just one model, OpenSCAD does "repairs" that are not
done when there is more than one object in the scene. And the bug is just in
this repair.

--
View this message in context: http://forum.openscad.org/Polyhedron-degenerated-triangles-are-allowed-but-quads-tp19917p19930.html
Sent from the OpenSCAD mailing list archive at Nabble.com.


OpenSCAD mailing list
Discuss@lists.openscad.org
http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org

Could you provide a self-contained, minimal example? -Marius > On Jan 5, 2017, at 17:48, Ronaldo <rcmpersiano@gmail.com> wrote: > > I have found more strange behaviors of the degenerated cases. When I render > just the polyhedron (v,f1) ( the one that has degenerated quads) the result > is the same of the preview: it displays just the base eliminating all quads. > The generated stl has only one face. > > But if I render polyhedron (v,f1) and something else (like a cube) both are > displayed correctly and the generated stl is also correct. This suggests > that when the scene has just one model, OpenSCAD does "repairs" that are not > done when there is more than one object in the scene. And the bug is just in > this repair. > > > > -- > View this message in context: http://forum.openscad.org/Polyhedron-degenerated-triangles-are-allowed-but-quads-tp19917p19930.html > Sent from the OpenSCAD mailing list archive at Nabble.com. > > _______________________________________________ > OpenSCAD mailing list > Discuss@lists.openscad.org > http://lists.openscad.org/mailman/listinfo/discuss_lists.openscad.org
RP
Ronaldo Persiano
Thu, Jan 5, 2017 11:32 PM

2017-01-05 21:19 GMT-02:00 Marius Kintel kintel@kintel.net:

Could you provide a self-contained, minimal example?

-Marius

It can be found in the first post of this thread.

2017-01-05 21:19 GMT-02:00 Marius Kintel <kintel@kintel.net>: > Could you provide a self-contained, minimal example? > > -Marius > > It can be found in the first post of this thread.