Skip to main content

Circular Pattern

Here is an example of a circular pattern, separated into two functions: one for the positions and the other for the pattern sketch.

export function generateCircularPatternPositionStructs(radius: number, nrCopies: number, {
startAngle = 0, endAngle = 2 * Math.PI, referenceAngle = 0, addLast = false } = {}) {
const positionStructs: { position: SKYMATH.Vector2D, angle: number }[] = []
const NC = addLast ? nrCopies + 1 : nrCopies
const angleRange = endAngle - startAngle

for (let i = 0; i < NC; i++) {
const angle = angleRange * i / nrCopies + startAngle + referenceAngle
const position = new SKYMATH.Vector2D(radius * Math.cos(angle), radius * Math.sin(angle))
positionStructs.push({ position, angle }) // the angle is pushed here so the sketch can be rotated accordingly later
}

return positionStructs
}

export function generateCircularPatternSketch(sketchToUseInPattern: SKYCAD.Sketch, radius: number, nrCopies: number, {
startAngle = 0, endAngle = 2 * Math.PI, referenceAngle = 0, addLast = false } = {}) {
const positionStructs = generateCircularPatternPositionStructs(radius, nrCopies, { startAngle, endAngle, referenceAngle, addLast })
const circularPatternSketch = new SKYCAD.Sketch()

positionStructs.forEach(struct => {
const { position, angle } = struct
const patternSketch = sketchToUseInPattern.clone()
patternSketch.scale(radius / 30) // scale sketch according to radius
patternSketch.rotate(angle) // point inwards
patternSketch.translate(position.x, position.y)
circularPatternSketch.mergeSketch(patternSketch)
})

return circularPatternSketch
}