Долгая работа с sin и cos
- Войдите на сайт для отправки комментариев
Пнд, 12/01/2015 - 20:57
Я пользуюсь экраном Nokia 5110. Я хочу создать программу-часы, чтобы на экран выводились аналоговые часы. Но при использовании sin и cos программа немного времени омень помалу поработает, и потом зависнет(всегда на том же месте). Как решить проблему?
float жутко тяжелая операуия для МК, а sin/cos это целая серия вычислений с float
зависает скорее всего потому, что памяти не хватает, но это пока только предположение ибо информации мало
ищите целочисленные алгоритмы рисования, их в свое время много было, когда компьютеры были маленькие и медленные даже на них синусы и косинусы пытались оптимизировать
Есть сторонние математические библиотеки где синус и косинус вычисляются таблично а на их основе уже другие тригонометрические ф-ии. Скорость вычислений увеличивается многократно, правда ценой расхода памяти.
Именно таблично надо делать. И хранить в нем целые константы произведения радиуса, ну длину стрелки, на синус для первых 15 минут. Дальше вдохновится формулами приведения и пересчитать их в остальные 45 значений и заодно и косинусы получить. В итоге 15 констант, немного математического шаманства, максимум скорости при минимуме памяти и без левых либ.
А зачем, позвольте спросить, вам тригонометрия, если можно хранить просто матрицы координат? Циферблат всегда из 60 делений состоит...
Можете это по-подробнее обьяснить мне?
Можете это по-подробнее обьяснить мне?
у вас матрица экрана всего-то 48x84 точек. допустим вы хотите нарисовать окружность циферблата. для отрисовки дуги 1/4 экрана нужны координаты с десяток точек, остальное отображается симметрично.
прикол в том, что есть библиотеки, в которых уже есть функции, рисующие отрезки, окружности и многие другие примитивы на этом дисплее, причем достаточно экономично по расходу памяти- например adafruit, u8glib - вы изобретаете лисапет.
Я же и использую adafruit!
там есть рисование линий? Расчитайте на компьютере 15 точек на вашей окружность и сохраните их в памяти только храните во FLASH
на ходу можете легко пересчитать 15 точек (например левый верхний сегмент циферблата, первые 15 секунд) в 60 используя зеркалирование по X и Y
дальше имея 60 точек на окружности можете рисовать стрелку имея точку центра и нужную точку на окружности используя библиотечную функцию рисования линии по двум точкам
Вопрос на засыпку, что лучше, считать каждую секунду одно и то же, либо посчитать заранее и использовать таблицу заранее рассчитанных на большом компе данных? Ну да, конечно лучше заранее соломки подстелить.
С Новым старым годом :)
Сейчас в одном из проектов использую дисплей nokia 5110 и тоже использую библиотеку от adafruit...и такая же фигня - после некоторого времени работы снижается скорость обработки и бывает выдаёт ошибку в com порт. Может конечно дело не в этом, но без этого дисплея раньше было всё хорошо. Сейчас переделал программу на u8glib... буду тестировать....отпишусь
u8glib...вроде как,действительно с этой библой траблов нет)
u8glib качественная штука, вот только надо готовиться к тому, что она очень прожорлива к памяти флэш, особенно если увлечься разными фонтами