我试图计算图中两条边之间的角度,以便将两条边转移到原点,然后使用点积来计算角度。我的问题是,对于像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
是把两个双号为x和y的类。 即时通讯使用angle(e1,e2)
来计算像b
向量的正交投影长度到一个向量像a
:
double orthogonalProjectionLength(Edge b, Edge a){
return (b.getLength()*sin(angle(b, a) * (PI/180)));
}
和该功能有时也给我-1.#INDOO
。你可以看到执行Point
和Edge
here。 我的输入是在二维空间中的一个集合S n Point
。 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()
功能,如何解决呢?在这里,其他的图书馆是以更有效的方式计算罪恶和罪犯的吗?
请看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是一个代码示例。 运行几次,你会看到错误。
请给我们作出了榜样。 – 2014-10-20 07:39:54
这是什么180?所有的东西都应该用弧度表示,所以只需要用弧度表示。 – 2014-10-20 07:59:01
我很确定问题出在您发布的代码之外。但看起来你的问题在于边缘长度为零,这导致被零问题分隔。没有看到更多的代码,很难肯定地说为什么。 – 2014-10-20 08:07:57