Python实现两圆弧拟合曲线:基于坐标系上四个点

本文使用Python代码实现根据坐标系上四个点,分别确定两个圆,并提取与第2、第3个点相交的圆弧,最终通过平均拟合生成一条曲线。

步骤如下:

  1. 绘制四个点: 给定四个点A,B,C,D的坐标,并绘制在坐标系上。
  2. 确定两个圆: 分别根据前三个点ABC和后三个点BCD,确定两个圆。
  3. 提取圆弧: 提取两个圆与第2、第3个点BC相交的圆弧。
  4. 平均拟合: 对提取的两个圆弧进行平均拟合,得到一条曲线。

代码如下:

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()

运行结果如下图所示:

image-20211204175429756

代码说明:

  • 代码中首先定义了四个点的坐标,并使用plt.scatter()函数绘制在坐标系上。
  • 然后分别利用前三个点和后三个点,使用np.linalg.solve()函数解方程组得到圆心坐标和半径,并使用plt.plot()函数绘制圆。
  • 接着,通过np.linspace()函数生成角度值,并利用三角函数计算圆弧上的点坐标,并提取与第2、第3个点BC相交的圆弧。
  • 最后,使用np.mean()函数对提取的两个圆弧进行平均拟合,得到一条曲线。

需要注意的是,代码需要安装numpymatplotlib库。

希望本文能够帮助您理解如何使用Python实现两圆弧拟合曲线。

Python实现两圆弧拟合曲线:基于坐标系上四个点

原文地址: https://www.cveoy.top/t/topic/ndbg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录