背景为在离散点集中进行线性插值。
- 已知插值距离为d,v1、v2为离散点集当中的相邻两点,以v0为圆心,d为半径,圆在v1、v2之间的交点
- 和直线段与圆相交的情况有点类似
- 基于插值背景,已判断在v1、v2间能进行插值,且只插入一个点
- 最后通过判断解是否在v1、v2之间来确定最终解
-
function VecCrossoverCircle(v1, v2, v0, d) { let x1, y1, x2, y2, x0, y0, r; x1 = v1.x; y1 = v1.y; x2 = v2.x; y2 = v2.y; x0 = v0.x; y0 = v0.y; r = d; //二次方程各项参数 let a, b, c, delta, t1, t2; a = x1*x1 + x2*x2 + y1*y1 + y2*y2 - 2 * x1*x2 - 2 * y1*y2; b = 2 * (x0*x1 + x1*x2 + y0*y1 + y1*y2 - x0*x2 - y0*y2 - x1*x1 - y1*y1); c = x0*x0 + x1*x1 + y0*y0 + y1*y1 - 2 * x0*x1 - 2 * y0*y1 - r*r; delta = b*b - 4 * a*c;//判别式 let cp1 = new Vector(), cp2 = new Vector(); cp1.z = v0.z; cp2.z = v0.z; //即使只有一个交点也要先假设为两个 t1 = (-b &