mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-09 18:02:50 +01:00
76 lines
No EOL
1.5 KiB
JavaScript
76 lines
No EOL
1.5 KiB
JavaScript
import {SketchObject} from './sketch-object'
|
|
import {Param} from "./param";
|
|
import {EndPoint} from "./point";
|
|
import {distance} from "math/distance";
|
|
import Vector from "math/vector";
|
|
import {makeAngle0_360} from "math/commons";
|
|
|
|
export const MIN_RADIUS = 100;
|
|
|
|
export class Circle extends SketchObject {
|
|
|
|
constructor(cx, cy, r = 0, id) {
|
|
super(id);
|
|
this.c = new EndPoint(cx, cy, this.id + ':C');
|
|
this.c.parent = this;
|
|
this.children.push(this.c);
|
|
this.r = new Param(r, 'R');
|
|
this.r.enforceVisualLimit = true;
|
|
}
|
|
|
|
visitParams(callback) {
|
|
this.c.visitParams(callback);
|
|
callback(this.r);
|
|
}
|
|
|
|
getReferencePoint() {
|
|
return this.c;
|
|
}
|
|
|
|
translateImpl(dx, dy) {
|
|
this.c.translate(dx, dy);
|
|
}
|
|
|
|
drawImpl(ctx, scale) {
|
|
ctx.beginPath();
|
|
let r = this.r.get();
|
|
if (r > 0) {
|
|
ctx.arc(this.c.x, this.c.y, r, 0, 2 * Math.PI);
|
|
}
|
|
ctx.stroke();
|
|
}
|
|
|
|
normalDistance(aim) {
|
|
return Math.abs(distance(aim.x, aim.y, this.c.x, this.c.y) - this.r.get());
|
|
}
|
|
|
|
get labelCenter() {
|
|
return new Vector(this.c.x, this.c.y, 0);
|
|
}
|
|
|
|
copy() {
|
|
const circle = new Circle(this.c.copy());
|
|
circle.r.set(this.r.get());
|
|
return circle;
|
|
}
|
|
|
|
write() {
|
|
return {
|
|
c: this.c.write(),
|
|
r: this.r.get()
|
|
}
|
|
}
|
|
|
|
static read(id, data) {
|
|
return new Circle(
|
|
data.c.x,
|
|
data.c.y,
|
|
data.r,
|
|
id
|
|
)
|
|
}
|
|
|
|
}
|
|
|
|
Circle.prototype._class = 'TCAD.TWO.Circle';
|
|
Circle.prototype.TYPE = 'Circle'; |