OpenJSCAD.org icon indicating copy to clipboard operation
OpenJSCAD.org copied to clipboard

[bug] Wrong intersection result

Open FishOrBear opened this issue 1 year ago • 6 comments

As shown in the figure, there is a wrong intersection when there should be no intersection.

image

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. image

{"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)

FishOrBear avatar Mar 01 '23 08:03 FishOrBear

I solved the problem by calling 'retessellate' first

FishOrBear avatar Mar 01 '23 08:03 FishOrBear

I solved the problem by calling 'retessellate' first

Nice. Are you creating the 3D solids using a special function?

z3dev avatar Mar 01 '23 08:03 z3dev

The 3D solids were generated on a WebCAD that I developed.

FishOrBear avatar Mar 01 '23 08:03 FishOrBear

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.

z3dev avatar Mar 01 '23 11:03 z3dev

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,

hrgdavor avatar Mar 01 '23 11:03 hrgdavor

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.

FishOrBear avatar Mar 03 '23 07:03 FishOrBear