crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Отображение и заполнение вектора точек траектории
AD
  опции профиля:
сообщение 20.3.2009, 17:45
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Может быть сможете помочь. Идея такая:
Есть этап полета. Каждая точка полета имеет название этапа полета к которому относится.
При заполнении вектора точек идет проверка на то, принадлежит ли эта точка заданному этапу и включен ли этот этап для отображения. Если да - то точка вносится в вектор.
А потом с помощью функции отображения полигона(вектора точек) рисуется. Проблема в том, что нельзя заставить полигон отрисовываться с разрывами. Рисовать не полигоном, а линиями - нельзя, т.к. в некоторых логах, происходит сбой отрисовки (указатель становится на адрес 0x0ff00ff или подобный) и программма валится.
Вот код. Как его подредактировать так, чтобы можно было рисовать разрывы?
/// Проверка на существование текущего этапа полетов в точке point в списке этапов полета 
bool VerticalGraphics::isExistPhase(const SpecPointF& point)
{
    bool isPhase = false;
    foreach(TREEPHASE* elem, treePhaseList)
        if(elem == 0) break;
        else if(elem -> listNames.indexOf(point.name_file) != -1 && elem -> phase == point.phase)
        {
            isPhase = true;
            break;
        }
    return isPhase;
}

/// Рисование графика проекции
void VerticalGraphics::drawCurves(QPainter* painter)
{
    if(!vertic_param && !rect().isValid()) return;

    QString y_dimension(vertic_param -> y_dim[true].toLower());
    double y_dim = (metric_map[y_dimension]) ? metric_map[y_dimension] : 1.0;
    QString x_dimension(vertic_param -> dimension[true].toLower());
    double x_dim = (metric_map[x_dimension]) ? metric_map[x_dimension] : 1.0;
    QString color = vertic_param -> param_color.name();
    QPen oldPen = painter -> pen();
    QPen myPen(color);        myPen.setWidth(2);
    painter -> setPen(myPen);

    QPolygonF polyline(0);
    for(register int j=0; j<vec_data.size() && j<param_vec.size(); ++j)
    {
        double x;
        if(x_dimension == "km" || x_dimension == "min")
            x = vec_data[j].x();    ///< по оси x - уже было сделано умножение на величину размерности
        else x = vec_data[j].x() * x_dim;
        double y = vec_data[j].y() * y_dim;
        SpecPointF pnt(initXY(x, y));
        if(isExistPhase(vec_data[j]))
        {
            if(!polyline.isEmpty())
            { if(pnt.x() > polyline.last().x()) polyline.append(pnt); }
            else polyline.append(pnt);
            drawEvent(painter, pnt, param_vec[j]);
        }
    }

    painter -> drawPolyline(polyline);
    painter -> setPen(oldPen);
}


Сможете помочь придумать алгоритм отрисовки более удачный?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 21.3.2009, 8:23
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


Цитата(AD @ 20.3.2009, 17:45) *
а линиями - нельзя, т.к. в некоторых логах, происходит сбой отрисовки (указатель становится на адрес 0x0ff00ff или подобный) и программма валится.

как то не совсем ясно как так получается. сбоев не должно быть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 24.3.2009, 9:30
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Я бы сначала рассчитывал множество непрерывных ломанных (QVector<QPoligonF>), а потом отрисовывал их скопом.
Ни или собрал бы их всех в QPath и отрисовал его.
Но тут нужно смотреть и тестить, что будет быстрее. Думаю простой цикл, т.к. QPath - довольно сложная штуковина. :)

Насчёт "сбоя отрисовки" - это твоя личная ошибка, как мне кажется. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 24.3.2009, 9:32
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Tonal @ 24.3.2009, 9:30) *
Я бы сначала рассчитывал множество непрерывных ломанных (QVector<QPoligonF>), а потом отрисовывал их скопом.
Ни или собрал бы их всех в QPath и отрисовал его.
Но тут нужно смотреть и тестить, что будет быстрее. Думаю простой цикл, т.к. QPath - довольно сложная штуковина. :)

Насчёт "сбоя отрисовки" - это твоя личная ошибка, как мне кажется. :)

Я даже знаю, из-за чего происходит сбой отрисовки. Опять же, из-за паралелльной работы, а для заполнения вектора вертикальной проекции я опять же использую многострадальный вектор log!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 16:05