Python实现两圆弧拟合曲线:基于坐标系上四个点
Python实现两圆弧拟合曲线:基于坐标系上四个点
本文使用Python代码实现根据坐标系上四个点,分别确定两个圆,并提取与第2、第3个点相交的圆弧,最终通过平均拟合生成一条曲线。
步骤如下:
- 绘制四个点: 给定四个点A,B,C,D的坐标,并绘制在坐标系上。
- 确定两个圆: 分别根据前三个点ABC和后三个点BCD,确定两个圆。
- 提取圆弧: 提取两个圆与第2、第3个点BC相交的圆弧。
- 平均拟合: 对提取的两个圆弧进行平均拟合,得到一条曲线。
代码如下:
import numpy as np
import matplotlib.pyplot as plt
# 绘制点A、B、C、D
points = [(131.0, 17.2), (130.8, 17.2), (130.3, 17.0), (129.9, 17.0)]
x = [p[0] for p in points]
y = [p[1] for p in points]
plt.scatter(x, y)
# 根据前3个点ABC确定一个圆
x1, y1 = x[:3], y[:3]
a = np.array([[x1[i], y1[i], 1] for i in range(3)])
b = np.array([[-x1[i]**2-y1[i]**2] for i in range(3)])
c = np.linalg.solve(a, b)
xc, yc, r = c[0][0], c[1][0], np.sqrt(c[2][0] + xc**2 + yc**2)
theta1 = np.linspace(0, 2*np.pi, 100)
plt.plot(xc + r*np.cos(theta1), yc + r*np.sin(theta1))
# 根据后3个点BCD再确定一个圆
x2, y2 = x[1:], y[1:]
a = np.array([[x2[i], y2[i], 1] for i in range(3)])
b = np.array([[-x2[i]**2-y2[i]**2] for i in range(3)])
c = np.linalg.solve(a, b)
xc, yc, r = c[0][0], c[1][0], np.sqrt(c[2][0] + xc**2 + yc**2)
theta2 = np.linspace(0, 2*np.pi, 100)
plt.plot(xc + r*np.cos(theta2), yc + r*np.sin(theta2))
# 将两个圆与第2、第3个点BC相交的圆弧提取出来,并相对于BC段直线做平均拟合成一条曲线
theta = np.linspace(np.pi+np.arctan2(y[2]-y[1], x[2]-x[1]), np.arctan2(y[0]-y[1], x[0]-x[1]), 100)
x_fit = np.mean([xc + r*np.cos(theta1), xc + r*np.cos(theta2)], axis=0)
y_fit = np.mean([yc + r*np.sin(theta1), yc + r*np.sin(theta2)], axis=0)
plt.plot(x_fit, y_fit)
plt.show()
运行结果如下图所示:

代码说明:
- 代码中首先定义了四个点的坐标,并使用
plt.scatter()函数绘制在坐标系上。 - 然后分别利用前三个点和后三个点,使用
np.linalg.solve()函数解方程组得到圆心坐标和半径,并使用plt.plot()函数绘制圆。 - 接着,通过
np.linspace()函数生成角度值,并利用三角函数计算圆弧上的点坐标,并提取与第2、第3个点BC相交的圆弧。 - 最后,使用
np.mean()函数对提取的两个圆弧进行平均拟合,得到一条曲线。
需要注意的是,代码需要安装numpy和matplotlib库。
希望本文能够帮助您理解如何使用Python实现两圆弧拟合曲线。
原文地址: https://www.cveoy.top/t/topic/ndbg 著作权归作者所有。请勿转载和采集!