・ソースコードの2つ目がおすすめです。
中心を移動すればいっしょです。ケド。
(ついでに)募集中
Sympy で円弧と円弧の交点計算。symbolで。一式のユーザー定義関数で。
計算結果も。
・イイ回答をGemini先生より得られていません。
Gemini先生へ
Sympyで円と円の交点
symbolのままで。ソースコードと計算結果のみ出力して下さい。
# SymPyを用いた2つの円の交点座標の文字計算
from sympy import Symbol, Eq, solve
# 記号の定義
x = Symbol('x')
y = Symbol('y')
r1 = Symbol('r1', positive=True)
r2 = Symbol('r2', positive=True)
d = Symbol('d', positive=True)
# 円の方程式の設定(中心を (0,0) と (d,0) に配置)
# Circle 1: x^2 + y^2 = r1^2
# Circle 2: (x - d)^2 + y^2 = r2^2
eq1 = Eq(x**2 + y**2, r1**2)
eq2 = Eq((x - d)**2 + y**2, r2**2)
# 交点の計算(Symbolのまま解く)
solutions = solve([eq1, eq2], (x, y))
# 計算結果の出力
print(solutions)
計算結果
[
(
(d**2 + r1**2 - r2**2)/(2*d),
-sqrt(-d**4 + 2*d**2*r1**2 + 2*d**2*r2**2 - r1**4 + 2*r1**2*r2**2 - r2**4)/(2*d)
),
(
(d**2 + r1**2 - r2**2)/(2*d),
sqrt(-d**4 + 2*d**2*r1**2 + 2*d**2*r2**2 - r1**4 + 2*r1**2*r2**2 - r2**4)/(2*d)
)
]
中心を (x1,y1) と (x2,y2) にして。
# SymPyを用いた一般的な2円(中心 (x1, y1), (x2, y2))の交点座標の文字計算
from sympy import Symbol, Eq, solve
# 記号の定義
x = Symbol('x')
y = Symbol('y')
x1 = Symbol('x1')
y1 = Symbol('y1')
x2 = Symbol('x2')
y2 = Symbol('y2')
r1 = Symbol('r1', positive=True)
r2 = Symbol('r2', positive=True)
# 円の方程式の設定
# Circle 1: (x - x1)^2 + (y - y1)^2 = r1^2
# Circle 2: (x - x2)^2 + (y - y2)^2 = r2^2
eq1 = Eq((x - x1)**2 + (y - y1)**2, r1**2)
eq2 = Eq((x - x2)**2 + (y - y2)**2, r2**2)
# 交点の計算(Symbolのまま解く)
solutions = solve([eq1, eq2], (x, y))
# 計算結果の出力
print(solutions)
計算結果
[
(
(x1**3 - x1**2*x2 + x1*x2**2 - x1*y1**2 + 2*x1*y1*y2 - x1*y2**2 + x1*r1**2 - x1*r2**2 - x2**3 - x2*y1**2 + 2*x2*y1*y2 - x2*y2**2 - x2*r1**2 + x2*r2**2 - y1*sqrt(-(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 + 2*r1*r2 - r2**2)*(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 - 2*r1*r2 - r2**2)) + y2*sqrt(-(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 + 2*r1*r2 - r2**2)*(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 - 2*r1*r2 - r2**2)))/(2*(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2)),
(x1**2*y1 + x1**2*y2 - 2*x1*x2*y1 - 2*x1*x2*y2 + x1*sqrt(-(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 + 2*r1*r2 - r2**2)*(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 - 2*r1*r2 - r2**2)) + x2**2*y1 + x2**2*y2 - x2*sqrt(-(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 + 2*r1*r2 - r2**2)*(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 - 2*r1*r2 - r2**2)) + y1**3 - y1**2*y2 + y1*y2**2 + y1*r1**2 - y1*r2**2 - y2**3 - y2*r1**2 + y2*r2**2)/(2*(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2))
),
(
(x1**3 - x1**2*x2 + x1*x2**2 - x1*y1**2 + 2*x1*y1*y2 - x1*y2**2 + x1*r1**2 - x1*r2**2 - x2**3 - x2*y1**2 + 2*x2*y1*y2 - x2*y2**2 - x2*r1**2 + x2*r2**2 + y1*sqrt(-(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 + 2*r1*r2 - r2**2)*(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 - 2*r1*r2 - r2**2)) - y2*sqrt(-(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 + 2*r1*r2 - r2**2)*(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 - 2*r1*r2 - r2**2)))/(2*(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2)),
(x1**2*y1 + x1**2*y2 - 2*x1*x2*y1 - 2*x1*x2*y2 - x1*sqrt(-(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 + 2*r1*r2 - r2**2)*(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 - 2*r1*r2 - r2**2)) + x2**2*y1 + x2**2*y2 + x2*sqrt(-(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 + 2*r1*r2 - r2**2)*(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2 - r1**2 - 2*r1*r2 - r2**2)) + y1**3 - y1**2*y2 + y1*y2**2 + y1*r1**2 - y1*r2**2 - y2**3 - y2*r1**2 + y2*r2**2)/(2*(x1**2 - 2*x1*x2 + x2**2 + y1**2 - 2*y1*y2 + y2**2))
)
]
旧
#sympyで円と円の交点
import sympy.geometry as sg
center = sg.Point(0,0)
radius = 10
circle1 = sg.Circle(center, radius)
center = sg.Point(10,0)
radius = 10
circle2 = sg.Circle(center, radius)
result = sg.intersection(circle1,circle2 )
print(result)
print(len(result))
print(float(result[0].x),float(result[0].y),float(result[1].x),float(result[1].y))
#(結果)#pycharm
#[Point2D(5, 5*sqrt(3)), Point2D(5, -5*sqrt(3))]
#2
#5.0 8.660254037844387 5.0 -8.660254037844387
#
#(結果)#SymPy Live Online Shell#精度がいいかも
#http://live.sympy.org/
#[Point2D(5, 5*sqrt(3)), Point2D(5, -5*sqrt(3))]
#2
#(5.0, 8.6602540378443873, 5.0, -8.6602540378443873)
#
# (参考)#Pythonで円とか線とか線分の交点を求める+普通の値に戻す
# http://kamiwo-koete.hatenablog.jp/entry/2014/12/23/193018
参考
3次元:3つの球の交点計算