@jscad/modeling
Version:
Constructive Solid Geometry (CSG) Library for JSCAD
224 lines (198 loc) • 7.59 kB
JavaScript
const test = require('ava')
const { TAU } = require('../maths/constants')
const path2 = require('../geometries/path2')
const comparePoints = require('../../test/helpers/comparePoints')
const { arc } = require('./index')
test('arc (defaults)', (t) => {
const geometry = arc()
const obs = path2.toPoints(geometry)
t.notThrows(() => path2.validate(geometry))
t.deepEqual(obs.length, 33)
})
test('arc (options)', (t) => {
// test center
let exp = [
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]
]
let geometry = arc({ center: [2, 2], segments: 16 })
let obs = path2.toPoints(geometry)
t.notThrows(() => path2.validate(geometry))
t.deepEqual(obs.length, 17)
t.true(comparePoints(obs, exp))
// test radius
exp = [
[ ],
[ ],
[ ],
[ ],
[ ],
[-0.5473259801441658, 1.923651286345638],
[-1.2052692727585126, 1.5960344545604792],
[-1.7004342714592284, 1.0528643257547114],
[-1.9659461993678036, 0.36749903563314074],
[-1.9659461993678036, -0.36749903563314024],
[-1.7004342714592282, -1.0528643257547117],
[-1.205269272758513, -1.596034454560479],
[-0.5473259801441662, -1.923651286345638],
[ ],
[ ],
[ ],
[ ]
]
geometry = arc({ radius: 2, segments: 16 })
obs = path2.toPoints(geometry)
t.notThrows(() => path2.validate(geometry))
t.deepEqual(obs.length, 17)
t.true(comparePoints(obs, exp))
// test startAngle
exp = [
[ ],
[-0.3546048870425357, 0.9350162426854148],
[-0.6631226582407953, 0.748510748171101],
[-0.8854560256532098, 0.4647231720437687],
[-0.992708874098054, 0.12053668025532308],
[-0.970941817426052, -0.23931566428755788],
[-0.8229838658936566, -0.5680647467311556],
[-0.5680647467311559, -0.8229838658936564],
[-0.23931566428755774, -0.970941817426052],
[ ],
[ ],
[ ],
[ ],
[ ]
]
geometry = arc({ startAngle: TAU / 4, segments: 16 })
obs = path2.toPoints(geometry)
t.notThrows(() => path2.validate(geometry))
t.deepEqual(obs.length, 14)
t.true(comparePoints(obs, exp))
// test endAngle
exp = [
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]
]
geometry = arc({ endAngle: TAU / 4, segments: 16 })
obs = path2.toPoints(geometry)
t.notThrows(() => path2.validate(geometry))
t.deepEqual(obs.length, 6)
t.true(comparePoints(obs, exp))
// test makeTangent
exp = [
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[-0.31005066355011174, 0.9507200355689026],
[-0.6240966815770753, 0.781347126470996],
[-0.858687650595474, 0.5124992865505523],
[-0.9839573055048071, 0.1784040945262181],
[-0.9839573055048071, -0.1784040945262183],
[-0.8586876505954741, -0.5124992865505521],
[-0.6240966815770755, -0.7813471264709959],
[-0.3100506635501122, -0.9507200355689025],
[ ],
[ ],
[ ],
[ ],
[ ]
]
geometry = arc({ makeTangent: true, segments: 16 })
obs = path2.toPoints(geometry)
t.notThrows(() => path2.validate(geometry))
t.deepEqual(obs.length, 19)
t.true(comparePoints(obs, exp))
// test segments
exp = [
[ ],
[ ],
[ ],
[-0.4999999999999998, 0.8660254037844387],
[-0.9396926207859083, 0.3420201433256689],
[-0.9396926207859084, -0.34202014332566866],
[-0.5000000000000004, -0.8660254037844385],
[ ],
[ ]
]
geometry = arc({ segments: 8 })
obs = path2.toPoints(geometry)
t.notThrows(() => path2.validate(geometry))
t.deepEqual(obs.length, 9)
t.true(comparePoints(obs, exp))
})
test('arc (rotations)', (t) => {
let exp = [
[ ],
[-0.30901699437494734, 0.9510565162951536],
[-0.587785252292473, 0.8090169943749475],
[-0.8090169943749473, 0.5877852522924732],
[-0.9510565162951535, 0.3090169943749475],
[-1, 1.2246467991473532e-16]
]
let geometry = arc({ startAngle: TAU / 4, endAngle: TAU / 2, segments: 16 })
let obs = path2.toPoints(geometry)
t.notThrows(() => path2.validate(geometry))
t.deepEqual(obs.length, 6)
t.true(comparePoints(obs, exp))
exp = [
[-1, 1.2246467991473532e-16],
[-0.9396926207859084, -0.34202014332566866],
[-0.7660444431189781, -0.6427876096865393],
[-0.5000000000000004, -0.8660254037844385],
[-0.17364817766693033, -0.984807753012208],
[ ],
[ ],
[ ],
[ ],
[ ]
]
geometry = arc({ startAngle: TAU / 2, endAngle: TAU, segments: 16 })
obs = path2.toPoints(geometry)
t.notThrows(() => path2.validate(geometry))
t.deepEqual(obs.length, 10)
t.true(comparePoints(obs, exp))
exp = [
[-1.8369701987210297e-16, -1],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ],
[ ]
]
geometry = arc({ startAngle: TAU * 0.75, endAngle: TAU / 4, segments: 16 })
obs = path2.toPoints(geometry)
t.notThrows(() => path2.validate(geometry))
t.deepEqual(obs.length, 10)
t.true(comparePoints(obs, exp))
exp = [[-1.8369701987210297e-16, -1]]
geometry = arc({ startAngle: TAU * 0.75, endAngle: 270.000000005 * 0.017453292519943295, segments: 16 })
obs = path2.toPoints(geometry)
t.notThrows(() => path2.validate(geometry))
t.deepEqual(obs.length, 1)
t.true(comparePoints(obs, exp))
})