c++ - 图的两条边之间的角度

标签 c++ visual-c++ math

我试图计算图中两条边之间的角度,为了做到这一点,我将两条边都转移到原点,然后使用点积来计算角度。我的问题是对于像 e1e2 这样的边,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。你可以看到 PointEdge 的实现 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),它们之间有两条边(pqqp)。 angle(pq , qp) 不应该总是 180 吗?和 angle(pq,pq)angle(qp,qp) 应该是 0。我的程序显示两种不同的行为,有时 angle(qp,qp ) == angle(pq,pq) ==0angle(pq , qp) == angle(pq , qp) == 180.0,有时答案是 -1.#INDOO 所有四个边。 Out:

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/

相关文章:

c++ - 在c plus plus中重新定义类错误

c++ - 我可以将 std::basic_string 用于非字符类型的东西吗?

c++ - MSVC2015 : inconsistencies with permissions 上的实验性 C++17 文件系统

matlab - Zoidberg曲线,无法到达 "zoidberg"的解决方法

java - RxJava 中的 n 元笛卡尔积

string - 将单词转换为唯一标识符

c++ - 在带有 cpptk 的 Windows 上的 C++ 应用程序中使用 TCL/Tk 的 Unresolved external 问题

c++ - Opengl 创建一个 3d 框而不是一个简单的三角形

c++ - CONDITION_VARIABLE 是如何实现的?

c++ - 枚举类型比较错误