You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已知半径、弦长、起止点与起止角时如何计算圆弧正确圆心

随机槽式赛道生成的弯道圆弧圆心计算方法

第一步:计算给定半径下的两个候选圆心

已知圆弧起点$P_1(x_1,y_1)$、终点$P_2(x_2,y_2)$、圆弧半径$R$,按以下步骤计算弦两侧的两个可能圆心:

  • 计算弦中点坐标:Mx = (x1 + x2) / 2,My = (y1 + y2) / 2
  • 计算弦向量分量:dx = x2 - x1,dy = y2 - y1,弦长$L$可直接用已获取的参数,校验满足$L \leq 2R$即可
  • 计算圆心到弦的垂直距离:d = sqrt(R*R - (L/2)*(L/2))
  • 弦的两个垂直方向单位向量为(-dy/L, dx/L)和(dy/L, -dx/L),分别对应弦的两侧
  • 两个候选圆心坐标:
    • 候选1:C1x = Mx + (-dy/L)*d,C1y = My + (dx/L)*d
    • 候选2:C2x = Mx + (dy/L)*d,C2y = My + (-dx/L)*d

第二步:基于赛道连续行进逻辑筛选正确圆心

原有方向判定逻辑的核心问题是未对角度做跨周期归一化,且未建立角度差符号与转弯侧的对应关系,按以下规则筛选即可:

  1. 统一角度归一化规则
    所有赛道段的方向角、圆弧起止角全部归一化到$[-\pi, \pi]$区间,参考实现:
import math
def normalize_angle(angle: float) -> float:
    angle = angle % (2 * math.pi)
    return angle if angle <= math.pi else angle - 2 * math.pi
  1. 计算当前弯道的转向符号
    取当前弯道的入口方向角(即上一段赛道的出口方向角)$\theta_{entry}$、出口方向角$\theta_{exit}$,计算归一化角度差:
    delta_theta = normalize_angle(theta_exit - theta_entry)
  • 若赛道按逆时针排布、左转弯为正方向:delta_theta > 0为左转弯,delta_theta < 0为右转弯;若为顺时针排布规则,左右判定反过来即可。
  1. 叉乘校验选对对应侧圆心
    取弦向量v = (dx, dy),分别计算两个候选圆心与P1连线的叉乘值:cross = dx * (Cy - y1) - dy * (Cx - x1)
  • 左转弯场景:选择叉乘值与半径符号一致的候选圆心(半径取正值时选cross>0的圆心)
  • 右转弯场景:选择叉乘值与半径符号相反的候选圆心(半径取正值时选cross<0的圆心)

若参数中圆弧角度为负值,直接对应顺时针转向,将角度符号与上述delta_theta符号做对齐校验即可,无需额外转换。

常见避坑说明

  • 不要直接使用未归一化的角度差做判定:例如入口方向角为350°、出口方向角为10°时,直接做差结果为-340°,归一化后实际为+20°,属于左转弯,未归一化会直接选反圆心,是赛道绘制错位的最常见原因。
  • 注意绘图坐标系的Y轴方向:若使用的绘图API默认Y轴向下为正(如Canvas、多数2D GUI库),垂直方向向量的Y分量需要整体翻转符号,避免左右转向判定反转。

坐标列表示例
赛道绘制错位效果示例

内容的提问来源于stack exchange,提问作者MiguelPalma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:36:22