function calculateSegments(x, y, radius, dist, angle, shift=0) {
let segments = [];
for (let step = shift - Math.floor((radius + shift) / dist) * dist; step < radius; step += dist) {
let polar = Math.acos(step / radius);
let segment = [
x + Math.cos(angle + polar) * radius,
y + Math.sin(angle + polar) * radius,
x + Math.cos(angle - polar) * radius,
y + Math.sin(angle - polar) * radius
];
segments.push(segment);
}
return segments;
}
// I/O management:
let [inpRadius, inpDistance, inpAngle, inpShift] = document.querySelectorAll("input");
document.addEventListener("input", refresh);
let canvas = document.querySelector("canvas");
let ctx = canvas.getContext("2d");
let cx = canvas.width >> 1;
let cy = canvas.height >> 1;
function drawCircle(x, y, r) {
ctx.beginPath();
ctx.arc(x, y, r, 0, 2 * Math.PI, false);
ctx.stroke();
}
function drawSegment([x1, y1, x2, y2]) {
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.stroke();
}
function clear() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
function refresh() {
// Get current input
let radius = Math.max(1, +inpRadius.value); // sanitise input
let distance = Math.max(1, +inpDistance.value);
let angle = +inpAngle.value * Math.PI / 180; // convert to radians
let shift = +inpShift.value;
// Perform the calculation
let segments = calculateSegments(cx, cy, radius, distance, angle, shift);
// Display result
clear();
drawCircle(cx, cy, radius);
segments.forEach(drawSegment);
}
refresh();
input { width: 5em }
canvas { background: #eee }
<div style="float: left">
Radius of circle: <input type="number" id="radius" value="50" min="1"><br>
Distance between lines: <input type="number" id="distance" value="14" min="1"><br>
Angle of lines (degrees): <input type="number" id="angle" value="120"><br>
Shift: <input type="number" id="shift" value="0"><br>
</div>
<canvas width="180" height="180"></canvas>