如何在像素图上绘制道路(线条)

时间:2013-05-05 16:30:34

标签: qt drawing pixmap mercator

我真的很难在Qt上的Pixmap上绘制“道路”。 我的所有坐标都是小数值的,它们彼此非常接近(我通过使用墨卡托的公式将它们从经度/纬度转换为X / Y坐标)。 Qt drawLine函数只有在像素图上绘制的整数参数(例如,因为没有人会绘制2.5像素)。此外,坐标从左上角开始,所以我需要更改它,如下所示:

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坐标都变得相同(因为它们非常接近)。

我真的不知道如何在像素图上绘制这些线条。  有任何想法吗?

1 个答案:

答案 0 :(得分:1)

有5种不同的drawLine()函数。请改用void QPainter::drawLine(const QPointF& p1, const QPointF& p2)void QPainter::drawLine(const QLineF& line)。那些以F结尾的类型使用双精度。