集群中的分组/链接
Posted
技术标签:
【中文标题】集群中的分组/链接【英文标题】:Grouping/linking in a cluster 【发布时间】:2015-08-11 14:53:20 【问题描述】:我正在使用处理,到目前为止,我有一个绘制随机球的草图,并在一定半径内连接时绘制一条线。
for(int i=0;i<=people.size()-1;i++)
Person p = people.get(i);
for(Person pp: people)
if(pp!=p)
if(p.isIntersecting(pp))
// Draw the line connecting the two here
line(p.loc.x,p.loc.y,pp.loc.x,pp.loc.y);
// Store the other person in this persons "connections" list
if(!p.connections.contains(pp)) p.connections.add(pp);
else
p.connections.remove(pp);
这非常适合直观地显示哪些组聚集在一起。 但是现在我如何将这组连接的对象存储到一个 ArrayList 中,同时它们是连接的?所以我可以将它们召回用于其他功能。
就像我的意思一样,当 4 个人在屏幕上链接时,我可以很容易地直观地看到。但是我怎样才能告诉计算机它们都已链接呢?
链接存储在每个对象的连接列表中。 但是每个单独的对象如何知道其他对象的连接以对它们进行分组。
所以我可以在它们被链接时在它们周围画一个“组块”。
我尝试了很多方法,但似乎总是遇到递归/*** 错误。因为很明显我只是递归地查看所有连接来链接它们,这太多了。
知道如何将连接的线作为组存储在 ArrayList 中吗?
【问题讨论】:
【参考方案1】:我假设您将“集群”定义为一组对象,这些对象与该集群中的任何其他对象相差 Person 对象,它们通过connections
列表链接。请注意,这并不是传统计算机科学意义上的真正“集群”,因此它可能会影响您的 google 搜索。
作为第一次尝试,您可能会考虑将集群组织成 ArrayList
的 ArrayLists
的 Person
对象。让我们称之为ArrayList<ArrayList<Person>> clusters
。每个内部ArrayList
代表一个连接的Person
对象的“集群”。你还有另一个ArrayList<Person>
代表你已经访问过的Person
对象,称之为visited
。然后,您尝试做的基本操作是:
ArrayList<Person> visited;
ArrayList<ArrayList<Person>> clusters;
void createGroups()
for(Person p : people)
//if we've already added this Person, skip it
if(!visited.contains(p))
//since we haven't seen this Person, it isn't clustered yet
ArrayList<Person> newCluster = new ArrayList<Person>();
clusters.add(newCluster);
//start the recursion
addMe(p, newCluster);
void addMe(Person p, ArrayList<Person> cluster)
//if we've already added this Person, skip it
if(visited.contains(p))
return;
//add me first
cluster.add(p);
//remember that we've already visited me
visited.add(p);
//now add my neighbors
for(Person n : p.connections)
addMe(n, cluster);
请注意,我还没有测试过这段代码,但基础知识已经存在:您需要跟踪您已经访问过的人,并跳过他们以避免无限递归。这是您的基本情况。
另请注意,您可能想研究“真正的”聚类算法。 Google 是您的朋友,因为集群本身就是一个完整的领域。
【讨论】:
【参考方案2】:看起来您有一个名为Person
的类,因此我将在该类中包含 ArrayList。不知道你的完整代码,它可能看起来像这样:
class Person
ArrayList<Person> connected = new ArrayList<Person>();
Person()
// create as you already are doing
void checkConnections()
connected.clear(); // delete existing connections
for (Person other : persons)
if (dist(x,y, other.x,other.y) < 100)
connected.add(other):
这首先清除 ArrayList,然后检查它自己与所有其他人之间的距离。如果距离足够短(在我的示例中为 100 像素),则将其添加到 ArrayList。
已根据您的评论进行编辑: 这本质上是一个关于图和节点的问题。请参阅this examples 作为起点。
【讨论】:
这就是我正在做的事情。在检查它们是否相交后,我将连接推入人员连接数组。这也是您上面的代码所做的。我真正的问题是。如何从所有子连接中获取所有连接。例如....可以说它们都链接在一条线上。 6个连接。每个都连接成一条链。第一个元素如何告诉它连接到最后一个元素。当它实际上是通过一系列连接进行连接时。不是直接联系。我不确定我这样说是否有意义? 也许您需要一个 Group 类...来保存 Person 的连接实例? 我明白了——你的问题不是很清楚。请参阅我的更新答案以及示例链接。以上是关于集群中的分组/链接的主要内容,如果未能解决你的问题,请参考以下文章