
我要求手势识别器对象进行旋转,文档中说这是以弧度为单位返回的.
我的策略是将每个顶点视为存在于三角形中心和顶点之间的圆上的点,然后使用旋转弧度来找到该圆周上的新点.我不完全确定这是一种有效的方法,但我想至少尝试一下.在视觉上,我知道它是否有效.
这是我在该尝试中创建的代码:
- (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坐标.
谢谢参观!
解决:这是纠正的功能.它假设您已计算出三角形的中心.我使用了关于CentroIDs的维基百科文章中描述的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的论据被颠倒了.此外,Δ值的正确计算是相反的.
解决方法 你忘记了乘以圆的半径.此外,由于Y轴在UIKit坐标系中指向下方,因此您必须减去而不是添加弧度并在结尾处取消y坐标.并且你需要使用atan2只给出-pi / 2到pi / 2范围内的输出:float currentAngle = atan2f(deltaY,deltaX);float newAngle = currentAngle - radians;float radious = sqrtf(powf(deltaX,2.0));float newX = radius * cosf(newAngle) + vertex.x;float newY = -1.0 * radius * sinf(newAngle) + vertex.y;总结
以上是内存溢出为你收集整理的ios – 如何旋转三角形?全部内容,希望文章能够帮你解决ios – 如何旋转三角形?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)