![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
volvo |
![]()
Сообщение
#21
|
Гость ![]() |
Написал код для визуализации на VCL (Билдер). Вот что получилось:
![]() (если взять чуть более широкую панель, то все будет прекрасно отображаться, здесь масштаб маловат, поэтому одно налезает на другое...) А теперь, собственно, КАК оно делалось: 1) в класс MyCluster введен еще один member под названием center, который хранит смещение от верха панели (фактически - координату Y кластера. Координата X нам не особенно нужна, есть srez). Ну, а потом, как только нашли очередной минимум: outCanvas->Pen->Color = clBlack;Это отрисует "дерево". А уж на перемещение TrackBar-а вешаем: void UpdateClusterList(int srez, std::vector<MyCluster>& vec, TMemo* memo) Вот и все, теперь список кластеров будет содержать только те элементы, поле sr которых не меньше текущей позиции ТрэкБара, что и нужно было. Останется только рисовать эту красную линию при движении бегунка, для наглядности... ![]() Сообщение отредактировано: volvo - 30.11.2009 1:46 |
Andrewshkovskii |
![]()
Сообщение
#22
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Привет!:)спасибо за огромную помощь..но я пошел немного другим путем.
Я так же ввел для каждого кластера его центр. Но вот соотношения значения ползунка и самого кластера на дендрограмме я пока не могу придумать как соотнести. Да и потом, почему-то криво рисует.Точнее теряет центр нек. кластеров. Вот как я сделал: QPointF Model::drawClamp(const QPointF &from, const QPointF &to)//рисуем скобу и в коде вот так :
setPos, соответственно, устанавливает центр. и для 5 значений получается такая белиберда: ![]() |
volvo |
![]()
Сообщение
#23
|
Гость ![]() |
Блин, у меня оказывается на скрине не было видно самой дендрограммы. Поправил... Теперь видно... Твой код завтра посмотрю, может чего и придумается...
|
Andrewshkovskii |
![]()
Сообщение
#24
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Ну я проект скину перед сном, если надо, посмотришь прям с возможностью компилирования.а пока сижу сам думаю..вроде чет наклевывается.
И я пока не настраивал ползунок, и не вывожу текущие кластера, сначала решил разобраться с дендрограммой... Нашел, вроде ошибку математическую с вычислением центра линии. visualResultModel->addLine(x1,y1,x2+space,y1); Чертит, но не понятно:) Есть проблема, когда линия одного кластера накладывается на другой..предвижу, что придется искать пересечения новой линии кластера с другой, и отодвигать кого-то...Ох уж это.. Проект вот тут http://webfile.ru/4122061 Ну кластера считаются в методе Model::calculateNewClustresModel, там же и рисуются (я выше рассказывал где ). Сообщение отредактировано: Andrewshkovskii - 30.11.2009 2:23 |
Гость |
![]()
Сообщение
#25
|
Гость ![]() |
В общем проблема такая...надо как-то зафиксировать количество тиков( это полосочки вертикальные под скроллбаром) и узнать, на сколько пикселей расстояние от одного тика до другого.
сейчас доделаю вывод кластеров, и выложу проектик доработанный, и буду дальше кумекать.. |
-Volvo- |
![]()
Сообщение
#26
|
Гость ![]() |
Цитата надо как-то зафиксировать количество тиков Что значит "как нибудь"? Устанавливаешь QSlider-у minimum в первый найденный алгоритмом минимум, maximum - в последний найденный минимум, тогда (maximum - minimum + 1) даст тебе количество тиков. Ширина контрола тебе тоже известна. Делишь одно на другое - получаешь pixels per tick. |
Andrewshkovskii |
![]()
Сообщение
#27
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Там надо минимум в 0 устанавливать, таково требование гуев от преподователя.
А если делать так, как ты говоришь, что количество тикой это max-min +1, т.е max+1 (если минимум в 0) то при некоторых варианта (когда максимум 20000 или 49000) то будет ужас, а не слайдер... |
volvo |
![]()
Сообщение
#28
|
Гость ![]() |
В таком случае у тебя нет другого варианта, кроме как считать, что Слайдер - это проценты, minimum = 0, maximum = 100, ширину слайдера ты знаешь, вычислить, какая ширина в пикселях у одного тика - не составит труда...
Но ![]() Есть еще один вариант: но он мне не совсем нравится (Показать/Скрыть)
|
Andrewshkovskii |
![]()
Сообщение
#29
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Была такая мысль у меня о фиксации каждого кластера , и потом, при щелчке по спин. эдиту проходить только определенные значения(то есть диапазон значений у спинЭдита будет диапазон срезов дендрограммы, и без конкретного шага, а при щелчке вверх - к след. разветвления, вниз - к предыдущему..) Я вот выбираю меж двух зол..
![]() |
Andrewshkovskii |
![]()
Сообщение
#30
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Перечитал методичку..в общем-то можно и вовсе без слайдера сделать. Т.е. можно остановиться на варианте с спинЭдитом. Только вот как учитывать значения, ведь они без определенного шага идут, в разнобой.
т.е это либо писать алгоритм "перешагивания" , либо наследоваться от слайдера и переопределять метод инкрименции/декрименции значений. |
Andrewshkovskii |
![]()
Сообщение
#31
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
В общем вот что вышло у меня. осталась одна проблема : расстояния, на которых строятся след. кластера, получаются не "настоящими".
Т.е. расстояния "скоб" должны быть связаны с значением кластера, а не фиксированной координатой. Сейчас получается так, что при переход к одному кластеру нормаль идет, а на следующем может линия отброситься назад, хотя кластер посчитан правильно, а все из-за фиксированного значения space и немного не правильного алгоритма построения...А вот как связать - пока не придумал.. Есть мысли какие-нибудь по этому поводу? :/ ![]() Алгоритм...
|
Andrewshkovskii |
![]()
Сообщение
#32
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
С этой проблема ещё связано с отрисовкой кластеров для последней закладки (где 2 среза всего 1 и 2)..Т.е. надо как-то в зависимости от длины среза рассчитывать расстояние и рисовать, что бы правдиво было..
Сообщение отредактировано: Andrewshkovskii - 1.12.2009 18:06 Прикрепленные файлы ![]() |
Andrewshkovskii |
![]()
Сообщение
#33
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
outCanvas->MoveTo(visLabelWidth + 30 + clusters[ii].sr, clusters[ii].center); Вот тут, ты отрисовываешь кластер?Я просто не понимаю, зачем MoveTo, да и у линии почему-то всего 2 координаты.. |
Andrewshkovskii |
![]()
Сообщение
#34
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Цитата procedure LineTo(X, Y: Integer); Проводит линию текущим пером из текущей точки в (X,Y). procedure MoveTo(X, Y: Integer); Перемещает текущее положение пера (свойство PenPos) в точку (X,Y). Понятно.. |
volvo |
![]()
Сообщение
#35
|
Гость ![]() |
![]() QPointF Model::drawClamp(const QPointF &from, const QPointF &to, long int cut) Результат: width = 114.25 с какого перепуга ширина изменилась с width = 114.25 на width = 220 где-то между срезом-94 и срезом-114? Почему ты сразу (как только получаешь максимальный срез) не устанавливаешь ширину поля отрисовки - скажем, через sceneRect - в максимальное значение, или чуть больше, чтоб оставалось место справа? Список ребер есть, достаточно при их инициализации (там, где addEdge) найти максимум, и максимально возможный срез тебе уже известен. Вот если это сделать, то можно будет использовать тот код, который я привел (возможно - с небольшими недоработками). |
Andrewshkovskii |
![]()
Сообщение
#36
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Изменяется она потому, что она при первичной отрисовки списка вершин устанавливается в зависимости от длины отображаемого текста, т.е она изначально, при создании не ресайзитсья нормально( правда я даже не понял как её нормально ресайзить, постоянно появлялись скроллбары..в общем я испытывал муки, пол недели потратил на то, что бы разобраться с соотношением координат view и сцены..так и толком не понял).
А далее, когда начинает рисоваться дендрограмма то она автоматически ресайзится под "длины("вроде) новых айтемов..вот так я это поведение понимаю. Ты предлагаешь устанавливать ширину поля для отрисовки в преобразованную каким-то образом размера макс. ребра? Сообщение отредактировано: Andrewshkovskii - 1.12.2009 22:52 |
volvo |
![]()
Сообщение
#37
|
Гость ![]() |
Угу... Именно:
// Это у тебя было ... А в методе drawClamp: QPointF Model::drawClamp(const QPointF &from, const QPointF &to, long int cut)Вот чего получается: ![]() Сколько не щелкал "вперед/назад" - ни разу не было сбоя, куда говоришь, туда и перескакивает, к следующему кластеру - только вперед, к предыдущему - только назад. Правда, иногда (когда срезы очень близко) Х-координаты совпадают, но это уже решается увеличением размера рабочей области, или добавлением прокрутки (сразу говорю, я с прокруткой не очень хорошо знаком, я бы советовал именно увеличить область, предназначенную для вывода дендрограммы. Возможно - за счет уменьшения ширины ячеек в "матрице измерений"). |
Andrewshkovskii |
![]()
Сообщение
#38
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
Ну макс. длина у меня вычисляется, это я предусмотрел.
Спасибо за такую огромную помощь, даже не знаю как и отблагодарить.Сейчас буду тестировать... Добавлено через 13 мин. Ну..я не знаю, какая у тебя версия qt, но когда я расширяю сцену, то у меня при больших значениях я вообще практически ничего не вижу..вот так вот : ![]() Значит, надо брать какой-то процент, либо делить на сотые части значение biggest_edge.. Добавлено через 8 мин. Ох..с вот с последней закладкой вообще цирк ![]() ![]() Исправил путем умножения cut и biggest_edge на 150 при условии, что они меньше 10.. Добавлено через 15 мин. нашел значения, при которых "уплывает" дендрограмма Цитата 7984 14946 24266 28933 2080 1080 920 873 607 буд думать как из резать, калечить, убивать.. ![]() |
volvo |
![]()
Сообщение
#39
|
Гость ![]() |
Цитата Ох..с вот с последней закладкой вообще цирк Ну, это вообще не проблема...Делаем в drawClamp() вот так: int starting = 120;, а описание biggest_edge переносим в класс Model, а не локально в этом методе. Тогда все закладки отображаются как положено. Я просто последнюю вообще не видел, она скрытная какая-то ![]() Цитата я не знаю, какая у тебя версия qt У меня 4.5.2, через QTCreator. Странно, значит я что-то не замечаю. Надо будет еще посмотреть потом, сейчас я уже мало что соображаю... |
Andrewshkovskii |
![]()
Сообщение
#40
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: ![]() ![]() ![]() |
хм..действительно..
Над не забыть только biggest_edge обнулять при переходе на другую МОД(Закладку, или меняя кол-во записей) В принципе осталось пофиксить 2 пункта : 1. Из-за того, что в последней закладке много одинаковых значений срезов текстовое отображение кластеров тупит (я в принципе придумал решение в виде того, что при каждом новом срезе к его значению будет плюсоваться i, которая в свою очередь изменяется на 1 в основном цикле кластеризации) 2. ну и из-за этого же криво отображаются кластеры для той же закладки. происходит это вот так : ![]() Ну есть мысль, что если изменять значение среза как-то по другому, для этой закладки, то удастся избавиться от этого. Ну и небольшой шрих, что бы при уменьшении количества вершин, они заполняли сцену вертикально-равномерно, а не только с левого верхнего угла .. |
![]() ![]() |
![]() |
Текстовая версия | 22.07.2025 7:09 |