Мне нужно со временем менять атрибуты узлов и ребер. Время разбито на периоды времени, каждый период времени выглядит одинаково: проверьте каждый узел и ребро на предмет возможных изменений и отредактируйте атрибут, если необходимо. В частности, существуют числовые атрибуты, а размер узла и ширина ребра основаны на значении атрибутов. Изначально график отображается правильно. Узлы и ребра имеют предполагаемый размер. Но динамическое изменение значений атрибутов с течением времени не приводит к изменению размеров элементов. Как я могу убедиться, что изменения атрибутов также изменят визуализацию графиков?
Насколько я понимаю, в Документах и руководствах по Graphstream есть источники, приемники и каналы (канал - это и источник, и приемник). Источники создают события, приемники их потребляют. Я использую GridGenerator, который является источником. Я могу добавить график в качестве приемника и позволить генератору создать график. Я думаю, я должен добавить приемник к графику, потому что изменение атрибутов элементов графика делает его источником. Но что я могу использовать в качестве раковины? graph.display()
возвращает Viewer, но я не могу добавить его в качестве приемника, он говорит, что он не совместим с аргументами для graph.addSink(sink)
. Несмотря на то, что в Документах Graphstream сказано, что средство просмотра является приемником и что средство просмотра автоматически добавляется в качестве приемника. Почему тогда я не вижу изменений в пользовательском интерфейсе? Я не понимаю.
После генерации графа узлы и ребра получают там атрибуты
public static void configureElements(Graph world) {
for (Node node : world.getEachNode()) {
double random = Math.random() * 100;
if (random < 20) {
// remove obstacles
world.removeNode(node)
} else if (random < 30) {
// node have rohstoffe
node.addAttribute("ui.class", "rohstoff");
node.addAttribute("ui.label", node.getId());
node.addAttribute("isRohstoff");
int capacity = (int) (Math.random() * maxCapacity);
node.addAttribute("capacity", capacity);ity);
// nodes size is based on capacity of rohstoffe
node.setAttribute("ui.size", node.getNumber("capacity") + 10);
} else if (random < 32) {
// node is a lager
node.addAttribute("ui.class", "lager");
node.addAttribute("ui.label", node.getId());
node.addAttribute("isLager");
node.addAttribute("lagerstand", 0);
// nodes size is based on capacity of the lager
node.setAttribute("ui.size", node.getNumber("lagerstand") + 10);
} else {
// normal node
node.addAttribute("isNode");
}
}
for (Edge edge : world.getEachEdge()) {
// add pheromones to edge
edge.addAttribute("pheromones", 0);
// edges size is based on number of pheromones
edge.setAttribute("ui.size", edge.getNumber("pheromones"));
}
}
Здесь я динамически меняю атрибут узла с течением времени
public void dropRohstoff(Node node) {
int oldRohstoff = (int) node.getNumber("rohstoff");
int newRohstoff = oldRohstoff++;
node.setAttribute("rohstoff", newRohstoff);
world.nodeAttributeChanged(world.getId(), (long) world.getStep(), node.getId(),"rohstoff", oldRohstoff, newRohstoff);
}
public void pickRohstoff(Node node) {
int oldCapacity = (int) node.getNumber("capacity");
int newCapicity = oldCapacity++;
node.setAttribute("capacity", newCapicity);
world.nodeAttributeChanged(world.getId(), (long) world.getStep(), node.getId(), "capacity", oldCapacity, newCapicity);
}
Здесь атрибуты ребер
public void evaporateAll() {
for (Edge edge : world.getEachEdge()) {
Double oldEvaporateRate = edge.getNumber("pheromones");
Double newEvaporateRate = oldEvaporateRate * (1.0 - evaporateRate);
edge.setAttribute("pheromones", newEvaporateRate);
world.edgeAttributeChanged(world.getId(), (long) world.getStep(), edge.getId(), "pheromones", oldEvaporateRate, newEvaporateRate);
}
}
Кто-нибудь знает, как мне добавить раковину? Или я что-то упускаю?