比较两个节点坐标的最佳方法是什么?

时间:2018-10-11 09:32:28

标签: c++ graph directed-acyclic-graphs

我有一个图,每个节点的位置都为一对(x, y)。我想比较两个节点的欧式距离,并根据它们的距离分配一个新的属性或标签。

下一步,我要检查它们是否彼此靠近,因为它们将具有相似的属性,并且由于彼此远离的两个节点的相似性要低得多。

例如:如果有node1 (1, 1)node2(1, 2),则它们几乎是邻居,并且具有很强的相似性。但是node3(51, 48)node1node2距离很远。

一种方法是检查两个节点之间的每个距离间隔:

if(dist == a)
    map<pair<node, node>, taga>
if(dist == b)
    map<pair<node, node>, tagb>
if(dist == c)
    map<pair<node, node>, tagc>
.
.
.
if(dist == z)
    map<pair<node, node>, tagz>

设置此间隔的最佳方法是什么?我认为上述算法需要很多条件,如果图形很大并且分布在区域周围。

标签可能是节点的权重或连接到它们的边缘,因此附近的节点可能具有相似的权重。

有没有一种有效的方法?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,则要检查两个点(位置)之间的接近度,该点可能彼此相隔也可能相距不远。

首先检查此功能:

int get_distance(std::pair<int, int> const pos_a, std::pair<int, int> const pos_b)
{
    auto const distance_x = pos_a.first >= pos_b.first ? pos_a.first - pos_b.first : pos_b.first - pos_a.first;
    auto const distance_y = pos_a.second >= pos_b.second ? pos_a.second - pos_b.second : pos_b.second - pos_a.second;
    if (distance_x != 0 && distance_y != 0)
        return int(round(sqrt(distance_x * distance_x + distance_y * distance_y)));
    if (distance_x == 0)
        return distance_y;
    return distance_x;
}

在这里,它通过用最大数减去两个点之间的距离(因此是两个开始的语句)来计算两个点之间的距离,并且使用的运算符为Ternary Operator。 (如果您不知道那是什么,请单击该链接)

第三行是一条if语句,用于评估两个获取的距离是否都是非零,因为如果是,则它们在垂直或水平方向上都在同一行上...

如果两个均为 非零个数字,则将距离x和y的平方的平方根和均四舍五入为最接近的整数,然后将其自身强制转换为整数(由于返回类型为 int

另一方面,如果其中任何一个一个数字(因此,在同一行上),则距离 X Y 分别根据直线的轴(垂直或水平,因此distance_x == 0distance_y == 0)返回

现在,对于另一个问题,即 viz。亲密性,如上所述,一种方法是声明一个枚举器,该枚举器存储此类事物的值...

  

示例:

enum Distance
{
    DISTANCE_VERY_CLOSE = 1,
    DISTANCE_CLOSE,
    DISTANCE_RELATIVELY_CLOSE,
    DISTANCE_RELATIVELY_FAR,
    DISTANCE_FAR,
    DISTANCE_VERY_FAR,
    DISTANCE_EXTREMELY_FAR
};
     

然后此枚举器将为您跟踪距离,因此您只需要使用此宏即可将整数转换为Distance枚举器)...

     

#define TO_DISTANCE(distance) ((distance) > 7 ? Distance(7) : Distance(distance))

     

这是一个简单的宏,如果距离大于7(因此,DISTANCE_EXTREMELY_FAR),则仅将整数强制转换为枚举数,并将数字强制转换为7。但是,您可以根据需要继续在枚举器中添加更多内容。 (只需记住将7更改为最后一个enum成员拥有的值)

使用上述方法的示例:

int main()
{
    auto const dist = TO_DISTANCE(get_distance(std::make_pair(20, 20), std::make_pair(30, 30)));
    accuracy *= dist; // Multiplying accuracy to distance (Hence, increases)
                      // Note: The accuracy needs to be at least 1 or more for this to work...
    // You can check the "closeness" like this...
    if (dist == DISTANCE_FAR)
        std::cout << "They are far away from each other" << std::endl;
    // Some other code goes here ...
    return 0;
}

亲切的问候,

Ruks。