6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

sympyで円と円の交点。計算公式をGemini先生へ。

6
Last updated at Posted at 2017-02-01

・ソースコードの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つの球の交点計算

6
3
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?