Следующая диаграмма иллюстрирует проблему, с которой я столкнулся при создании манхэттенской диаграммы:
Перекрывающиеся линии
Рамка окружает большую часть строки [(tx, 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 );
Вот еще один пример изображения, чтобы дать вам представление о планировке Манхэттена:
На рисунке выше линия между диалогом и окном была перекрыта (не очень хорошо видно при этом увеличении). На рисунке показано, как может быть несколько подклассов, и поэтому при обнаружении перекрытия необходимо учитывать несколько целей (tx, ty) для нескольких источников (sx, sy) вдоль одной и той же средней линии y.
Переменная midPointMap
- это хэш-набор, который может содержать несколько значений на ключ:
private MultiValueMap<Integer, Line2D.Double> midPointMap =
new MultiValueMap<Integer, Line2D.Double>();
Отображает средние значения y для набора отрезков.
Есть идеи, как не рисовать линию, если она перекрывает существующий отрезок?
Обновление # 1
Обратите внимание, что линейные сегменты для каждой "шины" приведены в произвольном порядке.