有没有一种方法可以将无向图转换为(x,y)坐标系?

时间:2020-08-01 21:59:37

标签: c++ graph openframeworks

对于一个我正在从事的项目,我有一些txt文件,这些文件具有从id到id以及权重的信息。 id用于标识每个顶点,权重表示顶点之间的距离。该图是无向的,并且已完全连接,我正在使用c ++和openFrameworks。如何在保持文本文件中指定的权重的同时,将此数据转换为1920x1080的图形的(x,y)坐标点?

1 个答案:

答案 0 :(得分:0)

仅当图形的尺寸小于或等于2时,您才能执行此操作。 因此,您需要确定图形的尺寸-这是对其连通性的度量。 如果尺寸为2或更小,则只要允许边缘相交,就可以始终在欧几里得平面上绘制图形,同时保留相对的边缘长度。如果禁止相交的边缘,则只有在整个图形中,如果周期大小与周期密度之比足够低(很难计算),则只能在欧几里得平面上绘制图形。我可以告诉您如何绘制最棘手的位-循环-并为您提供一般方法,但实际上您在绘制此位方面有一定的自由度,因此,如果您有更具体的描述,请发表评论或编辑问题请求。

如果您不知道自己是否有周期,那就找出来! Here are some efficient algorithms

绘制循环。为循环中的第一个节点提供任意坐标。 在循环坐标中给第二个节点以与第一个节点的距离为边界。 例如,如果将第一个节点绘制在(0,0)处,并且第一和第二个节点之间的边长为1,则将第二个节点绘制在(1, 0)处。 现在变得棘手,因为您需要计算角度。

计算循环中的节点数n。 为了使循环形成多边形,由循环形成的角度之和必须为(n - 2) * 180 degrees,其中n是边数(即节点数)。 现在,除非所有边长都相同,否则您将没有规则的多边形,因此不能仅使用(n - 2) / n * 180 degrees作为角度。如果使角度太尖锐,则边缘将被强制相交;否则,将导致相交。如果将它们设置得太大,则将无法关闭多边形。将内角计算为explained on StackExchange Math

重复此过程以在图形中绘制每个循环,如果需要,可以在任意位置绘制。您随时可以在需要时翻译周期。

绘制其他所有内容。我幼稚的,毫无效率的方法是遍历每个循环中的每个节点并逐层绘制相邻的节点(“分支”)。然后旋转和平移整个循环(包括连接的分支),以确保每个边都可以到达其两个节点。最后,如果可能,请根据需要旋转分支(相对于其连接的循环)以解决相交的边缘。

同样,如果您要查找更具体的内容,请修改问题或发表评论。完整的算法(或使用任何通用语言的完整代码)将给出很长的答案。

相关问题