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);
}


Сможете помочь придумать алгоритм отрисовки более удачный?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 22.12.2024, 17:57