gpt4 book ai didi

vector - 我怎么知道两条线段是否接近共线

转载 作者:行者123 更新时间:2023-12-04 23:06:50 27 4
gpt4 key购买 nike

由于浮点精度,我在确定两条线段是否共线时遇到了一些麻烦。如何确定线段是否与某些公差共线?

最佳答案

编辑:

如果线段包含两个相同的点,则它们是共线的。如果它们共享一个点并且接近平行,则它们接近共线。

如果向量之间的角度小于您声明的阈值,则向量实际上是平行的。可能小于 0.000027 度,这是十分之一度秒的十进制等值(在纬度距离上,相当于在赤道上的经度距离,相差大约十英尺;这与民用 GPS 的精度差不多)。

您没有告诉我们您使用的是什么语言或库;在 .NET 的 System.Windows.Media.3D 库中有一个 Vector3D 结构,它有一个 AngleBetween() 方法,使这个检查成为一个单行。

“基本”数学(它实际上是向量三角函数,不是大多数定义的“基本”概念)是 θ=cos-1( A*B/|A||B| );也就是说,两个向量的标量乘积的数量除以它们的幅度的乘积的反余弦值。

均包含分量 X、Y 和 Z 的向量 A 和向量 B 的点积为 XAXB + YAYB + ZAZB。向量 A 的大小是 sqrt(XA2 + YA2 + ZA2)。

因此,在伪 C 语言中:

//Vector is a simple immutable class or struct containing integer X, Y and Z components
public bool CloseEnough(Vector a, Vector b, decimal threshold = 0.000027m)
{
int dotProduct = a.X*b.X + a.Y*b.Y + a.Z*b.Z;
decimal magA = sqrt(a.X*a.X + a.Y*a.Y + a.Z*a.Z); //sub your own sqrt
decimal magB = sqrt(b.X*b.X + b.Y*b.Y + b.Z*b.Z); //sub your own sqrt

decimal angle = acos(dotProduct/(magA*magB)); //sub your own arc-cosine

if(angle <= threshold
}

关于vector - 我怎么知道两条线段是否接近共线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10096930/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com