gpt4 book ai didi

python - 寻找两个圆的交点

转载 作者:行者123 更新时间:2023-12-03 18:37:15 31 4
gpt4 key购买 nike

我试图在 Python(使用 Matplotlib)中找到两个圆之间的交点,但无法取回任何值。

我这样做是通过为每个单独的圆创建 X 和 Y 的列表(Matplotlib 在绘制圆时将第一个参数作为 X 值,第二个作为 Y 值),然后相应地与列表相交(例如,circle1 x 值)与 circle2 x 值)。

import numpy
import math
import matplotlib.pyplot as plt
import random

def origin_circle():
global x_points
global y_points
global r
global n
r=1
n=2**16
x_points=[(r*math.cos(t)) for t in numpy.linspace(0, 2*numpy.pi*r, n+1)]
y_points=[(r*math.sin(t)) for t in numpy.linspace(0, 2*numpy.pi*r, n+1)]

def new_circle(x_offset, y_offset):
global x_points1
global y_points1
x_points1=[x_offset+(r*math.cos(t)) for t in numpy.linspace(0, 2*numpy.pi*r, n+1)]
y_points1=[y_offset+(r*math.sin(t)) for t in numpy.linspace(0, 2*numpy.pi*r, n+1)]

origin_circle()
new_center= random.randint(0, len(x_points))
x_offset = x_points[new_center]
y_offset = y_points[new_center]
new_circle(x_offset, y_offset)
print(set(x_points1).intersection(set(x_points)))
print(set(y_points1).intersection(set(y_points)))

我希望取回值,但返回的集合是空的。

最佳答案

求解两个圆的交点的正确方法是代数法。由于坐标系(实数)的无限精度,您不能使用点(x,y 坐标)来做到这一点。
如果两个圆在两点相交,那么有直接的方法来计算这两个交点。代数详解hereIntersection of two circles .
我们还可以消除两个圆不相交的情况,如下所示

  • 如果两个圆原点之间的距离> 两个圆的半径之和,则表示圆是分开的,因此不相交。
  • 如果两个圆原点之间的距离<两个圆半径的绝对差,则表示一个圆包含在另一个圆中,因此不相交。

  • 返回两个圆的两个交点的代码。 每个 cricle 由其中心 (x,y) 和半径 (r) 描述
    def get_intersections(x0, y0, r0, x1, y1, r1):
    # circle 1: (x0, y0), radius r0
    # circle 2: (x1, y1), radius r1

    d=math.sqrt((x1-x0)**2 + (y1-y0)**2)

    # non intersecting
    if d > r0 + r1 :
    return None
    # One circle within other
    if d < abs(r0-r1):
    return None
    # coincident circles
    if d == 0 and r0 == r1:
    return None
    else:
    a=(r0**2-r1**2+d**2)/(2*d)
    h=math.sqrt(r0**2-a**2)
    x2=x0+a*(x1-x0)/d
    y2=y0+a*(y1-y0)/d
    x3=x2+h*(y1-y0)/d
    y3=y2-h*(x1-x0)/d

    x4=x2-h*(y1-y0)/d
    y4=y2+h*(x1-x0)/d

    return (x3, y3, x4, y4)
    让我们通过绘制 来测试它(视觉上)
    # intersection circles
    x0, y0 = 0, 0
    r0 = 5
    x1, y1 = 2, 2
    r1 = 5

    # intersecting with (x1, y1) but not with (x0, y0)
    x2, y2 = -1,0
    r2 = 2.5

    circle1 = plt.Circle((x0, y0), r0, color='b', fill=False)
    circle2 = plt.Circle((x1, y1), r1, color='b', fill=False)
    circle3 = plt.Circle((x2, y2), r2, color='b', fill=False)

    fig, ax = plt.subplots()
    ax.set_xlim((-10, 10))
    ax.set_ylim((-10, 10))
    ax.add_artist(circle1)
    ax.add_artist(circle2)
    ax.add_artist(circle3)

    intersections = get_intersections(x0, y0, r0, x1, y1, r1)
    if intersections is not None:
    i_x3, i_y3, i_x4, i_y4 = intersections
    plt.plot([i_x3, i_x4], [i_y3, i_y4], '.', color='r')

    intersections = get_intersections(x0, y0, r0, x2, y2, r2)
    if intersections is not None:
    i_x3, i_y3, i_x4, i_y4 = intersections
    plt.plot([i_x3, i_x4], [i_y3, i_y4], '.', color='r')

    intersections = get_intersections(x1, y1, r1, x2, y2, r2)
    if intersections is not None:
    i_x3, i_y3, i_x4, i_y4 = intersections
    plt.plot([i_x3, i_x4], [i_y3, i_y4], '.', color='r')

    plt.gca().set_aspect('equal', adjustable='box')
    输出:
    enter image description here

    关于python - 寻找两个圆的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55816902/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com