如何用角度和另一个CGPoint确定最近的CGPoint

时间:2013-02-06 18:21:59

标签: ios objective-c cocos2d-iphone angle

我计算两个CGPoints之间的角度:

//calculate radian and degree
            CGPoint diff = ccpSub(center, location);//return ccp(v1.x - v2.x, v1.y - v2.y);
            float rads = atan2f( diff.y, diff.x);
            float degs = -CC_RADIANS_TO_DEGREES(rads);
            NSLog(@"Rad %.2f Degs %.2f",rads,degs);

现在在我有一个预先知道的CGPoint和上面函数的程度的另一个函数中,我想计算满足度数的最近点。

我在考虑下面的代码可能对我有帮助但是在下面的代码起点和旋转点是已知的,在我的情况下我只知道起点。

-(void) rotateAroundPoint:(CGPoint)rotationPoint angle:(CGFloat)angle {
    CGFloat x = cos(CC_DEGREES_TO_RADIANS(-angle)) * (self.position.x-rotationPoint.x) - sin(CC_DEGREES_TO_RADIANS(-angle)) * (self.position.y-rotationPoint.y) + rotationPoint.x;
    CGFloat y = sin(CC_DEGREES_TO_RADIANS(-angle)) * (self.position.x-rotationPoint.x) + cos(CC_DEGREES_TO_RADIANS(-angle)) * (self.position.y-rotationPoint.y) + rotationPoint.y;

假设我有一个800,600点,我的学位是70,我怎样才能计算出该点和那个学位的最近点?

EDIT :::

通常在我的游戏中,精灵会被一个按钮移动,因此按下按钮时会处理所有旋转,移动,速度等[sprite moveToPreGivenPostion:CGPoint]

但是现在添加了一个指南针,当用户在指南针上选择一个角度时,我需要在指南针上按度数方向移动精灵,因为[sprite moveToPreGivenPostion:CGPoint]已经处理旋转和其他东西我只想确定我应该向moveToPreGivenPostion函数发送什么CGPoint。

1 个答案:

答案 0 :(得分:1)

正如@trumpetlicks所说,你无法找到最接近的点,但我想我明白了你想要的东西,而你想要使用的功能-(void) rotateAroundPoint:(CGPoint)rotationPoint angle:(CGFloat)angle完全可以达到你想要的效果。

enter image description here

您需要做的就是选择浮动半径。

你知道你的当前点并且假设你的半径是1,基本上你可以计算你没有度数的前一点,假设你的点剩下0度,并且假设你的点是200,200,1半径0度你的前一点自动变成199,200。 所以现在你有一个参考点,所以现在计算你想要移动精灵的点:

//choose a feasable radius
    float radius = 0.5;
    //position_ is your preknown position as you said
    //find a the point to roate 
    //position_.x-radius is always 0 degrees of your current point
    CGFloat x = cos(rads) * ((position_.x-radius)-position_.x) - sin(rads) * ((position_.y)-position_.y) + position_.x;
    CGFloat y = sin(rads) * ((position_.x-radius)-position_.x) + cos(rads) * ((position_.y)-position_.y) + position_.y;

    //get the new point
    CGPoint newLocation = ccp(x, y);