UTFT - возможный косяк drawLine?
- Войдите на сайт для отправки комментариев
Короче: долгое время пользую UTFT, и вроде как особо нареканий никаких не было, до сегодняшнего дня. Пишу сюда, чтобы поспрошать - может, кто сталкивался с таким же поведением, а то у мну ощущение, что лыжи просто не едут.
Итак: создаём массив из 199 записей, по этому массиву по простому алгоритму рассчитываются координаты точек для отрисовки графика, используя вызовы drawLine. Рассчитываем точки, рисуем - всё зашибись.
Добавляем в массив ещё одну запись, чтобы было 200. Масштаб графика при этом мельчает до такого состояния, что в просчитанных вызовах drawLine попадаются уже коротенькие горизонтальные или вертикальные линии длиной буквально в один пиксель (вопросы оптимизации отрисовки пока не рассматриваем).
И... UTFT натурально рвёт крышу: график из 200 линий она рисует отрывками, при этом после отрисовки, если спустя пару секунд сделать заливку экрана - авотхер, на экране остаётся рванина. Если повторно вызвать отрисовку с этими же точками - эта тварь отрисовывает нормально, и заливка экрана через пару секунд тоже отрабатывает. И так - как по писаному: КАЖДЫЙ второй вызов отрисовывает нормально, нечётные вызовы - рванина и неотрабатывание fillScr, print и т.д., до нового вызова отрисовки массива с точками по ровно тем же координатам.
Что самое интересное - если тупо заменить drawLine на fillRect (параметры вызова те же, чтобы быстро проверить методом исключения, короче) - то эта дрянь глючить перестаёт.
Может, кто сталкивался с подобным, и в где-то в кишочках drawLine есть косяк? Других объяснений я пока не нахожу, от слова "совсем", т.к. глючит только отрисовка, и именно при переходе какой-то границы масштаба.
Быстро выкусить из рабочего проекта тестовый пример я не могу, да и не уверен, что нет зависимостей ещё и с контроллером дисплея, но математические вводные крайне просты:
1. Поле отрисовки: 150х100 (X,Y);
2. Исходный список: 200 записей, вида 0,1,3,6,10,... (т.е. интервалы между соседними записями - увеличиваются на единицу);
3. Максимальный интервал между двумя записями - это 0% по оси Y, минимальный - 100% по оси Y (от стартовой координаты Y-оси на экране, ессно);
4. N интервалов между записями надо растащить при отрисовке на M точек по X.
Т.е. набор операций, по сути, тривиален: ищем максимальный интервал в списке, от него рассчитываем текущую координату по Y, координату по X при каждой итерации смещаем на нужный шаг (возможно дробный, просто округляем до целого после расчётов). Ну и рисуем линии по уже рассчитанным координатам, от первой координаты - до второй, от второй - до третьей и т.д.
Такие дела, други. Всё, что меньше 200 - рисуется без вопросов, и чётное кол-во, и нечётное. Всё, что больше 199 - косяк. Оперативки - вагон, дело точно не в ней (не займут 200 точек 30 килобайт, как ни старайся).
Короче - а вдруг кто с таким сталкивался? По предварительным признакам - уж очень похоже на косяк в UTFT. Но не факт, конечно, всякое бывает (однако замена на fillRect какбэ уже намекает, что в той консерватории какая-то скрипка может и лажать).
Всем бобра. И буду признателен, если кто подтвердит, что лыжи - едущие не всегда, и косяк таки не на мне :)
Решено: UTFT сносит крышу, когда вызываешь отрисовку линии с одинаковыми начальными и конечными координатами, например:
Будем бдительнее теперь :)
Решено: UTFT сносит крышу, когда вызываешь отрисовку линии с одинаковыми начальными и конечными координатами
наверно там в коде где-то есть деление на длину отрезка...
Решено: UTFT сносит крышу, когда вызываешь отрисовку линии с одинаковыми начальными и конечными координатами
наверно там в коде где-то есть деление на длину отрезка...
Да хз, сходу не находится. Выяснил эмпирическим путём только, первое условие в drawLine такое:
Идём в drawHLine, по вводным, очевидно, x2-x1 == 0, т.к. мы вызываем с одинаковыми координатами, например, drawLine(50,100,50,100). В drawHLine такое (параметр l == 0):
Вроде как проблема либо в setXY, либо в _fast_fill_16, либо в _fast_fill_8. Дальше рыть пока лень :))