use of org.knime.workbench.ui.layout.Graph.Node in project knime-core by knime.
the class VerticalCoordinateAssigner method horizontalAlignmentLeftBottommost.
/**
* alignment by left median neighbors, resolving conflicts in a bottommost
* fashion.
*/
private void horizontalAlignmentLeftBottommost() {
for (int i = 0; i < m_layers.size(); i++) {
int r = m_layers.size();
for (int k = m_layers.get(i).size() - 1; k >= 0; k--) {
Node vk = m_layers.get(i).get(k);
ArrayList<Node> neighbors = getNeighbors(vk, true);
if (!neighbors.isEmpty()) {
int d = neighbors.size();
int m1 = (int) Math.floor((d + 1) / 2.0) - 1;
int m2 = (int) Math.ceil((d + 1) / 2.0) - 1;
for (int m = m2; m >= m1; m--) {
if (m_align.get(vk) == vk) {
Node um = neighbors.get(m);
if (!m_marked.get(um.getEdge(vk)) && r > m_pos.get(um)) {
m_align.put(um, vk);
m_root.put(vk, m_root.get(um));
m_align.put(vk, m_root.get(vk));
r = m_pos.get(um);
}
}
}
}
}
}
}
use of org.knime.workbench.ui.layout.Graph.Node in project knime-core by knime.
the class VerticalCoordinateAssigner method run.
/**
* runs vertical coordinate assignment as described in the article.
*/
public void run() {
// preprocessing
markConflicts();
// run alignment and compaction 4 times, once for each directional
// choice
initNodeMaps();
horizontalAlignmentLeftTopmost();
verticalCompaction();
storeCoordinates(m_yLT);
initNodeMaps();
horizontalAlignmentLeftBottommost();
verticalCompaction();
storeCoordinates(m_yLB);
initNodeMaps();
horizontalAlignmentRightTopmost();
verticalCompaction();
storeCoordinates(m_yRT);
initNodeMaps();
horizontalAlignmentRightBottommost();
verticalCompaction();
storeCoordinates(m_yRB);
initNodeMaps();
// balance between 4 alignments
balance();
// set final coordinates
for (Node n : m_g.nodes()) {
m_g.setY(n, m_y.get(n));
}
}
use of org.knime.workbench.ui.layout.Graph.Node in project knime-core by knime.
the class VerticalCoordinateAssigner method markConflicts.
/*
* Functions needed for first phase
*/
/**
* mark conflicting edges.
*/
private void markConflicts() {
if (m_layers.size() < 4) {
// no conflicts possible since there cannot be any inner segments
return;
}
// next-to-last and last layer
for (int i = 1; i < m_layers.size() - 2; i++) {
int k0 = 0;
int l = 0;
for (int l1 = 0; l1 < m_layers.get(i + 1).size(); l1++) {
Node vl1 = m_layers.get(i + 1).get(l1);
Edge innerSegment = getInnerSegmentIncidentTo(vl1);
if (l1 == m_layers.get(i + 1).size() - 1 || innerSegment != null) {
int k1 = m_layers.get(i).size() - 1;
if (innerSegment != null) {
k1 = m_layers.get(i).indexOf(innerSegment.opposite(vl1));
}
while (l <= l1) {
Node vl = m_layers.get(i + 1).get(l);
for (Edge e : m_g.inEdges(vl)) {
Node vk = e.opposite(vl);
int k = m_layers.get(i).indexOf(vk);
if (k < k0 || k > k1) {
m_marked.put(e, true);
}
}
l++;
}
k0 = k1;
}
}
}
}
use of org.knime.workbench.ui.layout.Graph.Node in project knime-core by knime.
the class VerticalCoordinateAssigner method horizontalAlignmentRightBottommost.
/**
* alignment by right median neighbors, resolving conflicts in a bottommost
* fashion.
*/
private void horizontalAlignmentRightBottommost() {
for (int i = m_layers.size() - 1; i >= 0; i--) {
int r = m_layers.size();
for (int k = m_layers.get(i).size() - 1; k >= 0; k--) {
Node vk = m_layers.get(i).get(k);
ArrayList<Node> neighbors = getNeighbors(vk, false);
if (!neighbors.isEmpty()) {
int d = neighbors.size();
int m1 = (int) Math.floor((d + 1) / 2.0) - 1;
int m2 = (int) Math.ceil((d + 1) / 2.0) - 1;
for (int m = m2; m >= m1; m--) {
if (m_align.get(vk) == vk) {
Node um = neighbors.get(m);
if (!m_marked.get(um.getEdge(vk)) && r > m_pos.get(um)) {
m_align.put(um, vk);
m_root.put(vk, m_root.get(um));
m_align.put(vk, m_root.get(vk));
r = m_pos.get(um);
}
}
}
}
}
}
}
use of org.knime.workbench.ui.layout.Graph.Node in project knime-core by knime.
the class VerticalCoordinateAssigner method horizontalAlignmentRightTopmost.
/**
* alignment by right median neighbors, resolving conflicts in a topmost
* fashion.
*/
private void horizontalAlignmentRightTopmost() {
for (int i = m_layers.size() - 1; i >= 0; i--) {
int r = -1;
for (int k = 0; k < m_layers.get(i).size(); k++) {
Node vk = m_layers.get(i).get(k);
ArrayList<Node> neighbors = getNeighbors(vk, false);
if (!neighbors.isEmpty()) {
int d = neighbors.size();
int m1 = (int) Math.floor((d + 1) / 2.0) - 1;
int m2 = (int) Math.ceil((d + 1) / 2.0) - 1;
for (int m = m1; m <= m2; m++) {
if (m_align.get(vk) == vk) {
Node um = neighbors.get(m);
if (!m_marked.get(um.getEdge(vk)) && r < m_pos.get(um)) {
m_align.put(um, vk);
m_root.put(vk, m_root.get(um));
m_align.put(vk, m_root.get(vk));
r = m_pos.get(um);
}
}
}
}
}
}
}
Aggregations