繁体   English   中英

有没有办法将无向图转换为 (x,y) 坐标系?

[英]Is there a way to convert an undirect graph to an (x,y) coordinate system?

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

仅当图形的维度为 2 或更少时,您才能执行此操作。 因此,您需要确定图形的维度——这是衡量其连通性的指标。 如果维度为 2 或更小,那么只要允许边相交,您就始终能够在欧几里得平面上对图形进行 plot,同时保留相对边长。 如果您禁止相交的边,那么您只能 plot 图形在欧几里得平面上,如果图形中循环大小与循环密度的比率在整个图形中足够低(很难计算)。 我可以告诉你如何 plot 最棘手的位 - 周期 - 并给你一个通用的方法,但你实际上在如何 plot 这方面有一些自由,所以如果你有更具体的问题,请发表评论或编辑问题要求。

如果你不知道你是否有周期,那就找出来吧! 这里有一些有效的算法

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

计数循环中的节点数n 为了使循环形成多边形,循环形成的角度之和必须为(n - 2) * 180 degrees ,其中n是边数(即节点数)。 现在你不会有一个正多边形,除非所有的边长度都相同,所以你不能只使用(n - 2) / n * 180 degrees作为你的角度。 如果你使角度太尖锐,那么边缘将被迫相交; 如果你让它们太大,那么你将无法关闭多边形。 按照StackExchange Math 中的说明计算内角。

重复这个过程到 plot 图中的每个周期,如果需要,在任意位置。 如果需要,您可以随时翻译这些周期。

策划其他一切。 我的天真,无疑是低效的方法是逐层遍历每个循环中的每个节点和 plot 相邻节点(“分支”)。 然后旋转和平移整个循环(包括连接的分支)以确保每条边都可以到达它的两个节点。 最后,如果可能,根据需要旋转分支(相对于它们连接的循环)以解决相交的边缘。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM