@jscad/modeling
Version:
Constructive Solid Geometry (CSG) Library for JSCAD
117 lines (102 loc) • 8.1 kB
JavaScript
const test = require('ava')
const { comparePolygonsAsPoints } = require('../../../test/helpers')
const { geom3 } = require('../../geometries')
const { sphere, cuboid } = require('../../primitives')
const { intersect } = require('./index')
const { center } = require('../transforms/center')
test('intersect: intersect of one or more geom3 objects produces expected geometry', (t) => {
const geometry1 = sphere({ radius: 2, segments: 8 })
// intersect of one object
const result1 = intersect(geometry1)
let obs = geom3.toPoints(result1)
let exp = [
[[2, 0, 0], [1.4142135623730951, -1.414213562373095, 0],
[1.0000000000000002, -1, -1.414213562373095], [1.4142135623730951, 0, -1.414213562373095]],
[[1.4142135623730951, 0, 1.414213562373095], [1.0000000000000002, -1, 1.414213562373095],
[1.4142135623730951, -1.414213562373095, 0], [2, 0, 0]],
[[1.4142135623730951, 0, -1.414213562373095], [1.0000000000000002, -1, -1.414213562373095], [1.2246467991473532e-16, 0, -2]],
[[1.2246467991473532e-16, 0, 2], [1.0000000000000002, -1, 1.414213562373095], [1.4142135623730951, 0, 1.414213562373095]],
[[1.4142135623730951, -1.414213562373095, 0], [1.2246467991473532e-16, -2, 0],
[8.659560562354934e-17, -1.4142135623730951, -1.414213562373095], [1.0000000000000002, -1, -1.414213562373095]],
[[1.0000000000000002, -1, 1.414213562373095], [8.659560562354934e-17, -1.4142135623730951, 1.414213562373095],
[1.2246467991473532e-16, -2, 0], [1.4142135623730951, -1.414213562373095, 0]],
[[1.0000000000000002, -1, -1.414213562373095], [8.659560562354934e-17, -1.4142135623730951, -1.414213562373095], [8.659560562354934e-17, -8.659560562354932e-17, -2]],
[[8.659560562354934e-17, -8.659560562354932e-17, 2], [8.659560562354934e-17, -1.4142135623730951, 1.414213562373095], [1.0000000000000002, -1, 1.414213562373095]],
[[1.2246467991473532e-16, -2, 0], [-1.414213562373095, -1.4142135623730951, 0],
[-1, -1.0000000000000002, -1.414213562373095], [8.659560562354934e-17, -1.4142135623730951, -1.414213562373095]],
[[8.659560562354934e-17, -1.4142135623730951, 1.414213562373095], [-1, -1.0000000000000002, 1.414213562373095],
[-1.414213562373095, -1.4142135623730951, 0], [1.2246467991473532e-16, -2, 0]],
[[8.659560562354934e-17, -1.4142135623730951, -1.414213562373095], [-1, -1.0000000000000002, -1.414213562373095], [7.498798913309288e-33, -1.2246467991473532e-16, -2]],
[[7.498798913309288e-33, -1.2246467991473532e-16, 2], [-1, -1.0000000000000002, 1.414213562373095], [8.659560562354934e-17, -1.4142135623730951, 1.414213562373095]],
[[-1.414213562373095, -1.4142135623730951, 0], [-2, -2.4492935982947064e-16, 0],
[-1.4142135623730951, -1.7319121124709868e-16, -1.414213562373095], [-1, -1.0000000000000002, -1.414213562373095]],
[[-1, -1.0000000000000002, 1.414213562373095], [-1.4142135623730951, -1.7319121124709868e-16, 1.414213562373095],
[-2, -2.4492935982947064e-16, 0], [-1.414213562373095, -1.4142135623730951, 0]],
[[-1, -1.0000000000000002, -1.414213562373095], [-1.4142135623730951, -1.7319121124709868e-16, -1.414213562373095], [-8.659560562354932e-17, -8.659560562354934e-17, -2]],
[[-8.659560562354932e-17, -8.659560562354934e-17, 2], [-1.4142135623730951, -1.7319121124709868e-16, 1.414213562373095], [-1, -1.0000000000000002, 1.414213562373095]],
[[-2, -2.4492935982947064e-16, 0], [-1.4142135623730954, 1.414213562373095, 0],
[-1.0000000000000002, 1, -1.414213562373095], [-1.4142135623730951, -1.7319121124709868e-16, -1.414213562373095]],
[[-1.4142135623730951, -1.7319121124709868e-16, 1.414213562373095], [-1.0000000000000002, 1, 1.414213562373095],
[-1.4142135623730954, 1.414213562373095, 0], [-2, -2.4492935982947064e-16, 0]],
[[-1.4142135623730951, -1.7319121124709868e-16, -1.414213562373095], [-1.0000000000000002, 1, -1.414213562373095], [-1.2246467991473532e-16, -1.4997597826618576e-32, -2]],
[[-1.2246467991473532e-16, -1.4997597826618576e-32, 2], [-1.0000000000000002, 1, 1.414213562373095], [-1.4142135623730951, -1.7319121124709868e-16, 1.414213562373095]],
[[-1.4142135623730954, 1.414213562373095, 0], [-3.6739403974420594e-16, 2, 0],
[-2.59786816870648e-16, 1.4142135623730951, -1.414213562373095], [-1.0000000000000002, 1, -1.414213562373095]],
[[-1.0000000000000002, 1, 1.414213562373095], [-2.59786816870648e-16, 1.4142135623730951, 1.414213562373095],
[-3.6739403974420594e-16, 2, 0], [-1.4142135623730954, 1.414213562373095, 0]],
[[-1.0000000000000002, 1, -1.414213562373095], [-2.59786816870648e-16, 1.4142135623730951, -1.414213562373095], [-8.659560562354935e-17, 8.659560562354932e-17, -2]],
[[-8.659560562354935e-17, 8.659560562354932e-17, 2], [-2.59786816870648e-16, 1.4142135623730951, 1.414213562373095], [-1.0000000000000002, 1, 1.414213562373095]],
[[-3.6739403974420594e-16, 2, 0], [1.4142135623730947, 1.4142135623730954, 0],
[0.9999999999999998, 1.0000000000000002, -1.414213562373095], [-2.59786816870648e-16, 1.4142135623730951, -1.414213562373095]],
[[-2.59786816870648e-16, 1.4142135623730951, 1.414213562373095], [0.9999999999999998, 1.0000000000000002, 1.414213562373095],
[1.4142135623730947, 1.4142135623730954, 0], [-3.6739403974420594e-16, 2, 0]],
[[-2.59786816870648e-16, 1.4142135623730951, -1.414213562373095], [0.9999999999999998, 1.0000000000000002, -1.414213562373095], [-2.2496396739927864e-32, 1.2246467991473532e-16, -2]],
[[-2.2496396739927864e-32, 1.2246467991473532e-16, 2], [0.9999999999999998, 1.0000000000000002, 1.414213562373095], [-2.59786816870648e-16, 1.4142135623730951, 1.414213562373095]],
[[1.4142135623730947, 1.4142135623730954, 0], [2, 4.898587196589413e-16, 0],
[1.4142135623730951, 3.4638242249419736e-16, -1.414213562373095], [0.9999999999999998, 1.0000000000000002, -1.414213562373095]],
[[0.9999999999999998, 1.0000000000000002, 1.414213562373095], [1.4142135623730951, 3.4638242249419736e-16, 1.414213562373095],
[2, 4.898587196589413e-16, 0], [1.4142135623730947, 1.4142135623730954, 0]],
[[0.9999999999999998, 1.0000000000000002, -1.414213562373095], [1.4142135623730951, 3.4638242249419736e-16, -1.414213562373095], [8.65956056235493e-17, 8.659560562354935e-17, -2]],
[[8.65956056235493e-17, 8.659560562354935e-17, 2], [1.4142135623730951, 3.4638242249419736e-16, 1.414213562373095], [0.9999999999999998, 1.0000000000000002, 1.414213562373095]]
]
t.notThrows.skip(() => geom3.validate(result1))
t.is(obs.length, 32)
t.true(comparePolygonsAsPoints(obs, exp))
// intersect of two non-overlapping objects
const geometry2 = center({ relativeTo: [10, 10, 10] }, cuboid({ size: [4, 4, 4] }))
const result2 = intersect(geometry1, geometry2)
obs = geom3.toPoints(result2)
t.notThrows(() => geom3.validate(result2))
t.is(obs.length, 0)
// intersect of two partially overlapping objects
const geometry3 = cuboid({ size: [18, 18, 18] })
const result3 = intersect(geometry2, geometry3)
obs = geom3.toPoints(result3)
// the order changes based on the bestplane chosen in Node.js
/*
exp = [
[[9, 9, 8], [9, 9, 9], [9, 8, 9], [9, 8, 8]],
[[8, 9, 9], [9, 9, 9], [9, 9, 8], [8, 9, 8]],
[[9, 8, 9], [9, 9, 9], [8, 9, 9], [8, 8, 9]],
[[8, 9, 9], [8, 9, 8], [8, 8, 8], [8, 8, 9]],
[[8, 8, 9], [8, 8, 8], [9, 8, 8], [9, 8, 9]],
[[9, 9, 8], [9, 8, 8], [8, 8, 8], [8, 9, 8]]
]
*/
exp = [
[[9, 9, 8], [9, 9, 9], [9, 8, 9], [9, 8, 8]],
[[8, 9, 9], [9, 9, 9], [9, 9, 8], [8, 9, 8]],
[[9, 8, 9], [9, 9, 9], [8, 9, 9], [8, 8, 9]],
[[8, 9, 9], [8, 9, 8], [8, 8, 8], [8, 8, 9]],
[[8, 8, 9], [8, 8, 8], [9, 8, 8], [9, 8, 9]],
[[9, 8, 8], [8, 8, 8], [8, 9, 8], [9, 9, 8]]
]
t.notThrows(() => geom3.validate(result3))
t.is(obs.length, 6)
t.true(comparePolygonsAsPoints(obs, exp))
// intersect of two completely overlapping objects
const result4 = intersect(geometry1, geometry3)
obs = geom3.toPoints(result4)
t.notThrows.skip(() => geom3.validate(result4))
t.is(obs.length, 32)
})