如何在 python 中计算三个圆的交点及其不同的 riao

问题描述 投票:0回答:0

在报告我的问题之前,我想给你一些背景信息,我在一所提供计算机科学专业课程的高中学习,为了让我获得这门课程的文凭,我必须完成课程总结工作.

我的课程完成工作包括创建一个大声雷达,旨在监测可能对城市特定区域(例如医院)有害的噪音产生。该检查将专门针对机动车辆产生的噪音。

为了开展这个项目,我与我的同事和顾问一起开发了一个 arduino 原型,它具有三个麦克风和一个摄像头。对于我的问题,只需要麦克风的信息。

基本上,我的程序必须根据麦克风提供的数据进行三角测量,以便我们能够识别违规车辆。这就是计算三个圆的交点的程序的用武之地。

每个圆圈的位置将由麦克风的位置给出,半径将由每个麦克风识别有害噪音所花费的时间差给出。收到这些数据后,通过简单的转换,将以秒为单位的值转换为米。

这个项目最大的问题是第一个识别噪音的麦克风会有0秒的时间差,因为这将是其他麦克风的参考。

为了解决这个问题,由rebrid开发并由Jacques Gaudin改进的函数(在python中如何获得三个或多个圆的交点有无错误)将在ans.success变量等于时在while循环中运行为 False,而循环会将每个圆周的半径增加 0.01m,以便在某个时候找到问题的有效解决方案。 话虽如此,我的代码看起来像这样:

import matplotlib.pyplot as plt
from scipy.optimize import least_squares

def intersectionPoint(p1,p2,p3):

    x1, y1, dist_1 = (p1[0], p1[1], p1[2])
    x2, y2, dist_2 = (p2[0], p2[1], p2[2])
    x3, y3, dist_3 = (p3[0], p3[1], p3[2])

    def eq(g):
        x, y = g

        return (
            (x - x1)**2 + (y - y1)**2 - dist_1**2,
            (x - x2)**2 + (y - y2)**2 - dist_2**2,
            (x - x3)**2 + (y - y3)**2 - dist_3**2)

    guess = (x1, y1 + dist_1)

    ans = least_squares(eq, guess, ftol=None, xtol=None)

    return ans

def pltC():
    figure, ax = plt.subplots()
    C1 = plt.Circle((ca[0], ca[1]), r1, fill = False)
    C2 = plt.Circle((cb[0], cb[1]), r2, fill = False)
    C3 = plt.Circle((cc[0], cc[1]), r3, fill = False)
    Ci = plt.Circle((ans.x[0], ans.x[1]), 0.1)

    ax.set_aspect(1)
    ax.set_xlim([0, 10])
    ax.set_ylim([0, 10])

    ax.add_artist(C1)
    ax.add_artist(C2)
    ax.add_artist(C3)
    ax.add_artist(Ci)

    plt.title("Exemplo Intersecção de Circluos com o Calculo")
    plt.show()

r1 = 2
r2 = 0
r3 = 4

ca = (0, 0)
cb = (0, 6)
cc = (8, 0)

ans = intersectionPoint((ca[0], ca[1], r1), (cb[0], cb[1], r2), (cc[0], cc[1], r3))

while ans.success == False:
    r1 = round(r1 + 0.01, 2)
    r2 = round(r2 + 0.01, 2)
    r3 = round(r3 + 0.01, 2)

    ca = (0, 0)
    cb = (0, 6)
    cc = (8, 0)
    ans = intersectionPoint((ca[0], ca[1], r1), (cb[0], cb[1], r2), (cc[0], cc[1], r3))

pltC()
print(ans.success)
print(ans.x)
print(r1, r2, r3)

但是我遇到了问题,因为代码没有返回正确的值。可以在代码中看到第一个圆的半径 (r1) 的值为 2m,r2 的值为 0m,r3 的值为 4m。

当我们开始开发这段代码时,顾问和我进行了数学计算,并意识到根据这些信息的正确结果是位置 x = 3 和 y = 4 的点,其中 r1 = 5,r2 = 3 和 r3 = 7.

但由于某种原因,程序返回给我们一个坐标为 x = 2.50377477 和 y = 3.74999764 的点,其中 r1 = 4.45,r2 = 2.45 和 r3 = 6.45。在这个程序中我也使用了matplotlib库来显示一个图形,从这个图形的分析可以看出圆圈并不相交。 enter image description here

我试图通过改变猜测变量的参数来解决这个问题,但这似乎没有帮助

python intersection least-squares scipy-optimize
© www.soinside.com 2019 - 2024. All rights reserved.