Parse
File Parse tethers.js
This tree is parsed live from the source file.
Classes
-
{{ item.name }}
- {{ key }}
Not Classes
{{ getTree() }}
Comments
{{ getTreeComments() }}
Source
/*
files:
./windings.js
*/
class PointTethers {
/* Given a parent, bind a range of points by distance position.
Call _step_ when visual updates are required.
this.point = new Point(200, 200, 100)
let cp = this.point.tethers.add({ x: 100, y: 50})
Step:
this.point.tethers.step()
Render:
this.point.pen.indicator(ctx, {color: '#336600'})
this.point.tethers.points.pen.fill(ctx, '#33DDAA')
*/
constructor(point) {
this.point = point
this.points = new PointList
this.keepRotate = true
this.windings = new PointWinding(this.point)
}
add(pointData) {
let cp = this.generate.apply(this, arguments)
this.push(cp)
return cp
}
onTipDragStart(ev) {
let p = this.point
p.onTipDragStart && p.onTipDragStart.apply(p)
}
onTipDragMove(ev) {
let p = this.point
p.onTipDragMove && p.onTipDragMove.apply(p)
}
onTipDragEnd(ev) {
let p = this.point
p.onTipDragEnd && p.onTipDragEnd.apply(p)
}
generate(pointData) {
/* Generate, store and return a new controller point */
let _self = this;
let point = this.point
let controlPoint;
if(arguments.length == 0) {
controlPoint = point.project()
} else {
controlPoint = new Point(...Array.from(arguments))
}
controlPoint.controlPointsDistance = controlPoint.distance2D(point)
controlPoint.onDragStart = function() {
// console.log('Drag start')
this._release = true;
_self.onTipDragStart.apply(_self, arguments)
}
controlPoint.onDragMove = function() {
// console.log('Drag move')
this.controlPointsDistance = this.distance2D(point)
_self.onTipDragMove.apply(_self, arguments)
}
controlPoint.onDragEnd = function() {
// console.log('Drag end')
this.controlPointsDistance = this.distance2D(point)
this._release = false;
_self.onTipDragEnd.apply(_self, arguments)
}
controlPoint.radiansDiff = calculateAngleDiffWrapped(point, controlPoint)
return controlPoint
}
push(controlPoint) {
this.points.push(controlPoint)
}
step(rotation=this.keepRotate){
/* Unless the user is in control,
Move any control point to the correct location,*/
this.points.forEach((p,i)=>{
let radiansDiff = calculateAngleDiffWrapped(this.point, p)
if(p._release == true) { return }
p.xy = this.point.add(p.controlPointsDistance).xy
})
}
}
Polypoint.head.deferredProp('Point', function tethers() {
return new PointTethers(this)
}
)
copy