我正在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];
}
}
有沒有人可以幫我這個算法?任何職位將不勝感激。謝謝。