Russian Qt Forum
Май 15, 2024, 10:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 2 3 [4] 5 6 ... 21
46  Qt / 2D и 3D графика / Re: Трансформация карт : Май 05, 2015, 17:58
Функция написана давно и не мной, черт ногу сломит, что там делается! но в целом она работает, за исключением того что вылез касяк со смещением.. и не понятно то ли это тайлы не совсем правильно размещаются на экране, то ли нужно в целом пересчитывать картинку по другому, ибо сами карты того требуют (Меркатор -> WGS84).. Kurles а что по вашему там лишнее?
47  Qt / 2D и 3D графика / Re: Трансформация карт : Май 05, 2015, 15:29
минимальный проект, будет сложновато сделать..проект большой, чтобы оттуда выдрать все нюансы! вот функция загрузки карты. по сути в ней вся работа с тайлами карты!
Код:
void CThreadLoadMap::load()
{  
    QImage tmpImage;
    QImage tmpIm;
    QString fullPathFile;

    double lat_rad =  latitude * M_PI/180;
    double lon_rad =  longitude * M_PI/180;

    double scrRes; // разрешение экрана
    double scaleK; // масштабный коэффициент
    int startX;
    int startY;
    int tileNewSize;
    int numTilesX;
    int numTilesY;

    int Z;
    int BM0;
    int Xp;
    int Yp;

    int numX;
    int numY;

    int dx;
    int dy;

    int R0;
    int WW; // длина окружности на данной широте

    double XYRes;

    int w = szWinDraw.width(),
        h = szWinDraw.height();

    int sizeN = w*h*4;
    char *buf2N = new char[sizeN*8];

    bool fileExist = false;

    int index = 0;

    //10-20=4;30-50=3;60-100=2;110-200=1;210-400=0
    int curScale = currentScale;
    if(curScale > 200) index = 0;else
    if(curScale > 100) index = 1;else
    if(curScale >  50) index = 2;else
    if(curScale >  20) index = 3;else
                       index = 4;

    Z = 8 + index;
    BM0 = pow(2,(Z-1+8))/2; // центр мира в пикселях для данного уровня
    R0  = 6378137 *         // радиус большой полуоси эллипсоида
          cos(lat_rad);
    WW  = 2*M_PI*R0;        // длина окружности планеты на lat широте

    XYRes = WW/(pow(2,(Z-1))*256);

    scrRes = currentScale*1000.*2/(szWinDraw.height() - 2*PaddingWinDraw);
    scaleK = (XYRes / scrRes);

    // координаты на растровом массиве данного уровня в пикселах, от верхнего левого угла массива
    Xp = BM0*(1+lon_rad/M_PI);
    Yp = BM0*(1 - 0.5*log((1+sin(lat_rad))/(1-sin(lat_rad)))/M_PI);
    // номера блоков в тайловом массиве
    numX = (Xp/256);
    numY = (Yp/256);
    // смещение внутри тайла в пикселях
    dx = (Xp - numX*256);
    dy = (Yp - numY*256);

    tileNewSize = floor(256*scaleK);

    numTilesX   =  2*round(0.5+0.5*w/tileNewSize);
    numTilesY   =  2*round(0.5+0.5*h/tileNewSize);

    startX = numX - (numTilesX/2);
    startY = numY - (numTilesY/2);

    dx = dx*scaleK + abs(w - numTilesX*tileNewSize)/2;
    dy = dy*scaleK + abs(h - numTilesY*tileNewSize)/2;

    int* dest = (int*)buf2N;

    static int numb = 0;
    for(int x = startX; x < (startX+numTilesX+1); x++)
    {
      for(int y = startY; y < (startY+numTilesY+1); y++)
      {
          fullPathFile = "";

          fullPathFile = patchToMap + QString("/z%1/%2/x%3/%4/y%5.jpg")
              .arg(Z )
              .arg(x/1024)
              .arg(x)
              .arg(y/1024)
              .arg(y);

          fileExist = tmpImage.load(fullPathFile);

          if(!fileExist)
          {
              QString nameFileMap = QString("/z%1/%2/x%3/%4/y%5.png")
                      .arg(Z)
                      .arg(x/1024)
                      .arg(x)
                      .arg(y/1024)
                      .arg(y);

              fullPathFile = patchToMap + nameFileMap;

              fileExist = tmpImage.load(fullPathFile);
          }

          int width = 2*w;

          if(fileExist)
          {
              tmpIm = tmpImage.scaled(tileNewSize,tileNewSize, Qt::KeepAspectRatio,
                                                               Qt::SmoothTransformation);
              numb++;

              for(int yy = 0; yy < tmpIm.height(); yy++)
                for(int xx = 0; xx <  tmpIm.width(); xx++)
                {
                    dest[
                        ((yy)*width+xx)
                        +((x-startX)*tileNewSize+(y-startY)*tileNewSize*width)
                        ] = (int)tmpIm.pixel(xx,yy);
                }
          }
       } // end for(;;) - y
    } // end for(;;) - x

    int* src = (int*)buf2N;

    for(int y = 0; y < h; y++)
     for(int x = 0; x < w; x++)
      if(layerMap->valid(x,y))
        layerMap->setPixel(x,y,src[((x+dx) + (y+dy)*w*2)]);

    delete [] buf2N;
}

На картинке пример смещения точек. Черная - это то место, где хотелось бы видеть отметку, а красная - это точка вбитая по координатам гугла (то место где должно быть пересечение дорог).
48  Qt / 2D и 3D графика / Re: Трансформация карт : Май 05, 2015, 14:26
Вроде у гугла нумерация координат и уровней зума совпадает с OSM. Посмотри в сторону расчёта координат для Slippy map. По ссылке даны формулы для координат целых тайлов, но их не сложно привести к конкретным пикселям в нужном тайле.

Так у меня по формулам из целых тайлов картинка и собирается, просто рассчитывается место каждого тайла на экране и он достается из нужной папки "/z%1/%2/x%3/%4/y%5.png" без всяких модификаций! Просто получается, что чем дальше от экватора в северном (южном) направлении находится точка стояния, тем больше погрешность получается (картинка вроде как должна сжиматься сверху и расширятся снизу, для северного направления), а здесь она остается просто прямоугольником, собранным из отдельных тайлов. Карты гугла вроде как в проекции Меркатора, а данная проекция искажает площади, поэтому видимо для правильного отображения необходимо делать пересчеты в другую систему координат.. вопрос в какую и как?
49  Qt / 2D и 3D графика / Трансформация карт : Май 05, 2015, 12:04
Доброго дня! Есть задача похожая на http://www.prog.org.ru/topic_24274_0.html, но мне нужно трансформировать существующие тайлы гугловских карт на 2D плоскости! Т.е. есть такая проблема: если собрать тайлы в одну картинку QImage для z8 масштаба скажем и по координатам гугла выставить какую-либо видимую отметку (скажем пересечение дорог), то она не совпадет с пересечением дорог на карте, отметка будет смещена. Таким образом мне нужно трансформировать карту, чтобы координаты отметок точно совпадали с картой. В выше приведенной статье был предложен алгоритм, если его модифицировать подойдет ли он мне:
- каждый тайл представить в виде сетки точек I x J.
   - для каждой точки
     1. выполнить преобразование из проекции Меркатора на геоид WGS84
     2. выполнить преобразование из геоида WGS84 в 2D декартовые координаты
Если такой алгоритм правильный для моей задачи, то может кто подскажет формулы пересчета и как это реализовывать, т.е. необходимо попиксельно пересчитывать картинку из одних координат в другие?
50  Qt / 2D и 3D графика / Re: Преобразовать QImage в трапецию : Апрель 28, 2015, 13:01
рабочий пример

Код:
#include "widget.h"
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QGraphicsDropShadowEffect>
#include <QGraphicsView>

int main(int argc, char *argv[])
{
        QApplication app(argc,argv);
        QGraphicsScene scene;

        QGraphicsPixmapItem* pixmapItem = new QGraphicsPixmapItem(*(new QPixmap(":/Number.jpg")));
        pixmapItem->setFlags(QGraphicsItem::ItemIsMovable);

        QGraphicsDropShadowEffect* effect = new QGraphicsDropShadowEffect();
        effect->setBlurRadius(20);
        effect->setOffset(20,20);

        pixmapItem->setGraphicsEffect(effect);

        qreal x = pixmapItem->boundingRect().width()/2;
        qreal y =pixmapItem->boundingRect().height()/2;

        QTransform transform;
        transform.translate(x,y).rotate(60,Qt::XAxis).translate(-x,y);
        pixmapItem->setTransform(transform);

        QGraphicsView view(&scene);

        scene.addItem(pixmapItem);

        view.showFullScreen();

        return app.exec();
}

Спасибо! Буду пробовать применять данную трапецию к моей задаче, там правда еще нужно расширить низ,но это видимо можно будет сделать sclale-м! Спасибо еще раз!
51  Qt / 2D и 3D графика / Re: Преобразовать QImage в трапецию : Апрель 28, 2015, 11:46
В коде из примера выше:
Код:
 QTransform transform;    
    transform.translate(20,20);
    transform.rotate(60,Qt::YAxis);
    pixmapItem->setTransform(transform);

    сначала translate, потом rotate

так и делаю, но смещается левый верхний угол картинки, перспектива не меняется. прикреплю проект
52  Qt / 2D и 3D графика / Re: Преобразовать QImage в трапецию : Апрель 28, 2015, 11:28
Это должно помочь:
QTransform & QTransform::translate(qreal dx, qreal dy)

выставьте центр трансформации на центр картинки

translate() и выставляет центр трансофрмации? Это функция только сместила у меня картинку на dx и dy вправо вниз
53  Qt / 2D и 3D графика / Re: Преобразовать QImage в трапецию : Апрель 28, 2015, 10:51
Хотя можно только поменять картинку при помощи сцены (http://stackoverflow.com/questions/23698114/how-can-i-apply-a-graphic-effect-to-the-image-in-qlistview), но опять же какая-то не совсем правильная перспектива получается. При чем необходимо не только сузить верх картинки равномерно, но и также равномерное растянуть низ трапеции. Можно ли этого добиться перспективой сцены?
54  Qt / 2D и 3D графика / Re: Преобразовать QImage в трапецию : Апрель 28, 2015, 10:18
Я бы сделал через QGraphicsScene. там есть перспектива
Вот похожий пример, только в вашем случае вращать вокруг оси X
http://www.codeprogress.com/cpp/libraries/qt/showQtExample.php?index=510&key=MovableQGraphicsPixmapItem

Проект уже сделан и все рисование там осуществляется на QWidget в разных слоях картинках, поэтому не очень хочется ради видоизменения одной прикручивать сцену и переделывать все остальное рисование, коего немало.. но эффект интересный! Только вот когда вращаю вокруг X меняется только одна сторона трапеции (правая), а левая остается под прямым углом.. какая-то односторонняя перспектива получается. А необходимо равномерно видоизменить прямоугольник (квадрат) в равностороннюю трапецию!
55  Qt / 2D и 3D графика / Re: Преобразовать QImage в трапецию : Апрель 27, 2015, 16:04
Понятно! Может советом поможете или ссылкой куда копать?
Погуглите, если ничего хорошего - завтра найду время, попробую сам написать

Гуглю пока ничего определенного.. Спасибо!
56  Qt / 2D и 3D графика / Re: Преобразовать QImage в трапецию : Апрель 27, 2015, 15:31
Доброго дня! Подскажите возможно ли преобразовать QImage в трапецию: сжать верх и растянуть низ? Пробую через QTransform и QMatrix, но ничего не выходит.. прикрепляю минимальный проект.
Матричное преобразование отображает равные отрезки в равные - но для трапеции (деформации) это не так. Поэтому QTransform здесь не поможет. Надо писать самому - ну или нагугливать "готовое решение"

Понятно! Может советом поможете или ссылкой куда копать?
57  Qt / 2D и 3D графика / [РЕШЕНО] Преобразовать QImage в трапецию : Апрель 27, 2015, 15:03
Доброго дня! Подскажите возможно ли преобразовать QImage в трапецию: сжать верх и растянуть низ? Пробую через QTransform и QMatrix, но ничего не выходит.. прикрепляю минимальный проект.
58  Qt / Установка, сборка, отладка, тестирование / Re: Ошибки сборки под Lubuntu 14.04 : Март 18, 2015, 16:53
Для использования dlopen() нужно добавить -ldl, и прочитать уже что-то про компиляцию программ в Linux.

Да, спасибо, так 
Код:
 LIBS += -llua -lX11 -ldl 
в Lubuntu 14.04 собралось, хотя в OpenSuse этого не нужно было.
59  Qt / Установка, сборка, отладка, тестирование / Re: Ошибки сборки под Lubuntu 14.04 : Март 18, 2015, 15:19
-lX11 есть в LIBS?

Не было! Но если добавить LIBS += -lX11 -llua, то вылазит ошибка

Код:
/usr/bin/ld: //usr/local/lib/liblua.a(loadlib.o): undefined reference to symbol 'dlopen@@GLIBC_2.1'
//lib/i386-linux-gnu/libdl.so.2: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
60  Qt / Установка, сборка, отладка, тестирование / [РЕШЕНО] Ошибки сборки под Lubuntu 14.04 : Март 18, 2015, 14:59
Доброго дня! Пытаюсь собрать старый проект под Qt4.8.6(Lubuntu 14.04), раньше он собирался Qt4.8.1 под OpenSuse 11.4 без проблем, а
сейчас кидает ошибки типа:

Код:
/usr/bin/ld: build/obj/indicatorwindowDrawing.o: undefined reference to symbol 'XFillArc'
//usr/lib/i386-linux-gnu/libX11.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

Ругается на Х-е функции, типа XFillArc(), XSetForeground(), используемые в проекте. В чем может быть дело?
Страниц: 1 2 3 [4] 5 6 ... 21

Страница сгенерирована за 0.068 секунд. Запросов: 23.