@jscad/modeling
Version:
Constructive Solid Geometry (CSG) Library for JSCAD
147 lines (129 loc) • 4.53 kB
JavaScript
const test = require('ava')
const { TAU } = require('../maths/constants')
const geom2 = require('../geometries/geom2')
const comparePoints = require('../../test/helpers/comparePoints')
const { ellipse } = require('./index')
test('ellipse (defaults)', (t) => {
const geometry = ellipse()
const obs = geom2.toPoints(geometry)
t.notThrows(() => geom2.validate(geometry))
t.deepEqual(obs.length, 32)
})
test('ellipse (options)', (t) => {
// test center
let geometry = ellipse({ center: [3, 5] })
let obs = geom2.toPoints(geometry)
let exp = [
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]
]
t.notThrows(() => geom2.validate(geometry))
t.deepEqual(obs.length, 32)
t.true(comparePoints(obs, exp))
// test radius
geometry = ellipse({ radius: [3, 5], segments: 16 })
obs = geom2.toPoints(geometry)
exp = [
[ ],
[ ],
[ ],
[ ],
[ ],
[-1.1480502970952693, 4.619397662556434],
[-2.1213203435596424, 3.5355339059327378],
[-2.77163859753386, 1.9134171618254494],
[-3, 0],
[-2.7716385975338604, -1.9134171618254483],
[-2.121320343559643, -3.5355339059327373],
[-1.148050297095271, -4.619397662556432],
[ ],
[ ],
[ ],
[ ]
]
t.notThrows(() => geom2.validate(geometry))
t.deepEqual(obs.length, 16)
t.true(comparePoints(obs, exp))
// test startAngle
geometry = ellipse({ radius: [3, 5], startAngle: TAU / 4, segments: 16 })
obs = geom2.toPoints(geometry)
exp = [
[ ],
[-1.1480502970952693, 4.619397662556434],
[-2.1213203435596424, 3.5355339059327378],
[-2.77163859753386, 1.9134171618254494],
[-3, 0],
[-2.7716385975338604, -1.9134171618254483],
[-2.121320343559643, -3.5355339059327373],
[-1.148050297095271, -4.619397662556432],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]
]
t.notThrows(() => geom2.validate(geometry))
t.deepEqual(obs.length, 14)
t.true(comparePoints(obs, exp))
// test endAngle
geometry = ellipse({ radius: [3, 5], endAngle: TAU / 4, segments: 16 })
obs = geom2.toPoints(geometry)
exp = [
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]
]
t.notThrows(() => geom2.validate(geometry))
t.deepEqual(obs.length, 6)
t.true(comparePoints(obs, exp))
// test full rotation with non-zero startAngle
geometry = ellipse({ startAngle: 1, endAngle: 1 + TAU })
obs = geom2.toPoints(geometry)
t.notThrows(() => geom2.validate(geometry))
t.deepEqual(obs.length, 32)
// test segments
geometry = ellipse({ segments: 72 })
obs = geom2.toPoints(geometry)
t.notThrows(() => geom2.validate(geometry))
t.deepEqual(obs.length, 72)
})
test('ellipse (zero radius)', (t) => {
const geometry = ellipse({ radius: [1, 0] })
const obs = geom2.toPoints(geometry)
t.notThrows(() => geom2.validate(geometry))
t.is(obs.length, 0)
})