有没有数值稳定的角平分线算法?
问题如下:
- 给定三个 vector (二维)A、B、C
- 找到角 B 的平分线(AB 和 BC 之间的角)
实际上我是按以下方式计算的:
- 标准化 AB
- 标准化 BC
- 求 (AB+CD)/2f(中点)
- 平分线是 B 和中点之间的直线。
我的方法的问题是,当角度接近 180°(AB 几乎平行于 BC)时,平分线非常不准确(当然是因为中点几乎与 B 重合)。当前的算法非常不准确,有时生成的平分线几乎与其他 2 条线段之一平行。
是的,没有“强制转换”问题,所有计算均以单精度 float 完成。
最佳答案
如果将 BA 旋转 +90° 并将 BC 旋转 -90°,则角平分线保持不变。
所以如果情况稳定,即BA和BC的点积为正,就用原来的公式。
如果它是负数,应用旋转,对于 BA (x,y) -> (-y,x)
和对于 BC
(x, y) -> (y,-x)
,这也使点积为正。像以前一样处理新载体。
如果您尝试这个,您会注意到平分线方向的跳跃现在发生在 vector 之间的角度 -90° 处。避免这种跳跃是不可能的,因为一个连续的平分线只有经过两圈(固定 BA 和移动 C)后才会相同。
关于c++ - 数值稳定的角平分线算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43435055/