如何旋转三角形?

时间:2012-02-13 20:54:10

标签: ios

我正在努力旋转由UIRotationGestureRecognizer产生的三角形。如果您可以查看我的方法并提供建议,我将非常感激。

我要求手势识别器对象进行旋转,文档中说的是以弧度返回。

我的策略是将每个顶点视为存在于三角形中心和顶点之间的圆上的一个点,然后使用旋转弧度来找到该圆周上的新点。我不完全确定这是一种有效的方法,但我想至少尝试一下。在视觉上,我知道它是否有效。

这是我在该尝试中创建的代码:

- (CGPoint)rotateVertex:(CGPoint)vertex byRadians:(float)radians
{
    float deltaX = center.x - vertex.x;
    float deltaY = center.y - vertex.y;
    float currentAngle = atanf( deltaX / deltaY );
    float newAngle = currentAngle + radians;
    float newX = cosf(newAngle) + vertex.x;
    float newY = sinf(newAngle) + vertex.y;
    return CGPointMake(newX, newY);
}

执行时,开始时会有轻微的旋转,但随后我继续旋转手指,顶点开始越来越远离中心点,表示我在这里混淆了一些东西。

我看了CGContextRotateCTM可以为我做些什么,但最终我需要知道旋转后的顶点是什么,所以只是旋转图形上下文似乎不会留下那些改变的坐标。

我也尝试了here描述的技术,但是导致三角形围绕第二个顶点翻转,这似乎很奇怪,但是那个技术可以用p和q作为第二个顶点的x和y坐标

谢谢你看看!

已解决:以下是更正的功能。它假设您已计算出三角形的中心。我使用维基百科关于质心的文章中描述的1/3(x1 + x2 + x3),1/3(y1 + y2 + y3)方法。

- (CGPoint)rotatePoint:(CGPoint)currentPoint byRadians:(float)radiansOfRotation
{
    float deltaX = currentPoint.x - center.x;
    float deltaY = currentPoint.y - center.y;
    float radius = sqrtf(powf(deltaX, 2.0) + powf(deltaY, 2.0));
    float currentAngle = atan2f( deltaY, deltaX );
    float newAngle = currentAngle + radiansOfRotation;
    float newRun = radius * cosf(newAngle);
    float newX = center.x + newRun;
    float newRise = radius * sinf(newAngle);
    float newY = center.y + newRise;
    return CGPointMake(newX, newY);
}

与第一个代码清单不起作用的原因相关的值得注意的是,atan2的论据被颠倒了。此外,正确计算delta值也是相反的。

2 个答案:

答案 0 :(得分:4)

你忘了乘以圆的半径。此外,由于Y轴在UIKit坐标系中指向下方,因此您必须减去而不是添加弧度并在结尾处取消y坐标。而你需要使用atan2只给出-pi / 2到pi / 2范围内的输出:

float currentAngle = atan2f(deltaY, deltaX);
float newAngle = currentAngle - radians;
float radious = sqrtf(powf(deltaX, 2.0) + powf(deltaY, 2.0));
float newX = radius * cosf(newAngle) + vertex.x;
float newY = -1.0 * radius * sinf(newAngle) + vertex.y;

答案 1 :(得分:0)

答案现已嵌入原始问题中。枪害羞于适当的礼仪; - )