【问题标题】:rotate a polygon based on its centre with snap使用捕捉基于其中心旋转多边形
【发布时间】:2014-08-28 02:45:25
【问题描述】:

我正在 iOS 上开发一个 2D 应用程序,我需要做的是基于它的中心旋转一个多边形,并实现捕捉。现在我可以正确旋转它,但我不知道如何实现捕捉(当多边形的任何一侧非常接近水平或垂直时,自动使其水平或垂直)。这是我当前的代码,我正在使用滑块来旋转这个多边形

- (IBAction)sliderValueChanged:(UISlider *)sender {

    // get rotateAngle
    double rotateAngle = sender.value;

    // if choosing any room, rotate it
    if (choosedRoomAtIndex>0){

        // get the room
        NSMutableArray *corners = rooms[choosedRoomAtIndex-1];

        // calculate center point
        double centerX;
        double centerY;
        for (NSValue *pointValue in corners){
            CGPoint cornerPoint = [pointValue CGPointValue];
            centerX += cornerPoint.x;
            centerY += cornerPoint.y;
        }
        CGPoint centerPoint = CGPointMake(centerX/corners.count, centerY/corners.count);

        // calculate snap angle
        **How To Calculate the angles that make any side horizontal or vertical?**

        // rotate all the corner point based on the rotate angle
        for (int j=0; j<corners.count; j++) {

            // get current point
            CGPoint cornerPoint = [corners[j] CGPointValue];

            // if very close to horizontal or vertical, snap it
            if (fabs(rotateAngle-/*any snap angle*/)<rotateThreshold){
                rotateAngle = /*this snap angle*/;
                NSLog(@"here");
            }

            // perform the rotate
            double s = sin(rotateAngle-lastRotatedAngle);
            double c = cos(rotateAngle-lastRotatedAngle);
            double newX = (cornerPoint.x-centerPoint.x)*c - (cornerPoint.y-centerPoint.y)*s + centerPoint.x;
            double newY = (cornerPoint.x-centerPoint.x)*s + (cornerPoint.y-centerPoint.y)*c + centerPoint.y;
            CGPoint movedPoint = CGPointMake(newX,newY);
            [corners replaceObjectAtIndex:j withObject:[NSValue valueWithCGPoint:movedPoint]];

        }
        [rooms replaceObjectAtIndex:choosedRoomAtIndex-1 withObject:corners];
        lastRotatedAngle = rotateAngle;
        [self setNeedsDisplay];
    }

}

有人可以帮助我了解这个算法吗?任何帖子将不胜感激。谢谢。

【问题讨论】:

    标签: ios algorithm cocoa coordinates polygon


    【解决方案1】:

    我假设多边形的边缘在连续的角之间延伸(最后一个边缘从最后一个角环绕到第一个角)。如果是这种情况,任何角到下一个角的角度由下式给出

    tan(angle) = ((corners[i+1].y -corners[i].y)/(corners[i+1].x -corners[i].x)

    这里的角度是 x 轴下方的角度(顺时针方向)。因此,要将其恢复为水平状态,您需要旋转 -angle。我还将计算旋转到垂直方向的角度(在上面的等式中交换 x 和 y),然后选择两者中较小的一个。如果两个角已经水平或垂直对齐(在这种情况下,不需要捕捉?),您将需要注意除以零。您可能需要注意“下一个”角在当前角的左侧或上方的情况,但实际上我认为这无关紧要,因为您可能想选择最小的捕捉角度。

    我会遍历所有角并找到每个角的水平和垂直捕捉角度,然后使用所有这些角度中最小的。请注意,上面的公式是数学,而不是代码 - 例如,您需要执行 CGPointValue 方法从 NSValues 中提取。您需要使用 atan 从上述公式中获取角度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      相关资源
      最近更新 更多