C++ 围绕多边形中心旋转多边形

C++ 围绕多边形中心旋转多边形,c++,rotation,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 = lstPo

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

    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);
QStringList lstPoints=strPoints.split(clsXMLnode::mcucPointsDelimiter);
int intPoints=lstPoints.length();
如果(积分>=2){
int intArraySize=int点/2;
QPoint aryPts[intArraySize],ptXY=pobjChild->ptGetXY();
int i,p;
i=p=0;
而psetPen(QColor(strColor));
}
if(strFill.isEmpty()!=true){
POBJPAITER->退刀(QBrush(QColor(strFill));
}
POBJPAITOR->drawPolygon(aryPts、InArraysize、Qt::WindingFill);
strPoints是一个字符串,包含由“,”分隔的多边形

如果没有旋转(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;
问题在于:

    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;

谢谢你,我发现了这一点,这就是为什么你会注意到我的代码现在读起来不一样,但它仍然不正确。还有一个问题是覆盖
fltX
,我现在才添加。谢谢你,现在就试试。非常感谢你,当以45度的角度进行测试时,它工作得很好,90度却不正确。哦,是的,我认为cos和sin是正确的在最后一行中进行了交换。谢谢,我发现了这一点,这就是为什么您会注意到我的代码现在的读取方式不同,但仍然不正确。覆盖
fltX
也有问题,我现在刚刚添加了它。谢谢,现在将尝试。非常感谢,当以45度的角度进行测试时,它工作得很好,90度却不行。哦,是的,我认为因为和罪恶在最后一行被交换了。