我试图计算图中两条边之间的角度,为了做到这一点,我将两条边都转移到原点,然后使用点积来计算角度。我的问题是对于像 e1
和 e2
这样的边,angle(e1,e2)
的输出是 -1.#INDOO
。
这个输出是什么?这是一个错误吗?
这是我的代码:
double angle(Edge e1, Edge e2){
Edge t1 = e1, t2 = e2;
Point tail1 = t1.getTail(), head1 = t1.getHead();
Point u(head1.getX() - tail1.getX(), head1.getY() - tail1.getY());
Point tail2 = t2.getTail(), head2 = t2.getHead();
Point v(head2.getX() - tail2.getX(), head2.getY() - tail2.getY());
double dotProduct = u.getX()*v.getX() + u.getY()*v.getY();
double cosAlpha = dotProduct / (e1.getLength()*e2.getLength());
return acos(cosAlpha);
}
Edge
是一个包含两个点的类,Point
是一个包含两个 double x 和 y 的类。
我使用 angle(e1,e2)
来计算像 b
这样的 vector 在像 a
这样的 vector 上的正交投影长度:
double orthogonalProjectionLength(Edge b, Edge a){
return (b.getLength()*sin(angle(b, a) * (PI / 180)));
}
而且这个函数有时也会给我 -1.#INDOO
。你可以看到 Point
和 Edge
的实现 here .
我的输入是二维空间中 n 个 Point
的集合 S。 Iv 构造了 p 和 q 之间的所有边(p,q 在 S 中),然后尝试像这样计算角度:
for (int i = 0; i < E.size(); i++)
for (int j = 0; j < E.size(); j++){
if (i == j)
cerr << fixed << angle(E[i], E[j]) << endl; //E : set of all edges
}
如果问题来自 cos()
和 sin()
函数,我该如何解决?这里有其他以更有效的方式计算 sin 和 cos 的库吗?
看this例子。
此示例中的输入是两个不同的点(如 p 和 q),它们之间有两条边(pq
和 qp
)。 angle(pq , qp)
不应该总是 180 吗?和 angle(pq,pq)
和 angle(qp,qp)
应该是 0。我的程序显示两种不同的行为,有时 angle(qp,qp ) == angle(pq,pq) ==0
和 angle(pq , qp) == angle(pq , qp) == 180.0
,有时答案是 -1.#INDOO
所有四个边。
Here是一个代码示例。 多次运行它,您将看到错误。
最佳答案
您想要投影并通过所有这些触发器?您只需要在 a 的方向上用单位 vector 点 b。所以最后的答案是
(Xa.Xb + Ya.Yb) / square_root(Xa^2 + Ya^2)
您是否检查过 cosAlpha 没有达到 1.000000000000000000000001?这将解释结果,并提供另一个不像这样到处走动的理由。
关于c++ - 图的两条边之间的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26460593/