LINUX.ORG.RU

[Java] как посчитать координаты?

 


0

2

Нужно нарисовать дерево. Для этого есть интерфейс, рисующий линию в гуях, которому передаются 4 переменные: начальный x, y и конечный x, y;

Само дерево бинарное и каждая точка хранит в себе уникальный int id (который также отражает последовательность отрисовки) и double высоту (по y). Рисовать нужно прямоугольники (кластеры), которые в соответствии с положением в дереве объеденяют друг друга (см. скриншот), поэтому начальная 'y' будет равняться высоте ниже стоящего прямоугольника. Соот-но, если высота 0, то это нижний кластер (на скриншоте они как имена - это тоже кластеры, но они не рисуются потому, что под собой ничего не объединяют).

Т.е. рисовать мне нужно 3 линии для каждого кластера: вертикальные - правую и левую, и горизонтальную - соединяющую их сверху. Каждый кластер нужно рисовать отдельно - шаг за шагом.

Задав разрешение картинки, ну скажем 800x600 пикселей, встает проблема определения начальных 'x'-ов для каждого прямоугольника, потому как дерево может быть разной глубины, а разрешение - константы.

Вопрос, как вычислять координаты?



Последнее исправление: Sonsee (всего исправлений: 1)
Ответ на: комментарий от yoghurt

Рекурсией.

вопрос не в том, как искать по дереву, это рекурсивный метод у меня есть
как координаты то посчитать?

Sonsee
() автор топика
Ответ на: комментарий от yoghurt

грубо говоря, есть метод:

	void searchTree(Node node, int level) {
		if (node == null) {
			return;
		}
		
		if (node.cluster.getID() == level) {
         посчитатьКоординаты();
         нарисоватьКластер();
		}
		
		if (node.cluster.getID() > level) {
			searchTree(node.left, level);
			searchTree(node.right, level);
		}
		else if (node.cluster.getID() < level) {
			searchTree(node.right, level);
			searchTree(node.left, level);
		} 
		else {
			searchTree(node.left, level);
			searchTree(node.right, level);
		}
		
	}

но если у меня уже определена x-ось, а глубина дерева может быть разная, то как мне посчитать размер соединяющей линии и начальных x-ов? ведь если первый кластер в самой глубине справа, а следующий слева, то непонятно насколько они должны быть удалены друг от друга..

Sonsee
() автор топика
Ответ на: комментарий от Sonsee

в 2 прохода по дереву... Ну это если в лоб :)

А еще, можно нарисовать не в экран, а в виртуальную сцену, а потом отскейлить виртуальную сцену на реальное разрешение.

А еще можно начать с конца рисовать :) Но это геморняк и не оправдано для такой простой задачки.

Jetty ★★★★★
()
Ответ на: комментарий от Jetty

А еще можно начать с конца рисовать :) Но это геморняк и не оправдано для такой простой задачки.

я забыл сказать, есть несколько алгоритмов группирования кластеров, и нужно отрисовывать именно в такой последовательности, как они группировались. Но с последовательностью нет проблем, т.к. ID оно и есть.

и рисовать надо сразу туда, без всяких доп. классов.

Sonsee
() автор топика
Ответ на: комментарий от Sonsee

Если у тебя проблема именно в том что «любое дерево» должно поместиться в (условно) 800х600, то без двух проходов(для вычисления «граф» составляющей и отрисовки) или же без «буфера» у тебя ничего не выйдет :)

Jetty ★★★★★
()
Ответ на: комментарий от Sonsee

Второй - отрисовка, собственно линии рисовать. Первый - (навскидку) какое количество элементов «в высоту», соответственно тут ты получишь возможную высоту вертикальной стороны. Точно так же для горизонтальных параметров..... что-то типа

ВысотаВертГрани = ((РазрешениеПоY-ПоляПоY)/КоличествоЭлементовПоY)*КосмическийКоэфПоY

Jetty ★★★★★
()
Ответ на: комментарий от Jetty

Если так прикинуть то каждый элемент дерева должен обладать лишь одной парой кординат.

Jetty ★★★★★
()
Ответ на: комментарий от Jetty

ничо ни понял.

высота (всех кластеров) равна double высоте верхнего кластера. Т.е. это и есть «высота глубины дерева». А кластер ниже уже имеет «свою» высоту от самого низа.

Смотри, вырхний кластер id = 3, высота 2.5 (высота от самого низа), но начинается его вертик. линия от правого кластера стоящего ниже id = 2, высота 2.2, соот-но высота правой ветикальной линии будет 2.5 - 2.2 = 0.3.

Мне не понятно, как посчитать начальные х-ы.

Sonsee
() автор топика
Ответ на: комментарий от note173

y на рисунке - вертикальная координата?

ну это другой чувак рисовал вот так перевернуто, я хочу нормально рисовать. Т.е. поверни в право на 90 градусов.

Sonsee
() автор топика
Ответ на: комментарий от note173

последовательность вычисляется походу. Может справа налево, может сначала самую правую ветку, потом самую левую, потом какую-нить среднюю.

id отражает последовательность.

Sonsee
() автор топика
Ответ на: комментарий от Sonsee

Берем ширину, делим на число элементов - получаем расст. между элементами. Поряжок отрисовки типа задан, т.е. х-ы мы уже знаем.

Считаем макс длину от корня до листа, получаем шаг по у. Какие проблемы?

AIv ★★★★★
()
Ответ на: комментарий от AIv

да до меня уже тоже доехало. Надо было всего лишь глянуть на свой скрин.

Осталось только по-человечески сделать отрисовку «верхних» кластеров (который объединяет >5). Ведь я ж не буду в массиве хранить все данный прошлых «рисунков» :)

нужен какой-то хитрый метод, хмм..

Sonsee
() автор топика
Ответ на: комментарий от AIv

попробую объяснить на пальцах:

представим 10 объектов в ряд (как на скрине, только без соединений) с соот-им id 1-10. Дерево отражает соединения всех 10 и порядок отрисовки.

Скажем,
первый шаг соединить л.2 и п.3 (представили прямоугольник над ними),
второй шаг объединяет л.7 и п.10 (...),
третий шаг объединяет пары л.2,3 и п.7,10,
четвертый шаг объединяет л.8 и п.9,
пятый шаг объединяет л.(2,3,7,10) и п.(8,9).
и т.д.

Это например! алгоритмов несколько.

так понятно зачем? т.е. элементы могут «перемещаться по оси х» и не сохраняют порядок 1, 2, 3, 4, 5 и т.д.

Sonsee
() автор топика
Ответ на: комментарий от yoghurt

вот почему ответ КО в одно слово в итоге оказался самым полезным?

Sonsee
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.