UNPKG

@jscad/modeling

Version:

Constructive Solid Geometry (CSG) Library for JSCAD

217 lines (206 loc) 17.7 kB
const test = require('ava') const geom3 = require('../geometries/geom3') const { ellipsoid } = require('./index') const comparePolygonsAsPoints = require('../../test/helpers/comparePolygonsAsPoints') test('ellipsoid (defaults)', (t) => { const obs = ellipsoid() const pts = geom3.toPoints(obs) t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 512) }) test('ellipsoid (options)', (t) => { // test radius let obs = ellipsoid({ radius: [3, 5, 7], segments: 12 }) let pts = geom3.toPoints(obs) let exp = [ [[3, 0, 0], [2.598076211353316, -2.4999999999999996, 0], [2.25, -2.1650635094610964, -3.4999999999999996], [2.598076211353316, 0, -3.4999999999999996]], [[2.598076211353316, 0, 3.4999999999999996], [2.25, -2.1650635094610964, 3.4999999999999996], [2.598076211353316, -2.4999999999999996, 0], [3, 0, 0]], [[2.598076211353316, 0, -3.4999999999999996], [2.25, -2.1650635094610964, -3.4999999999999996], [1.2990381056766582, -1.25, -6.06217782649107], [1.5000000000000004, 0, -6.06217782649107]], [[1.5000000000000004, 0, 6.06217782649107], [1.2990381056766582, -1.25, 6.06217782649107], [2.25, -2.1650635094610964, 3.4999999999999996], [2.598076211353316, 0, 3.4999999999999996]], [[1.5000000000000004, 0, -6.06217782649107], [1.2990381056766582, -1.25, -6.06217782649107], [0, 0, -7]], [[0, 0, 7], [1.2990381056766582, -1.25, 6.06217782649107], [1.5000000000000004, 0, 6.06217782649107]], [[2.598076211353316, -2.4999999999999996, 0], [1.5000000000000004, -4.330127018922193, 0], [1.2990381056766584, -3.75, -3.4999999999999996], [2.25, -2.1650635094610964, -3.4999999999999996]], [[2.25, -2.1650635094610964, 3.4999999999999996], [1.2990381056766584, -3.75, 3.4999999999999996], [1.5000000000000004, -4.330127018922193, 0], [2.598076211353316, -2.4999999999999996, 0]], [[2.25, -2.1650635094610964, -3.4999999999999996], [1.2990381056766584, -3.75, -3.4999999999999996], [0.7500000000000004, -2.165063509461097, -6.06217782649107], [1.2990381056766582, -1.25, -6.06217782649107]], [[1.2990381056766582, -1.25, 6.06217782649107], [0.7500000000000004, -2.165063509461097, 6.06217782649107], [1.2990381056766584, -3.75, 3.4999999999999996], [2.25, -2.1650635094610964, 3.4999999999999996]], [[1.2990381056766582, -1.25, -6.06217782649107], [0.7500000000000004, -2.165063509461097, -6.06217782649107], [0, 0, -7]], [[0, 0, 7], [0.7500000000000004, -2.165063509461097, 6.06217782649107], [1.2990381056766582, -1.25, 6.06217782649107]], [[1.5000000000000004, -4.330127018922193, 0], [0, -5, 0], [0, -4.330127018922194, -3.4999999999999996], [1.2990381056766584, -3.75, -3.4999999999999996]], [[1.2990381056766584, -3.75, 3.4999999999999996], [0, -4.330127018922194, 3.4999999999999996], [0, -5, 0], [1.5000000000000004, -4.330127018922193, 0]], [[1.2990381056766584, -3.75, -3.4999999999999996], [0, -4.330127018922194, -3.4999999999999996], [0, -2.5000000000000004, -6.06217782649107], [0.7500000000000004, -2.165063509461097, -6.06217782649107]], [[0.7500000000000004, -2.165063509461097, 6.06217782649107], [0, -2.5000000000000004, 6.06217782649107], [0, -4.330127018922194, 3.4999999999999996], [1.2990381056766584, -3.75, 3.4999999999999996]], [[0.7500000000000004, -2.165063509461097, -6.06217782649107], [0, -2.5000000000000004, -6.06217782649107], [0, 0, -7]], [[0, 0, 7], [0, -2.5000000000000004, 6.06217782649107], [0.7500000000000004, -2.165063509461097, 6.06217782649107]], [[0, -5, 0], [-1.4999999999999993, -4.330127018922194, 0], [-1.2990381056766576, -3.7500000000000004, -3.4999999999999996], [0, -4.330127018922194, -3.4999999999999996]], [[0, -4.330127018922194, 3.4999999999999996], [-1.2990381056766576, -3.7500000000000004, 3.4999999999999996], [-1.4999999999999993, -4.330127018922194, 0], [0, -5, 0]], [[0, -4.330127018922194, -3.4999999999999996], [-1.2990381056766576, -3.7500000000000004, -3.4999999999999996], [-0.7499999999999998, -2.1650635094610973, -6.06217782649107], [0, -2.5000000000000004, -6.06217782649107]], [[0, -2.5000000000000004, 6.06217782649107], [-0.7499999999999998, -2.1650635094610973, 6.06217782649107], [-1.2990381056766576, -3.7500000000000004, 3.4999999999999996], [0, -4.330127018922194, 3.4999999999999996]], [[0, -2.5000000000000004, -6.06217782649107], [-0.7499999999999998, -2.1650635094610973, -6.06217782649107], [0, 0, -7]], [[0, 0, 7], [-0.7499999999999998, -2.1650635094610973, 6.06217782649107], [0, -2.5000000000000004, 6.06217782649107]], [[-1.4999999999999993, -4.330127018922194, 0], [-2.598076211353316, -2.4999999999999996, 0], [-2.25, -2.1650635094610964, -3.4999999999999996], [-1.2990381056766576, -3.7500000000000004, -3.4999999999999996]], [[-1.2990381056766576, -3.7500000000000004, 3.4999999999999996], [-2.25, -2.1650635094610964, 3.4999999999999996], [-2.598076211353316, -2.4999999999999996, 0], [-1.4999999999999993, -4.330127018922194, 0]], [[-1.2990381056766576, -3.7500000000000004, -3.4999999999999996], [-2.25, -2.1650635094610964, -3.4999999999999996], [-1.2990381056766582, -1.25, -6.06217782649107], [-0.7499999999999998, -2.1650635094610973, -6.06217782649107]], [[-0.7499999999999998, -2.1650635094610973, 6.06217782649107], [-1.2990381056766582, -1.25, 6.06217782649107], [-2.25, -2.1650635094610964, 3.4999999999999996], [-1.2990381056766576, -3.7500000000000004, 3.4999999999999996]], [[-0.7499999999999998, -2.1650635094610973, -6.06217782649107], [-1.2990381056766582, -1.25, -6.06217782649107], [0, 0, -7]], [[0, 0, 7], [-1.2990381056766582, -1.25, 6.06217782649107], [-0.7499999999999998, -2.1650635094610973, 6.06217782649107]], [[-2.598076211353316, -2.4999999999999996, 0], [-3, 0, 0], [-2.598076211353316, 0, -3.4999999999999996], [-2.25, -2.1650635094610964, -3.4999999999999996]], [[-2.25, -2.1650635094610964, 3.4999999999999996], [-2.598076211353316, 0, 3.4999999999999996], [-3, 0, 0], [-2.598076211353316, -2.4999999999999996, 0]], [[-2.25, -2.1650635094610964, -3.4999999999999996], [-2.598076211353316, 0, -3.4999999999999996], [-1.5000000000000004, 0, -6.06217782649107], [-1.2990381056766582, -1.25, -6.06217782649107]], [[-1.2990381056766582, -1.25, 6.06217782649107], [-1.5000000000000004, 0, 6.06217782649107], [-2.598076211353316, 0, 3.4999999999999996], [-2.25, -2.1650635094610964, 3.4999999999999996]], [[-1.2990381056766582, -1.25, -6.06217782649107], [-1.5000000000000004, 0, -6.06217782649107], [0, 0, -7]], [[0, 0, 7], [-1.5000000000000004, 0, 6.06217782649107], [-1.2990381056766582, -1.25, 6.06217782649107]], [[-3, 0, 0], [-2.5980762113533165, 2.4999999999999987, 0], [-2.2500000000000004, 2.1650635094610955, -3.4999999999999996], [-2.598076211353316, 0, -3.4999999999999996]], [[-2.598076211353316, 0, 3.4999999999999996], [-2.2500000000000004, 2.1650635094610955, 3.4999999999999996], [-2.5980762113533165, 2.4999999999999987, 0], [-3, 0, 0]], [[-2.598076211353316, 0, -3.4999999999999996], [-2.2500000000000004, 2.1650635094610955, -3.4999999999999996], [-1.2990381056766584, 1.2499999999999996, -6.06217782649107], [-1.5000000000000004, 0, -6.06217782649107]], [[-1.5000000000000004, 0, 6.06217782649107], [-1.2990381056766584, 1.2499999999999996, 6.06217782649107], [-2.2500000000000004, 2.1650635094610955, 3.4999999999999996], [-2.598076211353316, 0, 3.4999999999999996]], [[-1.5000000000000004, 0, -6.06217782649107], [-1.2990381056766584, 1.2499999999999996, -6.06217782649107], [0, 0, -7]], [[0, 0, 7], [-1.2990381056766584, 1.2499999999999996, 6.06217782649107], [-1.5000000000000004, 0, 6.06217782649107]], [[-2.5980762113533165, 2.4999999999999987, 0], [-1.5000000000000013, 4.330127018922193, 0], [-1.2990381056766591, 3.75, -3.4999999999999996], [-2.2500000000000004, 2.1650635094610955, -3.4999999999999996]], [[-2.2500000000000004, 2.1650635094610955, 3.4999999999999996], [-1.2990381056766591, 3.75, 3.4999999999999996], [-1.5000000000000013, 4.330127018922193, 0], [-2.5980762113533165, 2.4999999999999987, 0]], [[-2.2500000000000004, 2.1650635094610955, -3.4999999999999996], [-1.2990381056766591, 3.75, -3.4999999999999996], [-0.7500000000000009, 2.165063509461097, -6.06217782649107], [-1.2990381056766584, 1.2499999999999996, -6.06217782649107]], [[-1.2990381056766584, 1.2499999999999996, 6.06217782649107], [-0.7500000000000009, 2.165063509461097, 6.06217782649107], [-1.2990381056766591, 3.75, 3.4999999999999996], [-2.2500000000000004, 2.1650635094610955, 3.4999999999999996]], [[-1.2990381056766584, 1.2499999999999996, -6.06217782649107], [-0.7500000000000009, 2.165063509461097, -6.06217782649107], [0, 0, -7]], [[0, 0, 7], [-0.7500000000000009, 2.165063509461097, 6.06217782649107], [-1.2990381056766584, 1.2499999999999996, 6.06217782649107]], [[-1.5000000000000013, 4.330127018922193, 0], [0, 5, 0], [0, 4.330127018922194, -3.4999999999999996], [-1.2990381056766591, 3.75, -3.4999999999999996]], [[-1.2990381056766591, 3.75, 3.4999999999999996], [0, 4.330127018922194, 3.4999999999999996], [0, 5, 0], [-1.5000000000000013, 4.330127018922193, 0]], [[-1.2990381056766591, 3.75, -3.4999999999999996], [0, 4.330127018922194, -3.4999999999999996], [0, 2.5000000000000004, -6.06217782649107], [-0.7500000000000009, 2.165063509461097, -6.06217782649107]], [[-0.7500000000000009, 2.165063509461097, 6.06217782649107], [0, 2.5000000000000004, 6.06217782649107], [0, 4.330127018922194, 3.4999999999999996], [-1.2990381056766591, 3.75, 3.4999999999999996]], [[-0.7500000000000009, 2.165063509461097, -6.06217782649107], [0, 2.5000000000000004, -6.06217782649107], [0, 0, -7]], [[0, 0, 7], [0, 2.5000000000000004, 6.06217782649107], [-0.7500000000000009, 2.165063509461097, 6.06217782649107]], [[0, 5, 0], [1.5000000000000004, 4.330127018922193, 0], [1.2990381056766584, 3.75, -3.4999999999999996], [0, 4.330127018922194, -3.4999999999999996]], [[0, 4.330127018922194, 3.4999999999999996], [1.2990381056766584, 3.75, 3.4999999999999996], [1.5000000000000004, 4.330127018922193, 0], [0, 5, 0]], [[0, 4.330127018922194, -3.4999999999999996], [1.2990381056766584, 3.75, -3.4999999999999996], [0.7500000000000004, 2.165063509461097, -6.06217782649107], [0, 2.5000000000000004, -6.06217782649107]], [[0, 2.5000000000000004, 6.06217782649107], [0.7500000000000004, 2.165063509461097, 6.06217782649107], [1.2990381056766584, 3.75, 3.4999999999999996], [0, 4.330127018922194, 3.4999999999999996]], [[0, 2.5000000000000004, -6.06217782649107], [0.7500000000000004, 2.165063509461097, -6.06217782649107], [0, 0, -7]], [[0, 0, 7], [0.7500000000000004, 2.165063509461097, 6.06217782649107], [0, 2.5000000000000004, 6.06217782649107]], [[1.5000000000000004, 4.330127018922193, 0], [2.598076211353315, 2.500000000000002, 0], [2.2499999999999996, 2.1650635094610986, -3.4999999999999996], [1.2990381056766584, 3.75, -3.4999999999999996]], [[1.2990381056766584, 3.75, 3.4999999999999996], [2.2499999999999996, 2.1650635094610986, 3.4999999999999996], [2.598076211353315, 2.500000000000002, 0], [1.5000000000000004, 4.330127018922193, 0]], [[1.2990381056766584, 3.75, -3.4999999999999996], [2.2499999999999996, 2.1650635094610986, -3.4999999999999996], [1.2990381056766578, 1.2500000000000013, -6.06217782649107], [0.7500000000000004, 2.165063509461097, -6.06217782649107]], [[0.7500000000000004, 2.165063509461097, 6.06217782649107], [1.2990381056766578, 1.2500000000000013, 6.06217782649107], [2.2499999999999996, 2.1650635094610986, 3.4999999999999996], [1.2990381056766584, 3.75, 3.4999999999999996]], [[0.7500000000000004, 2.165063509461097, -6.06217782649107], [1.2990381056766578, 1.2500000000000013, -6.06217782649107], [0, 0, -7]], [[0, 0, 7], [1.2990381056766578, 1.2500000000000013, 6.06217782649107], [0.7500000000000004, 2.165063509461097, 6.06217782649107]], [[2.598076211353315, 2.500000000000002, 0], [3, 0, 0], [2.598076211353316, 0, -3.4999999999999996], [2.2499999999999996, 2.1650635094610986, -3.4999999999999996]], [[2.2499999999999996, 2.1650635094610986, 3.4999999999999996], [2.598076211353316, 0, 3.4999999999999996], [3, 0, 0], [2.598076211353315, 2.500000000000002, 0]], [[2.2499999999999996, 2.1650635094610986, -3.4999999999999996], [2.598076211353316, 0, -3.4999999999999996], [1.5000000000000004, 0, -6.06217782649107], [1.2990381056766578, 1.2500000000000013, -6.06217782649107]], [[1.2990381056766578, 1.2500000000000013, 6.06217782649107], [1.5000000000000004, 0, 6.06217782649107], [2.598076211353316, 0, 3.4999999999999996], [2.2499999999999996, 2.1650635094610986, 3.4999999999999996]], [[1.2990381056766578, 1.2500000000000013, -6.06217782649107], [1.5000000000000004, 0, -6.06217782649107], [0, 0, -7]], [[0, 0, 7], [1.5000000000000004, 0, 6.06217782649107], [1.2990381056766578, 1.2500000000000013, 6.06217782649107]] ] t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 72) t.true(comparePolygonsAsPoints(pts, exp)) // test segments obs = ellipsoid({ segments: 8 }) pts = geom3.toPoints(obs) t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 32) obs = ellipsoid({ center: [-3, 5, 7], segments: 8 }) pts = geom3.toPoints(obs) exp = [ [[-2, 5, 7], [-2.2928932188134525, 4.292893218813452, 7], [-2.5, 4.5, 6.292893218813452], [-2.2928932188134525, 5, 6.292893218813452]], [[-2.2928932188134525, 5, 7.707106781186548], [-2.5, 4.5, 7.707106781186548], [-2.2928932188134525, 4.292893218813452, 7], [-2, 5, 7]], [[-2.2928932188134525, 5, 6.292893218813452], [-2.5, 4.5, 6.292893218813452], [-3, 5, 6]], [[-3, 5, 8], [-2.5, 4.5, 7.707106781186548], [-2.2928932188134525, 5, 7.707106781186548]], [[-2.2928932188134525, 4.292893218813452, 7], [-3, 4, 7], [-3, 4.292893218813452, 6.292893218813452], [-2.5, 4.5, 6.292893218813452]], [[-2.5, 4.5, 7.707106781186548], [-3, 4.292893218813452, 7.707106781186548], [-3, 4, 7], [-2.2928932188134525, 4.292893218813452, 7]], [[-2.5, 4.5, 6.292893218813452], [-3, 4.292893218813452, 6.292893218813452], [-3, 5, 6]], [[-3, 5, 8], [-3, 4.292893218813452, 7.707106781186548], [-2.5, 4.5, 7.707106781186548]], [[-3, 4, 7], [-3.7071067811865475, 4.292893218813452, 7], [-3.5, 4.5, 6.292893218813452], [-3, 4.292893218813452, 6.292893218813452]], [[-3, 4.292893218813452, 7.707106781186548], [-3.5, 4.5, 7.707106781186548], [-3.7071067811865475, 4.292893218813452, 7], [-3, 4, 7]], [[-3, 4.292893218813452, 6.292893218813452], [-3.5, 4.5, 6.292893218813452], [-3, 5, 6]], [[-3, 5, 8], [-3.5, 4.5, 7.707106781186548], [-3, 4.292893218813452, 7.707106781186548]], [[-3.7071067811865475, 4.292893218813452, 7], [-4, 5, 7], [-3.7071067811865475, 5, 6.292893218813452], [-3.5, 4.5, 6.292893218813452]], [[-3.5, 4.5, 7.707106781186548], [-3.7071067811865475, 5, 7.707106781186548], [-4, 5, 7], [-3.7071067811865475, 4.292893218813452, 7]], [[-3.5, 4.5, 6.292893218813452], [-3.7071067811865475, 5, 6.292893218813452], [-3, 5, 6]], [[-3, 5, 8], [-3.7071067811865475, 5, 7.707106781186548], [-3.5, 4.5, 7.707106781186548]], [[-4, 5, 7], [-3.707106781186548, 5.707106781186548, 7], [-3.5, 5.5, 6.292893218813452], [-3.7071067811865475, 5, 6.292893218813452]], [[-3.7071067811865475, 5, 7.707106781186548], [-3.5, 5.5, 7.707106781186548], [-3.707106781186548, 5.707106781186548, 7], [-4, 5, 7]], [[-3.7071067811865475, 5, 6.292893218813452], [-3.5, 5.5, 6.292893218813452], [-3, 5, 6]], [[-3, 5, 8], [-3.5, 5.5, 7.707106781186548], [-3.7071067811865475, 5, 7.707106781186548]], [[-3.707106781186548, 5.707106781186548, 7], [-3, 6, 7], [-3, 5.707106781186548, 6.292893218813452], [-3.5, 5.5, 6.292893218813452]], [[-3.5, 5.5, 7.707106781186548], [-3, 5.707106781186548, 7.707106781186548], [-3, 6, 7], [-3.707106781186548, 5.707106781186548, 7]], [[-3.5, 5.5, 6.292893218813452], [-3, 5.707106781186548, 6.292893218813452], [-3, 5, 6]], [[-3, 5, 8], [-3, 5.707106781186548, 7.707106781186548], [-3.5, 5.5, 7.707106781186548]], [[-3, 6, 7], [-2.2928932188134525, 5.707106781186548, 7], [-2.5, 5.5, 6.292893218813452], [-3, 5.707106781186548, 6.292893218813452]], [[-3, 5.707106781186548, 7.707106781186548], [-2.5, 5.5, 7.707106781186548], [-2.2928932188134525, 5.707106781186548, 7], [-3, 6, 7]], [[-3, 5.707106781186548, 6.292893218813452], [-2.5, 5.5, 6.292893218813452], [-3, 5, 6]], [[-3, 5, 8], [-2.5, 5.5, 7.707106781186548], [-3, 5.707106781186548, 7.707106781186548]], [[-2.2928932188134525, 5.707106781186548, 7], [-2, 5, 7], [-2.2928932188134525, 5, 6.292893218813452], [-2.5, 5.5, 6.292893218813452]], [[-2.5, 5.5, 7.707106781186548], [-2.2928932188134525, 5, 7.707106781186548], [-2, 5, 7], [-2.2928932188134525, 5.707106781186548, 7]], [[-2.5, 5.5, 6.292893218813452], [-2.2928932188134525, 5, 6.292893218813452], [-3, 5, 6]], [[-3, 5, 8], [-2.2928932188134525, 5, 7.707106781186548], [-2.5, 5.5, 7.707106781186548]] ] t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 32) t.true(comparePolygonsAsPoints(pts, exp)) }) test('ellipsoid (zero radius)', (t) => { const obs = ellipsoid({ radius: [1, 1, 0] }) const pts = geom3.toPoints(obs) t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 0) })