Помогите с кодом

Тема в разделе "Arduino & Shields", создана пользователем alexzlo, 19 окт 2016.

  1. alexzlo

    alexzlo Нерд

    Делаю меню для ардуинки + tft . Меню выглядит как 3Х3 кнопки, расчет размеров кнопок и позиционирование кнопок расчитывается автоматически в зависимости от размеров экрана. Теперь нужно так же динамически определить области касания на экран, что бы определить какой кнопки коснулись.
    В начале программы объявляю переменную

    int points;

    В setup у меня вызывается функция, которая отрисовывает блоки(кнопки). В ней есть цикл

    Код (C++):
    for(int i=0; i<countbutton;i++){
    Тут идет отрисовка ккнопок fillRoundedRect по x1,y1,x2,y2
    //Далее этии данные нужно записать в массив
    points[] = {int x1,int y1,int x2,int y2};
    }
    Потом этот массив points нужно в loop разобрать и в цикле определять какой кнопки коснулись. Но я не могу разобрать этот массив. Пишет ошибки.

    В функции loop
    Код (C++):
    for(int k=0;k<points.length(),k++){
        int x1 = points[k][0];
        int y1 = points[k][1];
        int x2 = points[k][2];
        int y2 = points[k][3];
    }
    Чую что страдает синтаксис и я делаю все не так =(
     
  2. rkit

    rkit Гуру

    Тут точку с запятой.

    Такого нет. Размер массива проще всего хранить в переменной.


    А еще если какие-то ошибки, то их надо тоже выкладывать.
     
  3. fogary

    fogary Гик

    Переменную points Вы объявляет как целочисленную, инициализируете как одномерный массив, а обращаетесь как двумерному массиву. Это у Вас реально так в коде?

    Удобнее будет определить структуру, описывающую координаты кнопки, и объявить переменную массив таких структур.
     
  4. alexzlo

    alexzlo Нерд

    Объявлять массив так? int points = {};
    Как объявить и инициализировать двумерный массив? Если я не знаю его размеров.

    Сорри. Спешил.
    Вообще пример писал на память, так как рядом нет ардуины .
     
  5. rkit

    rkit Гуру

    Код (C++):
    // объвляем
    int* array;

    // когда становится ясно с размером - выделяем память
    array = malloc(sizeof(int) * size_x * size_y);
    А вообще надо почитать, что такое массивы в C и C++, иначе ничего не выйдет.
     
  6. alexzlo

    alexzlo Нерд

    то есть в моем случае, если массив собирается в цикле то
    Код (C++):
    for(){
    array[] = malloc(sizeof(int) * size_x * size_y);
    }
    так? а где запятые между значениями массива?
     
  7. rkit

    rkit Гуру

    Нет. Именно так, как я написал. Еще раз говорю: без понимания принципов будет непонятная магия.
     
  8. alexzlo

    alexzlo Нерд

    size_x, size_y это что за переменные?
     
  9. rkit

    rkit Гуру

    Размеры массива
     
  10. fogary

    fogary Гик

    Объявлять так (для 9 значений):
    Код (C++):
    int points[9];
    Объявить и инициализировать двумерный массив:
    Код (C++):
    int points[3][3] = {
      {1, 2, 3},
      {1, 2, 3},
      {1, 2, 3}
    };
    Про размер не совсем понятно, Вы же писали:
    т. е. размер массива для 9 кнопок не знаете, или вопрос был "вообще"?
     
  11. alexzlo

    alexzlo Нерд

    Я пришел из php там с массивами все проще. Поэтому не серчайте.
    У меня на экране 9 кнопок
    [​IMG]

    Что бы отрисовать одну надо знать 4 (x1,y1,x2,y2) точки. Эти 4 точки вычисляются в зависимости от разрешения экрана.

    Мне нужно в массив сохранить 4 точки каждой из 9 кнопок. И потом этот массив разобрать в цикле и понять на какую кнопку я нажал.

    Кнопки отрисовываются один раз в Setup()
     
  12. ostrov

    ostrov Гуру

    В processing так же делаю. А есть способ проще?
     
  13. Tomasina

    Tomasina Сушитель лампочек Модератор

    элементарная математика, сэры ;)

    const unsigned int W
    - ширина экрана
    const unsigned int H - высота экрана
    const byte n - количество кнопок в строке или ряду
    const byte sb - расстояние между кнопками
    const byte ss - отступ от края экрана до кнопки

    Ширина кнопки unsigned int Bw = (W - ss*2 - sb*(n-1)) / n
    Высота кнопки unsigned int Bh = (W - ss*2 - sb*(n-1)) / n

    Если система координат идет с правого верхнего угла, то координаты кнопки 1 будут:
    x1 = 0 + ss, y1 = 0 + ss,
    x2 = x1 + Bw, y2 = y1 + Bh.

    По аналогии, для второй кнопки:
    x1 = 0 + ss + Bw + sb, y1 = 0 + ss + Bh + sb,
    x2 = x1 + Bw, y2 = y1 + Bh.

    А для определения нажатия смотрим в цикле попали ли в диапазон области кнопки:
    Код (C++):
    for (byte i = 0; i < n; i++)
    if (x > x1[i] && x < x2[i] && y > y1[i] && y < y2[i]) ...
     
    Последнее редактирование: 21 окт 2016
  14. alexzlo

    alexzlo Нерд

    да с математикой все понятно. это уже сделано. С массивами не понятно
     
  15. ostrov

    ostrov Гуру

    Делаю структуру кнопок в которой кроме координат есть всякое разное, цвет там, надписи и тд. Вывожу на экран в начале, дальше они меняются в зависимости от ситуации, например при нажатии. Для определения куда тыкнулась мышь приходится прогонять ее координаты по всем кнопкам на предмет вхождения в них. В принципе, работает хорошо, Но вот и думаю, может есть способ работы с областями в окне проще? Как в Visual Studio например?
     
  16. Tomasina

    Tomasina Сушитель лампочек Модератор

    ну можно закинуть сложное условие проверки в макрос, суть не изменится, а код читать проще.
     
  17. alexzlo

    alexzlo Нерд

    а с массивами то что?)) как координаты точек сохранить что бы потом цикле проверить на предмет вхождения
     
  18. Tomasina

    Tomasina Сушитель лампочек Модератор

    а зачем их сохранять? Пусть высчитывает в реальном времени, все равно проц 95% времени бьет баклуши.
    Формулы выше.
     
  19. ostrov

    ostrov Гуру

    Структура, она же массив из разнотипных данных. Можно просто массив, но ориентироваться в нем сложнее. При клике получаем координаты клика и перебором проверяем входят они в кнопку или нет, пока не найдем эту кнопку или они не закончатся (кликнули не в кнопку).
     
  20. alexzlo

    alexzlo Нерд

    У меня не бьет баклуши, А занимается отрисовыванием данных на tft с 9 датчиков одновременно и приемом этих данных через Serial, сами кнопки отрисовываются 1 раз при загрузке, поэтому и нужно знать в любой момент что бы небыло задержек в работе.