c = new Circle(createVector(width*0.5,height*0.5),200);
p.position = p5.Vector.add(c.center, createVector(100,100));
q.position = p5.Vector.add(c.center, createVector(130,10));
line(P.position.x,P.position.y,p.position.x,p.position.y);
line(Q.position.x,Q.position.y,q.position.x,q.position.y);
line(v1.x,v1.y,u1.x,u1.y);
line(v2.x,v2.y,u2.x,u2.y);
ellipse(a.position.x,a.position.y,2*r,2*r);
arc(a.position.x,a.position.y,2*r,2*r,theta1,theta2);
function mousePressed() {
let mouse = createVector(mouseX,mouseY);
if(c.containsPoint(mouse)){
function mouseDragged() {
let mouse = createVector(mouseX,mouseY);
if(c.containsPoint(mouse)){
if(!( x === undefined )){
if( x.dist(p.position)< x.dist(q.position)){
P.position = c.invert(p.position);
Q.position = c.invert(q.position);
m.position = p5.Vector.lerp(p.position,P.position,0.5);
n.position = p5.Vector.lerp(q.position,Q.position,0.5);
let pP = p5.Vector.sub(p.position,P.position);
let qQ = p5.Vector.sub(q.position,Q.position);
u1 = linePoint(m.position,pP,l);
u2 = linePoint(n.position,qQ,l);
v1 = linePoint(m.position,pP,-l);
v2 = linePoint(n.position,qQ,-l);
a.position = intersectLines(m.position,pP,n.position,qQ);
r = a.position.dist(p.position);
thetaP = (p5.Vector.sub(p.position,a.position).heading() + TWO_PI)%TWO_PI;
thetaQ = (p5.Vector.sub(q.position,a.position).heading() + TWO_PI)%TWO_PI;
console.log(thetaP + "," + thetaQ);
console.log(thetaQ - thetaP);
if((theta2 - theta1)>PI) {
this.position = createVector(0,0);
ellipse(this.position.x,this.position.y,this.weight,this.weight);
text(this.name, this.position.x - this.weight,this.position.y - this.weight);
function linePoint(p,n,s){
return p5.Vector.add(p ,p5.Vector.mult(n,s));
function intersectLines(p1,n1,p2,n2){
let detA = det( n1.x, -n2.x, n1.y, -n2.y );
let detA0 = det( p2.x - p1.x , -n2.x, p2.y - p1.y ,-n2.y );
return linePoint(p1,n1,s);
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)