crossplatform.ru

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

> Грамотная отрисовка рельефа, что-то не получается
AD
  опции профиля:
сообщение 2.12.2008, 12:02
Сообщение #1


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

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

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




Репутация:   17  


Запутался, не знаю как решить следующую проблему. Необходимо под графиком, который уже нарисован нарисовать рельеф. Отрисовка рельефа должна происходить всего один раз. Т.е. при рисовании в методе paintEvent() естественно эта штуковина нещадно грузит систему. Делаю вызов этой функции в другом месте, но тогда вообще ничего не рисуется (возможно, потому что использую QPainter для получения цвета "кисти" и "карандаша"). Помогите, пожалуйста.
Код самого рисования правилен, вопрос в том, как заставить рисовать не вызывая данную функцию в paintEvent()?
/// Отрисовка рельефа
void ReliefGraphics::drawTrackRelief()
{
    for(QVector<QPointF>::iterator rlfPnt=relief_vec.begin(), i_prev=relief_vec.begin(); rlfPnt!=relief_vec.end();
        ++rlfPnt)
    {
        QPointF cur(*rlfPnt), prev(*i_prev);
        drawReliefNature(&painter, cur, prev);
        if(rlfPnt != relief_vec.begin()) ++i_prev;
    }
}

/// Настройка цвета рельефа (естественный цвет)
void ReliefGraphics::drawReliefNature(QPainter* painter, QPointF cur, QPointF prev)
{
    double distance = cur.x(), delta_height = cur.y();
    QPointF scrPnt(initXY(distance, delta_height));
    if(delta_height <= 0 || scrPnt.y() >= settings -> maxY)
        return;

    QColor color(demGetColor(demCalcColor(delta_height)));
    double delta_height0;
    int div = delta_height > 1000 ? 50 : 5;
    int i = (int)(delta_height / div);
    if(!((int)delta_height % div)) --i;
    delta_height0 = div * i;
    double prev_dist = prev.x(), prev_height = prev.y();
    QPointF screenPoint(initXY(distance, delta_height0)), scrPrev(initXY(prev_dist, prev_height));

    QBrush old_brush(painter -> brush());
    QPen old_pen(painter -> pen());
    painter -> setBrush(QBrush(color));
    painter -> setPen(QPen(color));
    painter -> drawLine(scrPrev, screenPoint);
    painter -> setPen(old_pen);
    painter -> setBrush(old_brush);
    QPointF cur0(distance, delta_height0);
    drawReliefNature(painter, cur0, cur);
}


В итоге получается картинка, подобная этой (такая картинка и должна получаться):[attachment=333:relief.JPG]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- AD   Грамотная отрисовка рельефа   2.12.2008, 12:02
- - AD   Кто-нибудь сможет помочь? Вопрос состоит в том, гд...   2.12.2008, 13:04
|- - AD   Тут почитал многое и понял, что эту функцию я могу...   3.12.2008, 10:56
|- - kwisp   Цитата(AD @ 3.12.2008, 10:56) Тут почитал...   20.1.2009, 10:23
- - Litkevich Yuriy   Цитата(AD @ 3.12.2008, 13:56) и тот же QP...   3.12.2008, 11:27
|- - AD   Цитата(Litkevich Yuriy) а почему один и тот же? То...   3.12.2008, 11:34
- - Litkevich Yuriy   Цитата(AD @ 3.12.2008, 14:34) можно испол...   3.12.2008, 12:33
|- - AD   Цитата(Litkevich Yuriy @ 3.12.2008, 12:33...   3.12.2008, 12:50
|- - AD   Дошло как можно это безобразие организовать - чере...   3.12.2008, 17:26
|- - AD   Перенес в доп. поток. Вот так это все выглядит: re...   5.12.2008, 12:54
- - kuler   а почему painter можно использовать в другом поток...   5.12.2008, 16:25
|- - AD   Цитата(kuler @ 5.12.2008, 16:25) а почему...   5.12.2008, 17:16
|- - AD   Рельеф не рисуется, хоть лопни, блин. Кто может по...   5.12.2008, 17:48
- - kuler   потому что по крайней мере контролы надо юзать тол...   5.12.2008, 17:57
|- - AD   Цитата(kuler @ 5.12.2008, 17:57) потому ч...   7.12.2008, 18:01
|- - AD   Ну хоть кто-нибудь подскажите, можно ли использова...   8.12.2008, 10:23
|- - AD   Вот блин. Спросил Бланшета на счет отрисовки, вот ...   8.12.2008, 12:32
- - kuler   нужен либо маршалинг (я не знаю как его сделать). ...   8.12.2008, 16:46
- - Litkevich Yuriy   Цитата(kuler @ 8.12.2008, 19:46) рисуют в...   8.12.2008, 17:27
|- - AD   Цитата(Litkevich Yuriy @ 8.12.2008, 17:27...   8.12.2008, 18:47
- - Litkevich Yuriy   Цитата(AD @ 8.12.2008, 21:47) Мозги уже п...   8.12.2008, 18:52
- - Tonal   Ну, я бы сделал примерно так: 1. При изменении раз...   15.12.2008, 12:28
|- - AD   ЦитатаНу, я бы сделал примерно так: 1. При изменен...   15.12.2008, 17:04
|- - AD   ЦитатаНу, я бы сделал примерно так: 1. При изменен...   19.1.2009, 12:19
- - Litkevich Yuriy   Цитата(Tonal @ 15.12.2008, 15:28) На ей н...   15.12.2008, 12:34
- - Tonal   ЦитатаBecause QImage is a QPaintDevice subclass, Q...   16.12.2008, 11:45


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


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




RSS Текстовая версия Сейчас: 3.1.2025, 5:54