OpenJSCAD.org
OpenJSCAD.org copied to clipboard
[bug] Wrong intersection result
As shown in the figure, there is a wrong intersection when there should be no intersection.
testcode:
let data = { "geo1": { "polygons": [{ "vertices": [[393, 60, 0], [402, 60, 10], [402, 60, 0]] }, { "vertices": [[393, 60, 0], [393, 60, 10], [402, 60, 10]] }, { "vertices": [[402, 60, 0], [402, 865, 10], [402, 865, 0]] }, { "vertices": [[402, 60, 0], [402, 60, 10], [402, 865, 10]] }, { "vertices": [[402, 865, 0], [393, 865, 10], [393, 865, 0]] }, { "vertices": [[402, 865, 0], [402, 865, 10], [393, 865, 10]] }, { "vertices": [[393, 865, 0], [393, 60, 10], [393, 60, 0]] }, { "vertices": [[393, 865, 0], [393, 865, 10], [393, 60, 10]] }, { "vertices": [[402, 865, 10], [393, 60, 10], [393, 865, 10]] }, { "vertices": [[393, 60, 10], [402, 865, 10], [402, 60, 10]] }, { "vertices": [[420, 0, 0], [420, 875, 0], [420, 875, 18]] }, { "vertices": [[420, 0, 0], [420, 875, 18], [420, 0, 18]] }, { "vertices": [[420, 875, 0], [0, 875, 0], [0, 875, 18]] }, { "vertices": [[420, 875, 0], [0, 875, 18], [420, 875, 18]] }, { "vertices": [[0, 875, 0], [0, 710, 0], [0, 710, 18]] }, { "vertices": [[0, 875, 0], [0, 710, 18], [0, 875, 18]] }, { "vertices": [[0, 710, 0], [18, 710, 0], [18, 710, 18]] }, { "vertices": [[0, 710, 0], [18, 710, 18], [0, 710, 18]] }, { "vertices": [[18, 710, 0], [18, 710, 0], [18, 710, 18]] }, { "vertices": [[18, 710, 0], [18, 710, 18], [18, 710, 18]] }, { "vertices": [[18, 710, 0], [36, 710, 0], [36, 710, 18]] }, { "vertices": [[18, 710, 0], [36, 710, 18], [18, 710, 18]] }, { "vertices": [[36, 710, 0], [36, 637, 0], [36, 637, 18]] }, { "vertices": [[36, 710, 0], [36, 637, 18], [36, 710, 18]] }, { "vertices": [[36, 637, 0], [1.8947806851624636e-14, 637, 0], [1.8947806851624636e-14, 637, 18]] }, { "vertices": [[36, 637, 0], [1.8947806851624636e-14, 637, 18], [36, 637, 18]] }, { "vertices": [[1.8947806851624636e-14, 637, 0], [0, 0, 0], [0, 0, 18]] }, { "vertices": [[1.8947806851624636e-14, 637, 0], [0, 0, 18], [1.8947806851624636e-14, 637, 18]] }, { "vertices": [[0, 0, 0], [420, 0, 0], [420, 0, 18]] }, { "vertices": [[0, 0, 0], [420, 0, 18], [0, 0, 18]] }, { "vertices": [[0, 0, 0], [393, 865, 0], [393, 60, 0]] }, { "vertices": [[402, 60, 0], [0, 0, 0], [393, 60, 0]] }, { "vertices": [[0, 875, 0], [36, 710, 0], [0, 710, 0]] }, { "vertices": [[36, 637, 0], [0, 0, 0], [1.8947806851624636e-14, 637, 0]] }, { "vertices": [[402, 60, 0], [420, 0, 0], [0, 0, 0]] }, { "vertices": [[36, 637, 0], [393, 865, 0], [0, 0, 0]] }, { "vertices": [[402, 865, 0], [420, 0, 0], [402, 60, 0]] }, { "vertices": [[36, 710, 0], [393, 865, 0], [36, 637, 0]] }, { "vertices": [[402, 865, 0], [420, 875, 0], [420, 0, 0]] }, { "vertices": [[0, 875, 0], [393, 865, 0], [36, 710, 0]] }, { "vertices": [[393, 865, 0], [420, 875, 0], [402, 865, 0]] }, { "vertices": [[420, 875, 0], [393, 865, 0], [0, 875, 0]] }, { "vertices": [[1.8947806851624636e-14, 637, 18], [0, 0, 18], [420, 0, 18]] }, { "vertices": [[420, 0, 18], [420, 875, 18], [0, 875, 18]] }, { "vertices": [[0, 875, 18], [0, 710, 18], [36, 710, 18]] }, { "vertices": [[36, 637, 18], [1.8947806851624636e-14, 637, 18], [420, 0, 18]] }, { "vertices": [[420, 0, 18], [0, 875, 18], [36, 710, 18]] }, { "vertices": [[36, 710, 18], [36, 637, 18], [420, 0, 18]] }], "transforms": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] }, "geo2": { "polygons": [{ "vertices": [[495, 805, 0], [495, 0, 0], [0, 0, 0]] }, { "vertices": [[0, 0, 0], [0, 805, 0], [495, 805, 0]] }, { "vertices": [[0, 0, 9], [495, 0, 9], [495, 805, 9]] }, { "vertices": [[495, 805, 9], [0, 805, 9], [0, 0, 9]] }, { "vertices": [[495, 805, 0], [0, 805, 0], [495, 805, 9]] }, { "vertices": [[0, 805, 0], [0, 805, 9], [495, 805, 9]] }, { "vertices": [[0, 805, 0], [0, 0, 0], [0, 805, 9]] }, { "vertices": [[0, 0, 0], [0, 0, 9], [0, 805, 9]] }, { "vertices": [[0, 0, 0], [495, 0, 0], [0, 0, 9]] }, { "vertices": [[495, 0, 0], [495, 0, 9], [0, 0, 9]] }, { "vertices": [[495, 0, 0], [495, 805, 0], [495, 0, 9]] }, { "vertices": [[495, 805, 0], [495, 805, 9], [495, 0, 9]] }], "transforms": [0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 402, 60, -485, 1] } };
let res = intersect(data.geo1, data.geo2);
testdata2,This test data is deleted a point, the result is correct.
{"geo1":{"polygons":[{"vertices":[[402,60,0],[402,865,10],[402,865,0]],"plane":[-1,0,0,-402]},{"vertices":[[402,60,0],[402,60,10],[402,865,10]],"plane":[-1,0,0,-402]},{"vertices":[[402,865,0],[393,865,10],[393,865,0]],"plane":[0,-1,0,-865]},{"vertices":[[402,865,0],[402,865,10],[393,865,10]],"plane":[0,-1,0,-865]},{"vertices":[[393,865,0],[393,60,10],[393,60,0]],"plane":[1,0,0,393]},{"vertices":[[393,865,0],[393,865,10],[393,60,10]],"plane":[1,0,0,393]},{"vertices":[[393,60,0],[402,60,10],[402,60,0]],"plane":[0,1,0,60]},{"vertices":[[393,60,0],[393,60,10],[402,60,10]],"plane":[0,1,0,60]},{"vertices":[[393,865,10],[402,60,10],[393,60,10]],"plane":[0,0,-1,-10]},{"vertices":[[402,60,10],[393,865,10],[402,865,10]],"plane":[0,0,-1,-10]},{"vertices":[[0,710,0],[36,710,0],[36,710,18]],"plane":[0,-1,0,-710]},{"vertices":[[0,710,0],[36,710,18],[0,710,18]],"plane":[0,-1,0,-710]},{"vertices":[[36,710,0],[36,637,0],[36,637,18]],"plane":[-1,0,0,-36]},{"vertices":[[36,710,0],[36,637,18],[36,710,18]],"plane":[-1,0,0,-36]},{"vertices":[[36,637,0],[0,637,0],[0,637,18]],"plane":[0,1,0,637]},{"vertices":[[36,637,0],[0,637,18],[36,637,18]],"plane":[0,1,0,637]},{"vertices":[[0,637,0],[0,0,0],[0,0,18]],"plane":[-1,0,0,0]},{"vertices":[[0,637,0],[0,0,18],[0,637,18]],"plane":[-1,0,0,0]},{"vertices":[[0,0,0],[420,0,0],[420,0,18]],"plane":[0,-1,0,0]},{"vertices":[[0,0,0],[420,0,18],[0,0,18]],"plane":[0,-1,0,0]},{"vertices":[[420,0,0],[420,875,0],[420,875,18]],"plane":[1,0,0,420]},{"vertices":[[420,0,0],[420,875,18],[420,0,18]],"plane":[1,0,0,420]},{"vertices":[[420,875,0],[0,875,0],[0,875,18]],"plane":[0,1,0,875]},{"vertices":[[420,875,0],[0,875,18],[420,875,18]],"plane":[0,1,0,875]},{"vertices":[[0,875,0],[0,710,0],[0,710,18]],"plane":[-1,0,0,0]},{"vertices":[[0,875,0],[0,710,18],[0,875,18]],"plane":[-1,0,0,0]},{"vertices":[[0,0,0],[393,865,0],[393,60,0]],"plane":[0,0,-1,0]},{"vertices":[[402,60,0],[0,0,0],[393,60,0]],"plane":[0,0,-1,0]},{"vertices":[[0,875,0],[36,710,0],[0,710,0]],"plane":[0,0,-1,0]},{"vertices":[[36,637,0],[0,0,0],[0,637,0]],"plane":[0,0,-1,0]},{"vertices":[[402,60,0],[420,0,0],[0,0,0]],"plane":[0,0,-1,0]},{"vertices":[[36,637,0],[393,865,0],[0,0,0]],"plane":[0,0,-0.9999999999999999,0]},{"vertices":[[402,865,0],[420,0,0],[402,60,0]],"plane":[0,0,-1,0]},{"vertices":[[36,710,0],[393,865,0],[36,637,0]],"plane":[0,0,-1,0]},{"vertices":[[402,865,0],[420,875,0],[420,0,0]],"plane":[0,0,-1,0]},{"vertices":[[0,875,0],[393,865,0],[36,710,0]],"plane":[0,0,-0.9999999999999999,0]},{"vertices":[[393,865,0],[420,875,0],[402,865,0]],"plane":[0,0,-1,0]},{"vertices":[[420,875,0],[393,865,0],[0,875,0]],"plane":[0,0,-1,0]},{"vertices":[[0,637,18],[0,0,18],[420,0,18]],"plane":[0,0,1,18]},{"vertices":[[420,0,18],[420,875,18],[0,875,18]],"plane":[0,0,1,18]},{"vertices":[[0,875,18],[0,710,18],[36,710,18]],"plane":[0,0,1,18]},{"vertices":[[36,637,18],[0,637,18],[420,0,18]],"plane":[0,0,1,18]},{"vertices":[[420,0,18],[0,875,18],[36,710,18]],"plane":[0,0,1,18]},{"vertices":[[36,710,18],[36,637,18],[420,0,18]],"plane":[0,0,1,18]}],"transforms":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},"geo2":{"polygons":[{"vertices":[[495,805,0],[495,0,0],[0,0,0]]},{"vertices":[[0,0,0],[0,805,0],[495,805,0]]},{"vertices":[[0,0,9],[495,0,9],[495,805,9]]},{"vertices":[[495,805,9],[0,805,9],[0,0,9]]},{"vertices":[[495,805,0],[0,805,0],[495,805,9]]},{"vertices":[[0,805,0],[0,805,9],[495,805,9]]},{"vertices":[[0,805,0],[0,0,0],[0,805,9]]},{"vertices":[[0,0,0],[0,0,9],[0,805,9]]},{"vertices":[[0,0,0],[495,0,0],[0,0,9]]},{"vertices":[[495,0,0],[495,0,9],[0,0,9]]},{"vertices":[[495,0,0],[495,805,0],[495,0,9]]},{"vertices":[[495,805,0],[495,805,9],[495,0,9]]}],"transforms":[0,0,1,0,0,1,0,0,-1,0,0,0,402,60,-485,1]}}
Specifications
- Version:"@jscad/modeling": "^2.11.0"
- Platform:win chrome
- Environment: (browser)
I solved the problem by calling 'retessellate' first
I solved the problem by calling 'retessellate' first
Nice. Are you creating the 3D solids using a special function?
The 3D solids were generated on a WebCAD that I developed.
The 3D solids were generated on a WebCAD that I developed.
OK. The booleans assume that 3D meshes are constructed properly. But maybe some improvements can be made in the logic. Thanks for the nice example.
It is better to expect proper input for booleans, because if we start adding defensive checks all over the code it can quickly kill performance,
It is better to expect proper input for booleans, because if we start adding defensive checks all over the code it can quickly kill performance,
you are right. I don't think the data is wrong, it's just that it's not that good.