2013-05-05 5 views
0

Я действительно застрял в рисовании «дорог» на Pixmap в Qt. У меня есть все координаты в дробном значении, которые очень близки друг к другу (я получил их от преобразования долготы/широты в координаты X/Y с использованием формул Меркатора). Функция Qt drawLine имеет только целочисленные параметры для рисования на pixmap (например, никто не будет рисовать 2,5 пикселя). Кроме того, координата начинается с верхним левым углом, поэтому мне нужно, чтобы изменить его, как это:Как нарисовать дороги (линии) на pixmap

Xold = x 
Ynew = Ymax - Y 

Теперь у меня есть обычный X/Y системы координат, с Y-ось собирается вверх и X-ось происходит слева ,

Вот мой код, как я пытаюсь рисовать линии:

double minlat = 637800*log(tan(3.14/4+3.14*bounds[1]/360.0))/log(2.71),maxlat=637800*log(tan(3.14/4+3.14*bounds[2]/360.0))/log(2.71); 
    std::vector<double> x; 
    std::vector<double> y; 
    QSize size = ui->label_2->size(); 
    size=ui->label_2->size(); 
    QImage pic(size.width(),size.height(),QImage::Format_ARGB32_Premultiplied); 
    pic.fill(Qt::transparent); 
    QPainter painter(&pic); 
    for (unsigned int i=0; i < wayVector.size(); i++){ 
     for (unsigned int j=0; j<wayVector[i].refs.size(); j++){ 
      x.push_back(637800*3.14*nodeHash[wayVector[i].refs[j]].lon/180.0); 
      y.push_back(637800*log(tan(3.14/4+3.14*nodeHash[wayVector[i].refs[j]].lat/360.0))/log(2.71)); 

     } 
     for (unsigned int j=0; j<wayVector[i].refs.size()-1;j++){ 
      painter.setPen(Qt::green); 
      double x1 = x[j]/(size.width()/(maxlon-minlon)); 
      double y1 = maxlat*size.height()/(maxlat-minlat)-y[j]*size.height()/(maxlat-minlat); 
      double x2 = x[j+1]/(size.width()/(maxlon-minlon)); 
      double y2 = maxlat*size.height()/(maxlat-minlat)-y[j+1]*size.height()/(maxlat-minlat); 
      painter.drawLine(x1,y1,x2,y2); 
     } 
     x.clear(); 
     y.clear(); 
    } 

Но как только я ставлю x1, y1, x2, y2 к функции DrawLine они превращаются в целом, и все идет не так, потому что все X/Y-координаты становятся одинаковыми (из-за того, что они очень близки).

Я действительно не знаю, как рисовать эти строки на pixmap. Любые идеи?

+0

Кстати, мне не нужно использовать только Pixmap, может быть, кто-то покажет другой способ сделать это. Спасибо – tema

ответ

1

Существует 5 различных функций drawLine(). Вместо этого используйте void QPainter::drawLine(const QPointF& p1, const QPointF& p2) или void QPainter::drawLine(const QLineF& line). Те типы, которые заканчиваются на F, удваиваются.

+0

Большое спасибо, но знаете ли вы, как переместить из верхней левой системы координат по умолчанию, где X/Y-ось начинается с левого нижнего угла (как мы их всегда рисуем)? – tema