Anylogic - 视线
Anylogic - line of sight
假设有一些建筑物和演示文稿标记,有没有办法检查两个代理之间是否存在视线?
(意思是检查两个代理是否可以看到对方假设建筑物和墙壁的功能)
欢迎来到 SOF。
不,没有内置函数,afaik。您将不得不手动编写一些代码,这是可能的,但不是直接的。如果您需要这方面的帮助,您需要提供更多细节。
我以前就是这样做的。唯一的问题是,如果您需要每秒执行数千次该计算,它可能会很慢。而且它只是二维的。如果你需要3D,这个想法也没什么不同。
1) 将所有建筑节点和可能成为两个代理之间障碍的所有内容添加到集合中。您可能希望在您的建筑物周围放置一个矩形节点,以将所有内容保存在一个集合中(假设您正在使用 space 标记和节点)
2) 生成delta distance delta(例如等于1)并找到穿过两个代理的线的角度。
3) 从agent1的位置循环到agent2的位置。它将是这样的:
L=delta;
while(L<LThatReachesSecondAgent){
x1 = agent1.getX() + L*cos(angle);
y1 = agent1.getY() + L*sin(angle);
for(Node n : yourCollectionOfNodes){
If(n.contains(x1,y1))
return false
}
/*This can also work maybe faster
//int numNodesInTheWay=count(yourCollectionOfNodes,n->n.contains(x1,y1));
//if(numNodesInTheWay>0) return false
*/
L+=delta;
}
return true
假设有一些建筑物和演示文稿标记,有没有办法检查两个代理之间是否存在视线? (意思是检查两个代理是否可以看到对方假设建筑物和墙壁的功能)
欢迎来到 SOF。
不,没有内置函数,afaik。您将不得不手动编写一些代码,这是可能的,但不是直接的。如果您需要这方面的帮助,您需要提供更多细节。
我以前就是这样做的。唯一的问题是,如果您需要每秒执行数千次该计算,它可能会很慢。而且它只是二维的。如果你需要3D,这个想法也没什么不同。
1) 将所有建筑节点和可能成为两个代理之间障碍的所有内容添加到集合中。您可能希望在您的建筑物周围放置一个矩形节点,以将所有内容保存在一个集合中(假设您正在使用 space 标记和节点)
2) 生成delta distance delta(例如等于1)并找到穿过两个代理的线的角度。
3) 从agent1的位置循环到agent2的位置。它将是这样的:
L=delta;
while(L<LThatReachesSecondAgent){
x1 = agent1.getX() + L*cos(angle);
y1 = agent1.getY() + L*sin(angle);
for(Node n : yourCollectionOfNodes){
If(n.contains(x1,y1))
return false
}
/*This can also work maybe faster
//int numNodesInTheWay=count(yourCollectionOfNodes,n->n.contains(x1,y1));
//if(numNodesInTheWay>0) return false
*/
L+=delta;
}
return true