给出3分和一个情节圆

Mon*_*ois 4 python plot matplotlib

我想给python提供点[0,1],[1,0]和[0,-1]并绘制经过它们的圆圈.存在一个python模块,使这个?我尝试过使用matplotlib:

import matplotlib.pyplot as plt
plt.plot([0,1,0],[1,0,-1])
plt.show()
Run Code Online (Sandbox Code Playgroud)

但只给了我两行.

Die*_*rDP 11

此代码还可以让您轻松检查 3 个点是否形成一条线。

def define_circle(p1, p2, p3):
    """
    Returns the center and radius of the circle passing the given 3 points.
    In case the 3 points form a line, returns (None, infinity).
    """
    temp = p2[0] * p2[0] + p2[1] * p2[1]
    bc = (p1[0] * p1[0] + p1[1] * p1[1] - temp) / 2
    cd = (temp - p3[0] * p3[0] - p3[1] * p3[1]) / 2
    det = (p1[0] - p2[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p2[1])

    if abs(det) < 1.0e-6:
        return (None, np.inf)

    # Center of circle
    cx = (bc*(p2[1] - p3[1]) - cd*(p1[1] - p2[1])) / det
    cy = ((p1[0] - p2[0]) * cd - (p2[0] - p3[0]) * bc) / det

    radius = np.sqrt((cx - p1[0])**2 + (cy - p1[1])**2)
    return ((cx, cy), radius)
Run Code Online (Sandbox Code Playgroud)

并解决原来的问题:

center, radius = define_circle((0,1), (1,0), (0,-1))
if center is not None:
    plt.figure(figsize=(4, 4))
    circle = plt.Circle(center, radius)
    plt.gcf().gca().add_artist(circle)
Run Code Online (Sandbox Code Playgroud)

(从这里调整)


Ale*_*lli 9

有一个"代码高尔夫"问题与此完全匹配(除了请求圆的等式,而不是绘制它) - 请参阅https://codegolf.stackexchange.com/questions/2289/circle-through-three-points.将第一个和最短的(Python)解决方案解析为更具可读性,更少hacky的形式以匹配您的确切规范 - 但保留使用复数进行简单计算的核心理念:

x, y, z = 0+1j, 1+0j, 0-1j
w = z-x
w /= y-x
c = (x-y)*(w-abs(w)**2)/2j/w.imag-x
print '(x%+.3f)^2+(y%+.3f)^2 = %.3f^2' % (c.real, c.imag, abs(c+x))
Run Code Online (Sandbox Code Playgroud)

好吧,这仍然"打印方程"而不是"绘制圆圈",但是,我们正在接近:-).要实际绘制圆形matplotlib,请参见例如绘制带有pyplot的圆 - 在上面的解决方案中,c是圆的(否定的)中心(作为复数,因此使用.real和.imag作为x/y坐标)和abs(c+x)半径(实数,abs使它成为).

  • 我猜想看到您清楚地尊重ÉvaristeGalois的昵称,就使我的潜意识朝着这个数学上优雅的想法:-)。回想起一个在我1/3岁时去世的家伙,只留下了60页的笔记,它们彻底改变了**两个**的数学关键分支,使我保持谦卑的态度(再加上,我是法语的1/8,所以它也有助于保持我应该为此感到自豪:-)。 (3认同)