UNPKG

awv3

Version:
48 lines (44 loc) 2.32 kB
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); } }