围绕其中心旋转多边形

时间:2016-05-24 13:01:02

标签: c++ rotation

我为指针定义了一个多边形:

    0,-12,10,12,-10,12

此多边形的质心是:

    0,0

我想围绕质心旋转多边形,这样45度使指针指向2点钟,180度会使指针指向6点钟位置,270点钟位置到9点钟位置。

我在Qt5.6中写这个,到目前为止我的代码看起来像这样,我知道它不正确:

    QStringList lstPoints = strPoints.split(clsXMLnode::mcucPointsDelimiter);
    int intPoints = lstPoints.length();
    if ( intPoints >= 2 ) {
        int intArraySize = intPoints / 2;
        QPoint aryPts[intArraySize], ptXY = pobjChild->ptGetXY();
        int i, p;
        i = p = 0;

        while( p<intPoints ) {
            float fltX = lstPoints[p++].toFloat()
                 ,fltY = lstPoints[p++].toFloat();
            if ( fltAngle != 0.0f ) {
                double dblRadians = (fltAngle / 180.0) * M_PI
                      ,dblCosAngle = cos(dblRadians)
                      ,dblSinAngle = sin(dblRadians);
                fltX = fltX * dblCosAngle - fltY * dblSinAngle;
                fltY = fltY * dblSinAngle + fltX * dblCosAngle;
            }
    //Translate local co-ordinates to co-ordinates to be used on display
            fltX += (float)ptXY.x();
            fltY += (float)ptXY.y();
            aryPts[i++] = QPoint((int)fltX, (int)fltY);
        }
        if ( strColor.isEmpty() != true ) {
            pobjPainter->setPen(QColor(strColor));
        }
        if ( strFill.isEmpty() != true ) {
            pobjPainter->setBrush(QBrush(QColor(strFill)));
        }
        pobjPainter->drawPolygon(aryPts, intArraySize, Qt::WindingFill);

strPoints是一个字符串,其中包含由','。

分隔的多边形

如果没有旋转(0),多边形就会出现在我预期的位置,但是任何旋转它仍然会出现在我预期的位置,但看起来不正确。

1 个答案:

答案 0 :(得分:0)

问题在于:

    fltX *= dblCosAngle - fltY * dblSinAngle;
    fltY *= dblSinAngle + fltX * dblCosAngle;

这相当于

    fltX = fltX*(dblCosAngle - fltY * dblSinAngle);
    fltY = fltY*(dblSinAngle + fltX * dblCosAngle);

但你应该使用

    double tmpX = fltX;
    fltX = fltX*dblCosAngle - fltY*dblSinAngle;
    fltY = fltY*dblCosAngle + tmpX*dblSinAngle;