crossplatform.ru

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

> Заполнение области определенным цветом
AD
  опции профиля:
сообщение 26.11.2008, 20:23
Сообщение #1


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

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

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




Репутация:   17  


Вопрос довольно сложный и затрагивает не только Qt. Есть область (прямоугольник), где рисуется карта и траектория средствами библиотеки нашей фирмы. Для отрисовки используется такая вот функция:
/// Функция отрисовки карты (для Windows)
#ifdef Q_WS_WIN
void SubSahara::Draw(HDC hdc)
{
    if(!bInit) return;

    for(int y = begSize.y; y < spSize.y; y++)
    {
            SetDIBitsToDevice(hdc,                        ///< handle to DC
                begSize.x,                              ///< x-coord of destination upper-left corner
                y,                                        ///< y-coord of destination upper-left corner
                spSize.x,                                ///< source rectangle width
                1,                                        ///< source rectangle height
                0,                                        ///< x-coord of source lower-left corner
                0,                                        ///< y-coord of source lower-left corner
                0,                                        ///< first scan line in array
                1,                                        ///< number of scan lines
                                                        ///< array of DIB bits
                (CONST VOID *)(pDevice->GetSurface() + spSize.x * y),
                pBmi,                                    ///< bitmap information
                DIB_RGB_COLORS);
    }
}
#endif // Q_WS_WIN

pBmi - имеет тип BITMAPINFO
при использовании делается так:
/// Рисование в заданном виджете (trackView)
void TLV::paintEvent(QPaintEvent *events)
{
    QPainter painter(this);
    /// Рисование карты Мира Сахарой
    int Xbeg = trackView -> x() + 10;
    int yb = dockWidget -> y() + 10;
    int Ybeg = (toolbarAction -> isChecked()) ? yb + toolBar -> height() + TLVClass::menuBar -> height()
        : yb + TLVClass::menuBar -> height();
    int Xend = trackView -> width();
    int Yend = trackView -> height();

    pSahara -> SetBitmapSize(Xbeg, Ybeg, Xend, Yend + Ybeg);
    pSahara -> Refresh();

    #ifdef Q_WS_WIN
        pSahara -> Draw(painter.paintEngine() -> getDC());
    #endif // Q_WS_WIN    

    QMainWindow::paintEvent(events);
}


Имеются определенные функции для получения массива QRgb. Задача заполнить область, в которой происходит рисование (по сути, виджет trackView), цветами из этого массива. Каким образом сделать массив заполнения этой области? Подскажите, пожалуйста, средства Qt какими можно это сделать и как сделать?

Заранее благодарен.

Сообщение отредактировал AD - 27.11.2008, 12:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 8)
ViGOur
  опции профиля:
сообщение 26.11.2008, 20:49
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Честно говоря не соавсем понял, что ты хочешь:
Цитата(AD @ 26.11.2008, 20:23) *
Имеются определенные функции для получения массива QRgb
Цитата(AD @ 26.11.2008, 20:23) *
Каким образом сделать массив заполнения этой области?
У тебя имеется массив или его нужно сделать? :)

Да и если я не ошибаюсь HDC и BITMAPINFO это чисто виндовые типы, следовательно о кроссплатформенности можно забыть.

Пардон, просмотрел #ifdef Q_WS_WIN... :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 27.11.2008, 12:24
Сообщение #3


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

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

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




Репутация:   17  


Впринципе предполагается, что приложение пока что будет работать только на Windows, поэтому особых проблем с этим быть не должно. В будущем, если понадобится, то будет произведен перенос и на другие платформы. Шансы, что будет работать и на других платформах, есть! :) Но сможете помочь-то? А то я даже не знаю с какой стороны подступиться к данной проблеме.

Массив имеется, точнее сказать я его получу, особых проблем с этим нет. Проблема в том как создать нужную картинку заполненную определенными цветами?

Сообщение отредактировал AD - 27.11.2008, 12:25
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 27.11.2008, 14:58
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Ну если у тебя есть массив с точками и их цветом, то не вижу проблем в их рисовании!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 27.11.2008, 15:59
Сообщение #5


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

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

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




Репутация:   17  


У меня есть массив цветов, но нет массива точек. Я не знаю, как точно их получить... Как?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 27.11.2008, 16:35
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Цитата(AD @ 27.11.2008, 15:59) *
но нет массива точек. Я не знаю, как точно их получить... Как?
что именно ты хочешь нарисовать? Гравифик или что-то еще?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 27.11.2008, 16:58
Сообщение #7


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

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

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




Репутация:   17  


Ну если скажу, ведь офигеешь! :)))
Хочу получить точно такую же картинку:
[attachment=325:topo_dem_chart.JPG]
Вот так вот :) Цвета берутся в зависимости от высоты, а высота из определенного бинарного файла высот. А мне нужен цикл по ширине и высоте виджета (аааааа, вот сам и ответил на вопрос, почти что :)))))
Спасибо. Если, что еще что-то спрошу! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 27.11.2008, 17:10
Сообщение #8


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Цитата(AD @ 27.11.2008, 16:58) *
(аааааа, вот сам и ответил на вопрос, почти что ))))
Я тебе уже как-то говорил, проговаривай про себя то, что ты хочешь сделать... :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 27.11.2008, 18:46
Сообщение #9


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

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

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




Репутация:   17  


Ну с помощью такого вот незатейливого кода, проблема решена
// Отрисовка DEM-карты
void ScrTrack::drawDemChart(GRAPHIC_DEVICE& device, const CHART_SCOPE& scope, const DRAW_MODE& mode)
{
    SPOINT end_coord(device.GetSize());
    for(int x=0; x<end_coord.x; ++x)
        for(int y=0; y<end_coord.y; ++y)
        {
            SPOINT current_coord(x, y);
            GPOINT geo_coord;
            scope.ScrToGeo(geo_coord, current_coord);
            double delta_height = GetHMax(geo_coord.lat / GEO_1_DEG, geo_coord.lon / GEO_1_DEG);
            unsigned char index = demCalcColor(delta_height);
            device.SetPixelIndex(current_coord, index);
        }
}


А в итоге такая картинка:
[attachment=326:dem_chart_new.JPG]

Вообще тем, кто с этим будет работать интересна картинка при сильном приближении, как раз когда видны квадратики изображения, но для красоты я поместил данную картинку. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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