Следующая диаграмма иллюстрирует проблему, я столкнулся созданием Manhattan диаграммы:Перекрывающиеся отрезки
Коробка окружает большую часть линии [(ТЙ, midy) - (Sx, midy)], что перекрыл существующую строку (представленную ниже кодом psegment
). Я удалил перекрывающиеся головки стрелок (и хвосты), и я немного зациклен на том, как проверить наложение.
Вот проблемный код:
Line2D.Double segment = new Line2D.Double(sx, midy, tx, midy);
// Associate the middle-y point with the bounds of the target object.
// On subsequent draws of targets with a similar mid-y, make sure that
// there are no overlapping lines.
//
if(midPointMap.put(midy, segment) != null) {
//if(midy == 90) {
// New Line.
//
System.err.printf("NEW: (%3.2f, %3d)-(%3.2f, %3d)\n", sx, midy, tx,
midy);
for(Line2D.Double psegment : midPointMap.getValues(midy)) {
// Previous Line.
//
System.err.printf("OLD: (%3.2f, %3d)-(%3.2f, %3d)\n",
psegment.getX1(), midy, psegment.getX2(), midy);
}
//}
}
// Line for the bus.
//
result.moveTo(sx, midy);
result.lineTo(tx, midy);
Вот другой пример изображения, чтобы дать вам представление о макете Manhattan:
На рисунке непосредственно выше, линия между Диалоговое окно и окно перекрыты (это не очень заметно при этом увеличении). Изображение иллюстрирует, как могут быть несколько подклассов, и поэтому обнаружение перекрытия должно учитывать несколько целей (tx, ty) для нескольких источников (sx, sy) вдоль одной и той же линии среднего y.
midPointMap
переменная является хэш-набор, который может содержать несколько значений в ключе:
private MultiValueMap<Integer, Line2D.Double> midPointMap =
new MultiValueMap<Integer, Line2D.Double>();
Эта карта среднего значения Y от набора отрезков.
Любые идеи о том, как не нарисовать линию, если она перекрывает существующий сегмент линии?
Обновление # 1
Обратите внимание, что сегменты линии для каждого «шины» приведены в произвольном порядке.
Когда вы приближаетесь к диаграмме, они становятся чрезвычайно очевидными. Цель состоит в том, чтобы создать граф, который радует глаз. Перекрывающиеся линии отвлекают от диаграммы. –
Я должен добавить, что чем больше предметов удваивается, тем темнее становятся перерисованные линии. До такой степени, что даже без масштабирования линии выглядят разными. Нет возможности aA - bB. –
Шаги 1 и 2, учитывая ограничения API библиотеки графических объектов, невозможны. Шаг 3 займет слишком много времени в критическом цикле (средние точки отображает сегменты строк по одному и тому же значению оси Y). Шаг 4 - это в основном проблема: как вы ее реализуете? Например, каждый сегмент имеет две позиции X, поэтому вы не можете сравнивать «свою позицию x» с конечными точками более длинного сегмента. Кроме того, сегменты не могут быть упорядочены по длине. –