【发布时间】: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