在绘制QLine之后调整点

时间:2017-03-07 15:05:18

标签: c++ qt

所以我根据QDial的位置绘制QLine,我需要在场景中绘制后定期调整线上点的位置。

以下是我获得积分的方式

void addNewPoint( int qdialAngle ){
    double oldX = m_sceneCenter;
    double oldY = m_sceneCenter;
    double newX = oldX + qCos(qDegreesToRadians(range)) * m_sceneRadius;
    double newY = oldY + qCos(qDegreesToRadians(range)) * m_sceneRadius;
    QPointF pt(newX, newY);
    m_historyPoint_list.append(pt);
    m_historyPoint_count++;

    switch(m_historyPoint_count){
        case 1:
            m_historyPoint_A = pt;
            break;
        case 2:
            m_historyPoint_B = pt;
            m_historyPoint_count = 0;
            break;
     }
}

以下是我从这些方面划线的方法。

void drawPathLine(){
    m_HistoryLine = QLineF(m_historyPoint_A, m_historyPoint_B);
    QPen linePen(Qt::green, Qt::SolidLine);
    linePen.setWidth(2);

    m_currentLineItem = m_GraphicsScene->addLine(m_HisoryLine, linePen);
    m_line_list.append(m_currentLineItem);
}

一切正常,我只是不知道如何调整线上的点数。

基本上,我需要画出的线条随着时间的推移慢慢地被吸入场景的中心。

如果我将QGraphicsScene慢慢地向上扩展,那么效果大部分起作用,它至少适用于原型,但问题是随着时间的推移,线越来越小。 QLine似乎没有设置为忽略转换的标志,这种转换在这种情况下会起作用。无论哪种方式,缩放场景还有其他问题,这使我相信它可能无论如何都不是。

我试图指出Points,但QLineF并没有接受指针。

如何在绘制此线后调整此线?

这是我尝试的内容:

void offsetPoints(){ //called from a timer
    foreach(QGraphicsLineItem* line, m_line_list){
        QLineF adjLine = line->line();
        int adjLine_pt1_x = adjLine.p1.x();
        int adjLine_pt1_y = adjLine.p1.y();
        int adjLine_pt2_x = adjLine.p2.x();
        int adjLine_pt2_y = adjLine.p2.y();

        QPointF newOffsetP1 = QPointF(getNewPoint( getBearing(adjLine_pt1_x, adjLine_pt1_y),
        getRange(adjLine_pt1_x, adjLine_pt1_y));

        QPointF newOffsetP2 = QPointF(getNewPoint( getBearing(adjLine_pt2_x, adjLine_pt2_y),
        getRange(adjLine_pt2_x, adjLine_pt2_y));

        adjLine.setP1(newOffsetP1);
        adjLine.setP2(newOffsetP2);
        line->setline(adjLine);
    }
}

QPointF getNewPoint(double bearing, double range){
    double oldX = 400;
    double oldY = 400;

    double m_offsetSpeed -= 0.1;
    double newX = oldX + qCos(qDegreesToRadians(bearing)) * (range - m_offsetSpeed);         
    double newY = oldY + qSin(qDegreesToRadians(bearing)) * (range - m_offsetSpeed); 

    QPointF newPoint = QPointF(newX, newY);
    return newPoint;
}

double getBearing(int Xpos, int Ypos){
    double lat1 = m_center.x();
    double lon1 = m_center.y();
    double lat2 = Xpos;
    double lon2 = Ypos;

    double X = qSin(lon2 - lon1) * qCos(lat2);
    double Y = qCos(lat1) * qSin(lat2) - qSin(lat1) * qCos(lat2) * qCos(lon2 - lon1);
    double bearing = (qAtan2(Y,X) * (180 / 3.14159265), 360);

    if(bearing < 0)
        bearing += 360;

    return bearing;
}

double getRange(int Xpos, int Ypos){
    double centerX = m_center.x();
    double centerY = m_center.y();

    double newX = centerX - Xpos;
    double newY = centerY - Ypos;

    double distance = qPow(newX, 2) - qPow(newY,2);

    double range = qSqrt( distance);
    return range;
}

这些线条在绘制后肯定会有所作为,但它们的行为非常不稳定。我觉得我很近,也许我的数学已经关闭了?

我在我的&#34; m_historyPoint_list&#34;中存储用于创建行的点。我的想法是我应该能够在这些点上进行这些计算,然后这条线就会简单地#34;更新,但它们没有工作,因为一旦点在列表中,它们就变成了const点。

同样,如果有人知道我可以将ItemIgnoresTransformations应用到我的线上的方式,那么当我缩放我的场景时,这些线条不会畏缩,大部分头痛都会消失。

0 个答案:

没有答案