Russian Qt Forum
Ноябрь 23, 2024, 17:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Не получается задать размер массиву  (Прочитано 10951 раз)
voodoo
Гость
« Ответ #15 : Май 29, 2012, 14:52 »

Печаль в том что размер m_points сумасшедший.
Код
C++ (Qt)
void test()
   {
       m_points.append(QPoint(10,10));
       m_points.append(QPoint(10,10));
       m_points.append(QPoint(10,10));
       a *massive = new a[m_points.size()];
       for(int i=0; i<m_points.size(); i++)
       {
           massive[i].begin = 1;
           massive[i].end = 2;
       }
   }
 

И заполняется как я понял только одна ячейка.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Май 29, 2012, 15:00 »

А отладчик и не обязан показывать все элементы массива выделенного динамически. Напр у меня Xcode тоже показывает только первый элемент. Напоминает анекдот "трусы линяют"  Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #17 : Май 29, 2012, 15:02 »

дебаггер - это конечно здорово, но выводить значения можно и с помощью cout/qDebug(). а чтоб наверняка, то инициализируй поля структуры в зависимости от i.

если размер m_points очень большой, то может имеет смысл отказаться от контейнера и хранить точки сразу в обычном массиве, раз нужно в него преобразовывать?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
voodoo
Гость
« Ответ #18 : Июнь 03, 2012, 04:22 »

Вообщем, вышло всё как хотел, но теперь другая проблема - криво вычисляет углы наклона.
Код:
for(int i=0; i<j; i++)
        {
            float deltaX = qAbs(ptv_vector[vetka[i]].end.x() - ptv_vector[vetka[i]].begin.x());
            float deltaY = qAbs(ptv_vector[vetka[i]].end.y() - ptv_vector[vetka[i]].begin.y());
            float rads = atan2(float(deltaY),deltaX);
            if(rads<0)
               rads += PI2;
            angle[i] = rads;
            qDebug() << QString("rebro") << angle[i];
        }

Начальная точка: (150,286) 
Рёбра:
(170,251) (150,286) 60
(150,286) (190,286) 0
(170,321) (150,286) 300
(150,286) (110,286) 0

Но отображает совсем другие радианы:
"rebro" 2.08994
"rebro" 0
"rebro" 4.1931
"rebro" 3.14159

В чём может быть проблема?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Июнь 03, 2012, 10:24 »

qAbs неправильно. Ф-ция atan2 сама разбирается со знаками и возвращает угол от -PI до PI, положительный угол отсчитывается против часовой стрелки. Пример

(170,251) (150,286)  // вектор из begin в end
atan2(35, -20) = 2.08  // примерно 119.7 градусов, как Вы насчитали 60 ?
« Последнее редактирование: Июнь 03, 2012, 10:27 от Igors » Записан
voodoo
Гость
« Ответ #20 : Июнь 03, 2012, 13:17 »

Да вот тоже понять не могу, по картинке должно быть 60, а выходит совсем по другому.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #21 : Июнь 03, 2012, 13:38 »

смежный угол как раз равен ~120 градусам, так что можно просто делать "180 - результат"
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #22 : Июнь 03, 2012, 15:37 »

Да вот тоже понять не могу, по картинке должно быть 60, а выходит совсем по другому.
Выходит правильно, просто в экранных координатах Y идет вниз, а в мировых вверх. Поэтому если хотите соответствия рисунку - берите Y с минусом
Код
C++ (Qt)
float rads = atan2(float(-deltaY),deltaX);
 
Ну и конечно базовая точка всегда должна быть первой (отнимаемой). А у Вас то так, то сяк
Рёбра:
(170,251) (150,286) 60
(150,286) (190,286) 0
(170,321) (150,286) 300
(150,286) (110,286) 0
(150,286) должно быть всегда слева
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.129 секунд. Запросов: 23.