Просмотр сообщений
|
Страниц: 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 вправо вниз
|
|
|
54
|
Qt / 2D и 3D графика / Re: Преобразовать QImage в трапецию
|
: Апрель 28, 2015, 10:18
|
Проект уже сделан и все рисование там осуществляется на 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 здесь не поможет. Надо писать самому - ну или нагугливать "готовое решение" Понятно! Может советом поможете или ссылкой куда копать?
|
|
|
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(), используемые в проекте. В чем может быть дело?
|
|
|
|
|