Russian Qt Forum

Программирование => С/C++ => Тема начата: voodoo от Май 29, 2012, 01:10



Название: Не получается задать размер массиву
Отправлено: voodoo от Май 29, 2012, 01:10
Вообщем, суть проблемы. Есть массив точек m_points, объявленный как: QVector<QPoint> m_points;
Мне нужно создать массив такой же размерности как и m_points, но вместо этого ему постоянно присваивается значение 0. Помогите разобраться, уже и так, и сяк, и не работает хоть убей.
Код:
 void PointsToVector()
    {
        QString path;
        int vetka[6];
        qreal angle[6];
        int j = 0;
        m_vector ptv_vector[m_points.size()-1];
        QVectorIterator<QPoint> m_pointsiter(m_points);
        int i=0;
        QPoint begin,end;
        end = m_pointsiter.next();
        while(m_pointsiter.hasNext())
        {
            begin = end;
            end = m_pointsiter.next();
            ptv_vector[i].x1 = begin.x();
            ptv_vector[i].y1 = begin.y();
            ptv_vector[i].x2 = end.x();
            ptv_vector[i].y2 = end.y();
            i++;
        }
        for(int i=0; i<m_points.size(); i++) //узнаём рёбра которые выходят из точки
            if((qAbs(ptv_vector[i].x1 - m_startpoint.x()) < 5)
                && (qAbs(ptv_vector[i].y1 - m_startpoint.y()) < 5))
            {
                vetka[j] = i;
                j++;
            }
        //Узнаём наклоны рёбер
        for(int i=0; i<j; i++)
        {
            angle[i] = atan(qRound(qAbs(ptv_vector[vetka[i]].x1 - ptv_vector[vetka[i]].x2)
                            /qAbs(ptv_vector[vetka[i]].y1 - ptv_vector[vetka[i]].y2)));
        }
    }


Название: Re: Не получается задать размер массиву
Отправлено: kambala от Май 29, 2012, 01:36
Код
C++ (Qt)
m_vector ptv_vector[m_points.size()-1];
полагаю это и есть проблемная строчка.
Код
C++ (Qt)
QPoint *ptv_vector = new QPoint[m_points.size()];
...
delete [] ptv_vector;
изучать C++ надо прежде всего.


Название: Re: Не получается задать размер массиву
Отправлено: sidsukana от Май 29, 2012, 06:09
Код
C++ (Qt)
m_vector ptv_vector[m_points.size()-1];
полагаю это и есть проблемная строчка.
Код
C++ (Qt)
QPoint *ptv_vector = new QPoint[m_points.size()];
...
delete [] ptv_vector;
изучать C++ надо прежде всего.

Для STL контейнеров существует resize(size);


Название: Re: Не получается задать размер массиву
Отправлено: voodoo от Май 29, 2012, 09:08
Тьфу, забыл добавить что массив объявляется как структура:
 
Код:
struct m_vector
    {
       int x1,y1,x2,y2;
       //bool checked;
    };
    QPoint m_st
kambala, я делал раньше так как вы описали, выделял память, но увы - опять таки ошибка.


Название: Re: Не получается задать размер массиву
Отправлено: Igors от Май 29, 2012, 09:23
Там много чего неправильно, вдаваться в критику - пустая трата времени. Скажите что Вам нужно, как я понял найти все наклоны - углы ребер исходящих из m_startpoint в точки на расстоянии не более (5, 5) ?


Название: Re: Не получается задать размер массиву
Отправлено: voodoo от Май 29, 2012, 09:32
Вообщем, это дипломная работа - рисуешь граф, задаёшь точку для распознавания и погнал.
На данный момент надо: указал точку, определить какие рёбра выходят из этой точки и определить их угол наклона.

Вообщем, вот проект: http://rghost.ru/38346884, правда нужен Qt Creator.

По возможности - напишите свою критику, что где не так. Заранее спасибо.


Название: Re: Не получается задать размер массиву
Отправлено: Igors от Май 29, 2012, 10:24
Вообщем, это дипломная работа - рисуешь граф, задаёшь точку для распознавания и погнал.
На данный момент надо: указал точку, определить какие рёбра выходят из этой точки и определить их угол наклона.

Вообщем, вот проект: http://rghost.ru/38346884, правда нужен Qt Creator.

По возможности - напишите свою критику, что где не так. Заранее спасибо.
Хмм... ну давайте все-таки ограничимся тем что нужно на данный момент  :)
 Вот набросок

Код
C++ (Qt)
 
const float PI = 3.141519f;
const float PI2 = PI * 2;
 
struct CEdge {
СEdge( int index0 = -1, int index1 = -1, float angle = 0.0f )
{
  mIndex[0] = index0;
  mIndex[1] = index1;
  mAngle = angle;
}
 
int mIndex[2];    // индексы вершин
float mAngle;   // угол в радианах
};
 
void FindEdges( const QVector <QPoint> & src,  // вектор всех вершин
                      int baseIndex,                // индекс вершины для которой ищем ребра
                      int deltaX, int deltaY,        // макс размеры ребра (5)
                      QVector <CEqge> & dst )  // выходной вектор ребер
{
const QPoint & base = src[baseIndex];
for (int i = 0; i < src.size(); ++i) {
 if (i == baseIndex) continue;
 QPoint delta = src[i] - base;
 if (qAbs(delta.x()) > deltaX) continue;
 if (qAbs(delta.y()) > deltaY) continue;
 float angle = atan2(float(delta.y()), delta.x());
 if (angle < 0.0f) angle += PI2;
 dst.push_back(CEdge(baseIndex, i, angle));
}
}
 


Название: Re: Не получается задать размер массиву
Отправлено: voodoo от Май 29, 2012, 11:14
Спасибо за пример, но хотелось бы реализовать так - как я вижу это в своём проекте. Так проще для понимания, я только начинаю)
Так почему же ptv_vector не создаётся размерности m_points.size()?


Название: Re: Не получается задать размер массиву
Отправлено: Igors от Май 29, 2012, 12:08
Спасибо за пример, но хотелось бы реализовать так - как я вижу это в своём проекте. Так проще для понимания, я только начинаю)
Это вполне нормально/понятно - ведь что-то уже написано и оно "почти работает"  :)
Нужно только чуть-чуть доделать - и все. Однако это чуть-чуть оказывается очень и очень долгим.

Граф, ребра - все это вещи хорошо известные, так зачем изобретать велосипед (в данном случае очень паршивый)? Храните ребра как делают все - индексы 2 вершин (которые это ребро соединяет). Плюс доп данные (в данном случае угол). Если Вы только начинаете - не лезьте в глупые итераторы, обходитесь циклом for. Если Вы замечаете что получается длинное/неудобное выражение - делайте метод (таких маленьких методов обычно много у класса "ребро"). Объявляя массив думайте точно ли он нужен и точно ли этой размерности. А пока все Ваши массивы - источники ошибок, которые Вы будете искать очень долго.



Название: Re: Не получается задать размер массиву
Отправлено: voodoo от Май 29, 2012, 12:19
Ладно, допустим вместо координат - будут индексы, так ещё проще выйдет. Но мне хоть убей нужно объявить массив, размерность которого я знаю  :-\


Название: Re: Не получается задать размер массиву
Отправлено: Igors от Май 29, 2012, 12:29
Ладно, допустим вместо координат - будут индексы, так ещё проще выйдет. Но мне хоть убей нужно объявить массив, размерность которого я знаю  :-\
Создайте новый проект, в нем объявите структуру m_vector и выделите массив как указал kambala. Сообщите результат


Название: Re: Не получается задать размер массиву
Отправлено: voodoo от Май 29, 2012, 14:00
Код
C++ (Qt)
private:
   struct a
   {
       int begin,end;
   };
   QVector<QPoint> m_points;
 
public slots:
   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()];
   }
 
(http://storage7.static.itmages.ru/i/12/0529/h_1338289228_5141188_5160539e8b.png)
Снова печаль  :-\


Название: Re: Не получается задать размер массиву
Отправлено: Пантер от Май 29, 2012, 14:04
И в чем печаль?


Название: Re: Не получается задать размер массиву
Отправлено: mutineer от Май 29, 2012, 14:09
Снова печаль  :-\

Какая еще печаль? все нормально создалось же


Название: Re: Не получается задать размер массиву
Отправлено: kambala от Май 29, 2012, 14:11
массив надо ещё заполнить нужными элементами - из воздуха они не появятся


Название: Re: Не получается задать размер массиву
Отправлено: voodoo от Май 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;
       }
   }
 
(http://storage7.static.itmages.ru/i/12/0529/h_1338292325_2552036_7746f1f420.png)
И заполняется как я понял только одна ячейка.


Название: Re: Не получается задать размер массиву
Отправлено: Igors от Май 29, 2012, 15:00
А отладчик и не обязан показывать все элементы массива выделенного динамически. Напр у меня Xcode тоже показывает только первый элемент. Напоминает анекдот "трусы линяют"  :)


Название: Re: Не получается задать размер массиву
Отправлено: kambala от Май 29, 2012, 15:02
дебаггер - это конечно здорово, но выводить значения можно и с помощью cout/qDebug(). а чтоб наверняка, то инициализируй поля структуры в зависимости от i.

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


Название: Re: Не получается задать размер массиву
Отправлено: voodoo от Июнь 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];
        }
(http://storage7.static.itmages.ru/i/12/0603/h_1338686170_2079954_47f1100010.png)
Начальная точка: (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

В чём может быть проблема?


Название: Re: Не получается задать размер массиву
Отправлено: Igors от Июнь 03, 2012, 10:24
qAbs неправильно. Ф-ция atan2 сама разбирается со знаками и возвращает угол от -PI до PI, положительный угол отсчитывается против часовой стрелки. Пример

(170,251) (150,286)  // вектор из begin в end
atan2(35, -20) = 2.08  // примерно 119.7 градусов, как Вы насчитали 60 ?


Название: Re: Не получается задать размер массиву
Отправлено: voodoo от Июнь 03, 2012, 13:17
Да вот тоже понять не могу, по картинке должно быть 60, а выходит совсем по другому.


Название: Re: Не получается задать размер массиву
Отправлено: kambala от Июнь 03, 2012, 13:38
смежный угол как раз равен ~120 градусам, так что можно просто делать "180 - результат"


Название: Re: Не получается задать размер массиву
Отправлено: Igors от Июнь 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) должно быть всегда слева