程序随机生成可视化的美观漂亮的无向图/有向图

觉得写个教程很有必要。

c++随机生成不难,但毕竟只是一串数字,还要自己的想象力才能把这些数据可视化。

但其实有方法用java、javascript这类容易画图的语言随机生成可视化的无向图。

我们会随机生成一个位置,再在这个位置放一个点(实际上是一个圆)。为了让两点之间不相隔太近,就规定两个圆的圆心距离必须大于某个值。

但线怎么连呢?我一开始就卡在这里了。如果完全随机的话,即随机找两个点之间连一条线,那么结果会是这样的:

生成的线很乱,很难看清。一点也不美观。

但稍微修改一下方法,就没那么乱了。我们不必每次找随机两个点,而是遍历每个点,找出离它最近的两个点,连上线。当然如果已经连上线了,就重新再找。

这样下来,线就清楚很多了。但还有个问题,假如某三个点几乎三点一线的话,那么程序非常可能在这三个点之间连三条线,三条线相隔太近仍然难以分清楚。

但其实也很容易解决,只要保证连新线之前,新线的角度和旧线的角度必须相隔某个值。比如我设置为20度。

这样下来就非常美观了。以下是随机生成的图。也可以看看https://clatterrr.github.io/jinkela/index.html,刷新页面就可以随机生成新图。

还有,为什么每个点要找最近的两个点呢?原因是找一个点线太少,甚至没法保证联通,三个点线太多,两个点刚好。具体可以自己去试。

2 thoughts on “程序随机生成可视化的美观漂亮的无向图/有向图”

Leave a Reply