Last active
April 15, 2025 13:28
-
-
Save jupdike/bfe5eb23d1c395d8a0a1a4ddd94882ac to your computer and use it in GitHub Desktop.
Find the intersections (two points) of two circles, if they intersect at all
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// based on the math here: | |
// http://math.stackexchange.com/a/1367732 | |
// x1,y1 is the center of the first circle, with radius r1 | |
// x2,y2 is the center of the second ricle, with radius r2 | |
function intersectTwoCircles(x1,y1,r1, x2,y2,r2) { | |
var centerdx = x1 - x2; | |
var centerdy = y1 - y2; | |
var R = Math.sqrt(centerdx * centerdx + centerdy * centerdy); | |
if (!(Math.abs(r1 - r2) <= R && R <= r1 + r2)) { // no intersection | |
return []; // empty list of results | |
} | |
// intersection(s) should exist | |
var R2 = R*R; | |
var R4 = R2*R2; | |
var a = (r1*r1 - r2*r2) / (2 * R2); | |
var r2r2 = (r1*r1 - r2*r2); | |
var c = Math.sqrt(2 * (r1*r1 + r2*r2) / R2 - (r2r2 * r2r2) / R4 - 1); | |
var fx = (x1+x2) / 2 + a * (x2 - x1); | |
var gx = c * (y2 - y1) / 2; | |
var ix1 = fx + gx; | |
var ix2 = fx - gx; | |
var fy = (y1+y2) / 2 + a * (y2 - y1); | |
var gy = c * (x1 - x2) / 2; | |
var iy1 = fy + gy; | |
var iy2 = fy - gy; | |
// note if gy == 0 and gx == 0 then the circles are tangent and there is only one solution | |
// but that one solution will just be duplicated as the code is currently written | |
return [[ix1, iy1], [ix2, iy2]]; | |
} |
javascript, vercion basada en godot con vector
var Vector2 = function(x, y) {
this.x = x || 0;
this.y = y || 0;
}
function puntoMedio(v1,v2){
return new Vector2(v1.x+v2.x/2,v1.y+v2.y/2)
}
function V2Rest(v1,v2){
return new Vector2(v1.x-v2.x,v1.y-v2.y);
}
function V2By(v1,v2){
return new Vector2(v1.x*v2.x,v1.y*v2.y);
}
function V2Plus(v1,v2){
return new Vector2(v1.x+v2.x,v1.y+v2.y);
}
function V2ByOne(v1,oneNumber){
return new Vector2(v1.x*oneNumber,v1.y*oneNumber);
}
function V2DivOne(v1,oneNumber){
oneNumber = parseFloat(oneNumber);
return new Vector2(v1.x/oneNumber,v1.y/oneNumber);
}
function V2PlusOne(v1,oneNumber){
return new Vector2(v1.x+oneNumber,v1.y+oneNumber);
}
function distancia2D(Vector_a,Vector_b){
if (Vector_a.x-Vector_b.x==0){
return Math.abs(Vector_a.y-Vector_b.y) ;
}
if (Vector_a.y-Vector_b.y==0){
return Math.abs(Vector_a.x-Vector_b.x) ;
}
return teoremaPitagoras_C(Math.abs(Vector_a.x-Vector_b.x),(Vector_a.y-Vector_b.y));
}
function teoremaPitagoras_C(a,b){
return Math.sqrt (Math.pow(a,2.00)+Math.pow(b,2.00));
}
function orthogonal(vector_2){
return new Vector2(vector_2.y,vector_2.x*-1);
}
function circle_intersect_cirle(Vector_a,r1,Vector_b,r2){
var d=distancia2D(Vector_a,Vector_b);
if (d==0){
return [new Vector2(0.00,0.00),new Vector2(0.00,0.00)];
}
var ab = V2Rest(Vector_b,Vector_a);
var r1n2=Math.pow((r1/d),2);
var r2n2=Math.pow((r2/d),2);
var rx=(r1n2-r2n2+1)/2.0;
var c=V2Plus(V2ByOne(ab,rx),Vector_a);
var h2=r1n2-Math.pow(rx,2);
if (h2<0){
return [new Vector2(0.00,0.00),new Vector2(0.00,0.00)];
}
var h=Math.sqrt(h2)*d;
var perp=V2ByOne(V2DivOne(orthogonal(ab),d),h);
return [new Vector2(V2Plus(perp,c)),new Vector2(V2Plus(V2ByOne(perp,-1),c))];
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Python visual
import math
import matplotlib.pyplot as plt
def intersect_two_circles(x1, y1, r1, x2, y2, r2):
centerdx = x1 - x2
centerdy = y1 - y2
R = math.sqrt(centerdx2 + centerdy2)
Contoh posisi dan radius lingkaran
x1, y1, r1 = 0, 0, 5
x2, y2, r2 = 4, 0, 3
Hitung titik potong
intersection_points = intersect_two_circles(x1, y1, r1, x2, y2, r2)
Visualisasi
fig, ax = plt.subplots()
circle1 = plt.Circle((x1, y1), r1, color='blue', fill=False)
circle2 = plt.Circle((x2, y2), r2, color='red', fill=False)
ax.add_patch(circle1)
ax.add_patch(circle2)
Plot titik potong
for (ix, iy) in intersection_points:
plt.plot(ix, iy, 'go', label=f'({ix:.2f}, {iy:.2f})')
Konfigurasi plot
plt.xlim(-10, 10)
plt.ylim(-10, 10)
plt.axhline(0, color='grey', linestyle='--')
plt.axvline(0, color='grey', linestyle='--')
plt.legend()
plt.gca().set_aspect('equal', adjustable='box')
plt.title('Intersection of Two Circles')
plt.show()