UNPKG

@jscad/modeling

Version:

Constructive Solid Geometry (CSG) Library for JSCAD

166 lines (147 loc) 9.64 kB
const test = require('ava') const geom3 = require('../geometries/geom3') const { roundedCylinder } = require('./index') const comparePolygonsAsPoints = require('../../test/helpers/comparePolygonsAsPoints') test('roundedCylinder (defaults)', (t) => { const obs = roundedCylinder() const pts = geom3.toPoints(obs) t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 544) }) test('roundedCylinder (zero height)', (t) => { const obs = roundedCylinder({ height: 0 }) const pts = geom3.toPoints(obs) t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 0) }) test('roundedCylinder (zero radius)', (t) => { const obs = roundedCylinder({ radius: 0, roundRadius: 0 }) const pts = geom3.toPoints(obs) t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 0) }) test('roundedCylinder (zero roundRadius)', (t) => { const obs = roundedCylinder({ roundRadius: 0 }) const pts = geom3.toPoints(obs) t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 96) }) test('roundedCylinder (options)', (t) => { // test segments let obs = roundedCylinder({ segments: 5 }) let pts = geom3.toPoints(obs) let exp = [ ] t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 15) // test center obs = roundedCylinder({ segments: 5, center: [-5, -5, -5] }) pts = geom3.toPoints(obs) exp = [ [[-4.048943483704846, -4.6909830056250525, -5.8], [-5, -4, -5.8], [-5, -4, -4.2], [-4.048943483704846, -4.6909830056250525, -4.2]], [[-5, -4, -5.8], [-4.048943483704846, -4.6909830056250525, -5.8], [-5, -5, -6]], [[-5, -5, -4], [-4.048943483704846, -4.6909830056250525, -4.2], [-5, -4, -4.2]], [[-4.412214747707527, -5.8090169943749475, -5.8], [-4.048943483704846, -4.6909830056250525, -5.8], [-4.048943483704846, -4.6909830056250525, -4.2], [-4.412214747707527, -5.8090169943749475, -4.2]], [[-4.048943483704846, -4.6909830056250525, -5.8], [-4.412214747707527, -5.8090169943749475, -5.8], [-5, -5, -6]], [[-5, -5, -4], [-4.412214747707527, -5.8090169943749475, -4.2], [-4.048943483704846, -4.6909830056250525, -4.2]], [[-5.587785252292473, -5.8090169943749475, -5.8], [-4.412214747707527, -5.8090169943749475, -5.8], [-4.412214747707527, -5.8090169943749475, -4.2], [-5.587785252292473, -5.8090169943749475, -4.2]], [[-4.412214747707527, -5.8090169943749475, -5.8], [-5.587785252292473, -5.8090169943749475, -5.8], [-5, -5, -6]], [[-5, -5, -4], [-5.587785252292473, -5.8090169943749475, -4.2], [-4.412214747707527, -5.8090169943749475, -4.2]], [[-5.951056516295154, -4.6909830056250525, -5.8], [-5.587785252292473, -5.8090169943749475, -5.8], [-5.587785252292473, -5.8090169943749475, -4.2], [-5.951056516295154, -4.6909830056250525, -4.2]], [[-5.587785252292473, -5.8090169943749475, -5.8], [-5.951056516295154, -4.6909830056250525, -5.8], [-5, -5, -6]], [[-5, -5, -4], [-5.951056516295154, -4.6909830056250525, -4.2], [-5.587785252292473, -5.8090169943749475, -4.2]], [[-5, -4, -5.8], [-5.951056516295154, -4.6909830056250525, -5.8], [-5.951056516295154, -4.6909830056250525, -4.2], [-5, -4, -4.2]], [[-5.951056516295154, -4.6909830056250525, -5.8], [-5, -4, -5.8], [-5, -5, -6]], [[-5, -5, -4], [-5, -4, -4.2], [-5.951056516295154, -4.6909830056250525, -4.2]] ] t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 15) t.true(comparePolygonsAsPoints(pts, exp)) // test height obs = roundedCylinder({ segments: 5, height: 20 }) pts = geom3.toPoints(obs) exp = [ [[0.9510565162951535, 0.30901699437494745, -9.8], [0, 1, -9.8], [0, 1, 9.8], [0.9510565162951535, 0.30901699437494745, 9.8]], [[0, 1, -9.8], [0.9510565162951535, 0.30901699437494745, -9.8], [0, 0, -10]], [[0, 0, 10], [0.9510565162951535, 0.30901699437494745, 9.8], [0, 1, 9.8]], [[0.5877852522924732, -0.8090169943749473, -9.8], [0.9510565162951535, 0.30901699437494745, -9.8], [0.9510565162951535, 0.30901699437494745, 9.8], [0.5877852522924732, -0.8090169943749473, 9.8]], [[0.9510565162951535, 0.30901699437494745, -9.8], [0.5877852522924732, -0.8090169943749473, -9.8], [0, 0, -10]], [[0, 0, 10], [0.5877852522924732, -0.8090169943749473, 9.8], [0.9510565162951535, 0.30901699437494745, 9.8]], [[-0.587785252292473, -0.8090169943749475, -9.8], [0.5877852522924732, -0.8090169943749473, -9.8], [0.5877852522924732, -0.8090169943749473, 9.8], [-0.587785252292473, -0.8090169943749475, 9.8]], [[0.5877852522924732, -0.8090169943749473, -9.8], [-0.587785252292473, -0.8090169943749475, -9.8], [0, 0, -10]], [[0, 0, 10], [-0.587785252292473, -0.8090169943749475, 9.8], [0.5877852522924732, -0.8090169943749473, 9.8]], [[-0.9510565162951536, 0.30901699437494723, -9.8], [-0.587785252292473, -0.8090169943749475, -9.8], [-0.587785252292473, -0.8090169943749475, 9.8], [-0.9510565162951536, 0.30901699437494723, 9.8]], [[-0.587785252292473, -0.8090169943749475, -9.8], [-0.9510565162951536, 0.30901699437494723, -9.8], [0, 0, -10]], [[0, 0, 10], [-0.9510565162951536, 0.30901699437494723, 9.8], [-0.587785252292473, -0.8090169943749475, 9.8]], [[0, 1, -9.8], [-0.9510565162951536, 0.30901699437494723, -9.8], [-0.9510565162951536, 0.30901699437494723, 9.8], [0, 1, 9.8]], [[-0.9510565162951536, 0.30901699437494723, -9.8], [0, 1, -9.8], [0, 0, -10]], [[0, 0, 10], [0, 1, 9.8], [-0.9510565162951536, 0.30901699437494723, 9.8]] ] t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 15) t.true(comparePolygonsAsPoints(pts, exp)) // test radius obs = roundedCylinder({ segments: 5, radius: 10 }) pts = geom3.toPoints(obs) exp = [ [[9.510565162951535, 3.0901699437494745, -0.8], [0, 10, -0.8], [0, 10, 0.8], [9.510565162951535, 3.0901699437494745, 0.8]], [[0, 10, -0.8], [9.510565162951535, 3.0901699437494745, -0.8], [0, 0, -1]], [[0, 0, 1], [9.510565162951535, 3.0901699437494745, 0.8], [0, 10, 0.8]], [[5.877852522924733, -8.090169943749473, -0.8], [9.510565162951535, 3.0901699437494745, -0.8], [9.510565162951535, 3.0901699437494745, 0.8], [5.877852522924733, -8.090169943749473, 0.8]], [[9.510565162951535, 3.0901699437494745, -0.8], [5.877852522924733, -8.090169943749473, -0.8], [0, 0, -1]], [[0, 0, 1], [5.877852522924733, -8.090169943749473, 0.8], [9.510565162951535, 3.0901699437494745, 0.8]], [[-5.87785252292473, -8.090169943749475, -0.8], [5.877852522924733, -8.090169943749473, -0.8], [5.877852522924733, -8.090169943749473, 0.8], [-5.87785252292473, -8.090169943749475, 0.8]], [[5.877852522924733, -8.090169943749473, -0.8], [-5.87785252292473, -8.090169943749475, -0.8], [0, 0, -1]], [[0, 0, 1], [-5.87785252292473, -8.090169943749475, 0.8], [5.877852522924733, -8.090169943749473, 0.8]], [[-9.510565162951536, 3.0901699437494723, -0.8], [-5.87785252292473, -8.090169943749475, -0.8], [-5.87785252292473, -8.090169943749475, 0.8], [-9.510565162951536, 3.0901699437494723, 0.8]], [[-5.87785252292473, -8.090169943749475, -0.8], [-9.510565162951536, 3.0901699437494723, -0.8], [0, 0, -1]], [[0, 0, 1], [-9.510565162951536, 3.0901699437494723, 0.8], [-5.87785252292473, -8.090169943749475, 0.8]], [[0, 10, -0.8], [-9.510565162951536, 3.0901699437494723, -0.8], [-9.510565162951536, 3.0901699437494723, 0.8], [0, 10, 0.8]], [[-9.510565162951536, 3.0901699437494723, -0.8], [0, 10, -0.8], [0, 0, -1]], [[0, 0, 1], [0, 10, 0.8], [-9.510565162951536, 3.0901699437494723, 0.8]] ] t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 15) t.true(comparePolygonsAsPoints(pts, exp)) // test round radius obs = roundedCylinder({ segments: 5, height: 20, radius: 5, roundRadius: 2 }) pts = geom3.toPoints(obs) exp = [ [[4.755282581475767, 1.5450849718747373, -8], [0, 5, -8], [0, 5, 8], [4.755282581475767, 1.5450849718747373, 8]], [[0, 5, -8], [4.755282581475767, 1.5450849718747373, -8], [0, 0, -10]], [[0, 0, 10], [4.755282581475767, 1.5450849718747373, 8], [0, 5, 8]], [[2.9389262614623664, -4.045084971874736, -8], [4.755282581475767, 1.5450849718747373, -8], [4.755282581475767, 1.5450849718747373, 8], [2.9389262614623664, -4.045084971874736, 8]], [[4.755282581475767, 1.5450849718747373, -8], [2.9389262614623664, -4.045084971874736, -8], [0, 0, -10]], [[0, 0, 10], [2.9389262614623664, -4.045084971874736, 8], [4.755282581475767, 1.5450849718747373, 8]], [[-2.938926261462365, -4.045084971874737, -8], [2.9389262614623664, -4.045084971874736, -8], [2.9389262614623664, -4.045084971874736, 8], [-2.938926261462365, -4.045084971874737, 8]], [[2.9389262614623664, -4.045084971874736, -8], [-2.938926261462365, -4.045084971874737, -8], [0, 0, -10]], [[0, 0, 10], [-2.938926261462365, -4.045084971874737, 8], [2.9389262614623664, -4.045084971874736, 8]], [[-4.755282581475768, 1.5450849718747361, -8], [-2.938926261462365, -4.045084971874737, -8], [-2.938926261462365, -4.045084971874737, 8], [-4.755282581475768, 1.5450849718747361, 8]], [[-2.938926261462365, -4.045084971874737, -8], [-4.755282581475768, 1.5450849718747361, -8], [0, 0, -10]], [[0, 0, 10], [-4.755282581475768, 1.5450849718747361, 8], [-2.938926261462365, -4.045084971874737, 8]], [[0, 5, -8], [-4.755282581475768, 1.5450849718747361, -8], [-4.755282581475768, 1.5450849718747361, 8], [0, 5, 8]], [[-4.755282581475768, 1.5450849718747361, -8], [0, 5, -8], [0, 0, -10]], [[0, 0, 10], [0, 5, 8], [-4.755282581475768, 1.5450849718747361, 8]] ] t.notThrows(() => geom3.validate(obs)) t.is(pts.length, 15) t.true(comparePolygonsAsPoints(pts, exp)) })