awv3
Version:
⚡ AWV3 embedded CAD
48 lines (44 loc) • 2.32 kB
JavaScript
import * as THREE from 'three';
import BaseGraphics from './base';
function closestAngle(value, to) {
const pi2 = 2*Math.PI;
while (Math.abs(value - pi2 - to) < Math.abs(value - to))
value -= pi2;
while (Math.abs(value + pi2 - to) < Math.abs(value - to))
value += pi2;
return value;
}
export default class Angular extends BaseGraphics {
constructor(...args) {
super(...args, 2, 2, 2);
}
updateFromState(state, ...args) {
//take local coordinates of four points from CC data members
let [start, end, dim, corner] = ['startPt', 'endPt', 'dimPt', 'cornerPt'].map(x => new THREE.Vector3().fromArray(state.members[x].value));
let extendCrn = state.members.extendToCorner.value;
//calculate radius & polar angles of the arc
const radius = corner.distanceTo(dim);
let startAng = Math.atan2(start.y - corner.y, start.x - corner.x), endAng = Math.atan2(end.y - corner.y, end.x - corner.x);
//arc always goes from "start" to "end" according to "ccw" flag
if (!state.members.ccw.value)
[start, end, startAng, endAng] = [end, start, endAng, startAng];
if (endAng < startAng)
endAng += 2 * Math.PI;
//check if dim-pos is outside of sector
let midAng = (startAng + endAng) * 0.5;
let dimAng = Math.atan2(dim.y - corner.y, dim.x - corner.x);
dimAng = closestAngle(dimAng, midAng);
const outside = (dimAng < startAng || dimAng > endAng);
//set geometry for dimension
const [startFoot, endFoot] = [start, end].map(x => x.clone().sub(corner).setLength(radius).add(corner));
const startTang = new THREE.Vector3( Math.sin(startAng), -Math.cos(startAng), 0).multiplyScalar(outside ? -1 : 1);
const endTang = new THREE.Vector3(-Math.sin( endAng), Math.cos( endAng), 0).multiplyScalar(outside ? -1 : 1);
this.updateLine(0, (extendCrn ? corner : start), startFoot);
this.updateLine(1, endFoot, (extendCrn ? corner : end));
this.updateArc(0, corner, radius, startAng, dimAng);
this.updateArc(1, corner, radius, endAng, dimAng);
this.updateArrow(0, startFoot, startTang);
this.updateArrow(1, endFoot, endTang);
super.updateFromState(state, ...args);
}
}