求直线右侧距线段中点指定距离的点的代码优化方案
代码优化方案
核心优化逻辑
原代码冗余点集中在使用atan2、tan等开销极高的三角函数,还额外计算两个候选点再通过叉积筛选,完全可以通过纯向量运算直接推导目标点,砍掉所有非必要步骤,运算速度和精度都会显著提升。
推导过程
- 计算线段P1到P2的方向向量:
vx = x2 - x1,vy = y2 - y1 - 计算方向向量的模长:
len = sqrt(vx * vx + vy * vy),用于单位化法向量 - P1指向P2的前进方向右侧的单位法向量为
(vy / len, -vx / len),该方向天然符合原代码叉积判断的右侧要求,无需二次筛选 - 保留原中点计算逻辑:
ax = (x1 + x2) / 2,ay = (y1 + y2) / 2 - 目标点直接由中点加偏移量得到:偏移量 = 距离d * 单位法向量
优化后代码
double x1, x2, y1, y2, px, py, d; d = 2.0; // 给定距离 // 计算方向向量 double vx = x2 - x1; double vy = y2 - y1; double len = sqrt(vx * vx + vy * vy); // 边界判断:两点重合时线段不存在,可根据业务需求处理异常 if (len < 1e-12) { // 自定义异常处理逻辑 } else { // 计算单位法向量 double ux = vy / len; double uy = -vx / len; // 计算中点 double ax = (x1 + x2) / 2; double ay = (y1 + y2) / 2; // 直接得到目标点 px = ax + d * ux; py = ay + d * uy; }
性能提升说明
- 完全移除了
atan2、tan等高开销三角函数运算,这类运算的单周期耗时是普通加减乘除的几十上百倍 - 去掉了候选点计算和叉积判断分支,整体运算量减少60%以上
- 同时避免了三角函数运算带来的精度损失,计算结果准确性更高
内容的提问来源于stack exchange,提问作者Googlebot
相关产品推荐
相关产品推荐

