Продвинутое программирование на AVR(Arduino)

PaulCocain

✩✩✩✩✩✩✩
17 Авг 2018
20
0
Нужна помощь в оптимизации различных расчетов с плавающей точкой на AVR. Преобразование типов, использование предрассчитанных таблиц для синусов\косинусов. Есть формула, которая считает положение точки на экране лсд экранчика 320х240 пикселей. но расчеты идут с плавающей точкой, и отрисовка происходит быстрее, чем происходит точный расчет самого положения. Либо мне так кажется, в любом случае оптимизации необходима, так как в планах рендерить сложные сцены. и лучше разобраться в оптимизации на простых примерах тригонометрии. прикрепляю несколько примеров построенных мной графиков.
ВИДЕО 1 SUPERSHAPES ВИДЕО 2 SUPERSPAHES






Кому интересно могу скинуть код, на каждый конкретный пример, рассказать какой использую дисплей как подключил и где купил.
 

PaulCocain

✩✩✩✩✩✩✩
17 Авг 2018
20
0
@Wan-Derer, я использую цикл от 0 до двух пи, и там всего ничего , а чтобы построилось точно я беру до одной сотой или даже тысячной в качестве инкремента. вот кусок кода: на первую картинку к примеру. это функция которая выполняет расчет точки и рисует всю фигуру.
void Spiral(int R){
float a;
float k = n/d;
for(a = 0.0;a<TWO_PI*d;a+=0.01){
float r = R*cos(k*a);
int x = r*cos(a);
int y = r*sin(a);
lcd.drawPixel(160 + x, 120 + y);
}
}
 
Изменено:

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,002
406
Москва
wan-derer.ru
@PaulCocain, если вместо пи взять 3 всё будет ужасно?
Если посчитать в целых, а потом нормализовать - не?
Непонятно чего ты хочешь. Если непременно использовать АВР, ищи эффективные алгоритмы. Если решать в лоб, возьми другой МК.
 

PaulCocain

✩✩✩✩✩✩✩
17 Авг 2018
20
0
@Wan-Derer, я спросил толкового программиста, он подкинул идею использовать предрассчитаные значения косинусов и синусов. я пока понятия не имею как это реализовать. вычисления по целочисленным значениям не дадут той картины, что требуется, вот пример :
C++:
void Spiral(int R){
  float a;
  float k = n/d;
  for(a = 0.0; a < TWO_PI*d; a+=0.01){
  float r = R*cos(k*a);
  int x = r*cos(a);
  int y = r*sin(a);
  lcd.drawPixel(160 + x, 120 + y);
  }
}


C++:
void Spiral(int R){
  int a;
  float k = n/d;
  for(a = 0; a < 6*d; a+=1){
  float r = R*cos(k*a);
  int x = r*cos(a);
  int y = r*sin(a);
  lcd.drawPixel(160 + x, 120 + y);
  }
}
 

Nick_SPb

★✩✩✩✩✩✩
1 Ноя 2018
55
12
@Wan-Derer, я спросил толкового программиста, он подкинул идею использовать предрассчитаные значения косинусов и синусов. я пока понятия не имею как это реализовать. вычисления по целочисленным значениям не дадут той картины, что требуется, вот пример :
C++:
void Spiral(int R){
  float a;
  float k = n/d;
  for(a = 0.0; a < TWO_PI*d; a+=0.01){
  float r = R*cos(k*a);
  int x = r*cos(a);
  int y = r*sin(a);
  lcd.drawPixel(160 + x, 120 + y);
  }
}


C++:
void Spiral(int R){
  int a;
  float k = n/d;
  for(a = 0; a < 6*d; a+=1){
  float r = R*cos(k*a);
  int x = r*cos(a);
  int y = r*sin(a);
  lcd.drawPixel(160 + x, 120 + y);
  }
}
привет, ну так тоже нельзя... @Wan-Derer тебе пишет что вычисление целочисленное, с последующей нормализацией ... а тут ты целочисленным типом обрубаешь всю дробную часть ... так и дырки в бублике не будет...)
 

KOHb

★✩✩✩✩✩✩
25 Окт 2018
119
16
Эмммм... А зачем для таких тяжелых вычислений вообще использовать ардуино?
Сколько знаков после запятой вы считаете приемлемым в принципе? Значение пи 3.14 вас, к примеру, устраивает? А то число пи немного больше и его значение так и не найдено.
Какая задача? Визуализировать график?
И что значит
отрисовка происходит быстрее, чем происходит точный расчет самого положения
Вы научили эвм предугадывать куда ставить точку не зная её реальной позиции?
Да и вообще, однопроцессорные эвм не умеют одновременно "рисовать точку" и считать. Одна процессорная инструкция за один такт кагбе.
По моему при задаче сделать шар, вы сделали куб(потому что умеете) и теперь собираетесь напихать в него столько костылей, чтоб он покатился...
 

PaulCocain

✩✩✩✩✩✩✩
17 Авг 2018
20
0
@Nick_SPb, согласен!, @KOHb, я имел ввиду, что расчет точки занимает дольше времени, чем вывод этой точки на экран. я хотел ускорить анимацию, сделать "отрисовку" быстрее не могу, а вычисления да. Теперь стало понятней?
 

KOHb

★✩✩✩✩✩✩
25 Окт 2018
119
16
@PaulCocain, операции в float просто пожиратели процпессорного времени на 8и разрядных контроллерах.
Я просто к тому, что любой смартфон справится с такими вычислениями гораздо лучше. Зачем ардуино-то использовать и устраивать пляски с функциями конвертирования чисел с плавающей точкой в целочисленные?
 

PaulCocain

✩✩✩✩✩✩✩
17 Авг 2018
20
0
@KOHb, потому что у меня есть экранчик под ардуино и некоторые знания в С,С++, я не программист и тем более не программист для андроид приложений, хотелось научиться прогать такого рода вещи, как визуализация расчетов
 

KOHb

★✩✩✩✩✩✩
25 Окт 2018
119
16
@PaulCocain,
хотелось научиться прогать такого рода вещи, как визуализация расчетов
ну так с этим ты справился же. Потом всё упёрлось в производительность восьмибитки.
Если вспомнить, как пример, игровую историю, то ни вектор ни просчёт 3Д в реальном времени висьмибитки не умели по тем же причинам.
А вообще, хочешь быстрой отрисовки, заноси координаты в массив и выводи уже оттуда.
 

pi1985

★✩✩✩✩✩✩
2 Ноя 2018
21
15
Есть ещё вариант использовать числа с фиксированной запятой. Выглядят как обычные целые числа. Например, есть переменная типа short, её разделяют условно на две части: старшая часть - целая, младшая - дробная. Или например, unsigned long можно разделить 3:1 или 2:2 или 1:3, всё зависит от нужной точности. Для работы с ними нужна лишь целочисленная арифметика, а вот вывод нужно делать самому.
 

PaulCocain

✩✩✩✩✩✩✩
17 Авг 2018
20
0
@pi1985, А как это загуглить? Или как программно это пишется? и поддерживает ли ардуино ide такую функцию, ну или Atmel
 

pi1985

★✩✩✩✩✩✩
2 Ноя 2018
21
15
Да очень просто. Даже в википедии есть Статья про них, и вот ещё статья на хабре с примерами.
По сути, это лишь другой способ интерпретировать целое число, поэтому любой процессор, который умеет считать целые числа, их поддерживает.
 
  • Лойс +1
Реакции: Nick_SPb