比较两个节点坐标的最佳方法是什么?
What is the best way compare two nodes coordinates?
>我有一个图,每个节点的位置都是一对(x, y)
。我想比较两个节点的欧几里得距离,并根据它们的距离分配一个新属性或标签。
接下来,我想检查它们是否彼此靠近,因为它们将具有相似的属性,并且由于彼此远离的两个节点的相似性要低得多。
例如:如果有node1 (1, 1)
和node2(1, 2)
,它们几乎是邻居,并且具有很强的相似性。但node3(51, 48)
与node1
和node2
相去甚远。
一种方法是检查两个节点之间的每个距离间隔:
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>
放置此间隔的最佳方法是什么?我认为上面的算法需要很多条件,如果图形很大并且分布在该区域周围。
标签可以是节点的权重或连接到它们的边,因此近似节点可以具有相似的权重。
有没有有效的方法?
如果我正确理解了你的问题,你想检查两个点(位置(之间的接近度,这些点(位置(可能相距不远,也可能相距不远。
首先查看此函数:
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;
}
在这里,它通过用最大数字减去它来计算两点之间的距离(因此两个开始语句(,使用的运算符是三元运算符。(如果您不知道那是什么,请单击链接(
第三行是一个 if 语句,用于评估两个获取的距离是否为非零,因为如果它们是,那么它们在垂直或水平方向上位于同一行上......
如果两者都是非零数,则距离 x 和 y 的平方根和四舍五入到最接近的整数,然后将自身转换为整数(因为返回类型为int(
另一方面,如果其中任何一个是零数(因此,在同一行上(,则距离X或Y将根据线的轴分别返回(垂直或水平,因此distance_x == 0
和distance_y == 0
(
现在,对于您的另一个问题,即上面提到的接近性,一种方法是声明一个枚举器来存储这种事情的值......
例:
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 时强制转换数字 7(因此,
DISTANCE_EXTREMELY_FAR
(。但是,如果需要,可以继续在枚举器中添加更多内容。(请记住将 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;
}
亲切问候
鲁克斯。
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?