【问题标题】:Rotating a polygon around its center围绕其中心旋转多边形
【发布时间】:2016-05-24 13:01:02
【问题描述】:

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

    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),多边形会出现在我期望的位置,但任何旋转它仍然会出现在我期望的位置,但看起来不正确。

【问题讨论】:

    标签: c++ rotation


    【解决方案1】:

    问题出在这里:

        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 在最后一行被交换了。
    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 2013-12-18
    • 2014-02-08
    • 1970-01-01
    • 2018-05-17
    • 2019-08-30
    相关资源
    最近更新 更多