Просмотр полной версии : Какими методами грамотнее рисовать график функции?
Dukobpa3
28.12.2010, 05:58
Возникла потребность реализовать софтинку которая будет рисовать графики функций (для предмета математики в школе).
Когда-то писал такое на С++, там я это делал посредством moveTo(), lineTo() по канвасу - но помнится такая реализация изрядно вешала систему. В graphics тоже есть эти функции, но хочется услышать об альтернативах.
Я бы наверное в битмапдату попиксельно рисовал. Но конечно зависит от размеров, как часто меняется, требований к точности и т.д.
Zebestov
28.12.2010, 14:43
А я бы, ну если влоб, делал теми же moveTo() и lineTo(). Ну а если прямо сильно густой график — запекал бы все это в BitmapData с какой-то периодичностью. И единственное, чем этот ход выгоднее простого cacheAsBitmap, — это избавление от всех нарисованных ранее линий.
Dukobpa3
28.12.2010, 17:22
wvxvw, вот попиксельно хз, это ж куча итераций. Для каждого пикселя уравнение просчитывать надо будет.
Zebestov, ну на текущий момент я тоже примерно к этому склоняюсь. Ну а периодически пихать в битмапдату - в принципе идея.
//*******************
Ну как я для себя понимаю нужно что-то типа lineTo() - это даст возможность оперировать точностью, в отличии от точек. Плюс бонус к масштабированию. Насколько я понимаю линии нарисованные таким образом - векторные. Соответственно проще будет поменять масштаб если что(если не прав, поправьте).
Основной вопрос таков: есть ли что-то по типу lineTo() о чем я не знаю:) И если есть - то как его юзать.
Задача наверное будет в том - как правильно вычислить количество итераций (точность) на данном конкретном отрезке.
Например если это парабола - у нас ближе к центру должно быть много точек, а потом начиная с определенного момента тупо хвосты вверх под углом - в хвостах достаточно штук трех-пяти точек при любых раскладах.
//*********************
Начав заниматься флешом пару раз слышал что-то про кривые безье, до этого не сталкивался. Не до конца понимаю что это такое (вики читал), возможно как-то их сюда прикрутить?
Просто по статьям я как-то не понял сути практического применения этих кривых, но вроде как-то близко, что-ли.
Zebestov
28.12.2010, 17:32
Если предполагается делать scale, то отрисовывать бессмысленно — тебе же понадобится векторный оригинал? Значит достаточно будет cacheAsBitmap. Это позволит разгрузить покадровую отрисовку, сохраняя при этом вектор на случай масштабирования.
А что до кривых безье (http://bezier.ru/) — как они могут пригодиться в построении графиков?
Dukobpa3
28.12.2010, 17:47
Ну на мысли про безье меня натолкнуло следующее сходство:
Есть метод построения графика функции "по контрольным точкам".
Данная кривая так же строится по контрольным точкам.
Посредством отрезка (lineTo()) я не смогу нарисовать адекватный график по контрольным точкам.
А посредством безье - вполне.
Только вот вопрос - насколько контрольные точки безье соответствуют контрольным точкам графика функции.
И опять же рисование по трем контрольным точкам - это рисование по трем точкам, вместо просчета каждого пикселя или каждого отрезка с заданной точностью.
как правильно вычислить количество итераций (точность) на данном конкретном отрезке.
Считаешь кривизну (http://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B8%D0%B2%D0%B8%D0%B7%D0%BD%D0%B0) кривой - плотность точек ей пропорциональна.
Нормальной кривой 2000 точек вполне хватит, при этом при зуме её вполне можно просто перерисовать, не используя никакие битмапы.
Ну и чтоб бороться с тормозами рисовалки линий надо для начала их получить.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.