c = new Circle(createVector(width*0.5,height*0.5),100);
cnode.position = c.center;
triangle(a.position.x,a.position.y, c.center.x,c.center.y , p.position.x,p.position.y)
triangle(a.position.x,a.position.y, c.center.x,c.center.y , q.position.x,q.position.y)
line(c.center.x,c.center.y,p.position.x,p.position.y);
line(c.center.x,c.center.y,q.position.x,q.position.y);
function mousePressed() {
function mouseDragged() {
p.position = createVector(x,y);
q.position = c.invert(p.position);
if(p.position.dist(c.center) > c.r) {
phi = p5.Vector.sub(p.position,c.center).heading();
d = c.center.dist(q.position);
phi = p5.Vector.sub(q.position,c.center).heading();
d = c.center.dist(p.position);
let v = p5.Vector.fromAngle(phi + alpha);
a.position = p5.Vector.add(c.center,v);
this.position = createVector(0,0);
ellipse(this.position.x,this.position.y,this.weight,this.weight);
text(this.name, this.position.x - 10,this.position.y - 10);
function Circle(center,r) {
this.containsPoint = function(p){
return this.center.dist(p) < this.r;
this.invert = function(p){
let op = this.center.dist(p);
let oq = this.r*this.r/op;
let dq = p5.Vector.sub(p,this.center).normalize().mult(oq);
let newP = p5.Vector.add(this.center,dq)
ellipse(this.center.x,this.center.y, 2*this.r,2*this.r)