c++ - 数值稳定的角平分线算法

标签 c++ math

有没有数值稳定的角平分线算法?

问题如下:

  • 给定三个 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/

相关文章:

c++ - 我无法将项目添加到 ( std::vector < std::vector <std::string>> )

c++ - 在 C++ 中,结构中的 std::list 如何分配内存,而在文件映射中使用它时,列表结果为空

mysql时差计算的一些变化

c - 使用俯仰和横滚值的倾斜传感器的图形设计

math - 使用四元数沿球体表面移动

c++ - 加法和减法不适用于 Armadillo 稀疏矩阵

c++ - 使用 Qt C++ 截屏

c++ - 在字符串中查找所有需要的单词

math - 将复杂矩阵转换分解为一系列简单转换?

java - 处理/线图 - 帮助