数学问题 求角度

  • 本帖最后由 huangrui200123 于 2013-1-29 09:02 编辑 *

最近在 做一个带有旋转炮塔的小游戏 但是卡在 如何控制炮台的角度控制上 :在参看了大量的资料以后 依然无法理解其中的原理(数学功底太差,三角函数无法理解), 希望能在这里向各位大侠们高抬贵手给小弟一个样例 学习:

             问题: 
                      通过触摸回调函数中的CCTouch *Touch = (CCTouch*)(pTouches->anyObject());
                                                      CCPoint location = Touch ->getLocation();   ←获得了 一个点


                                                     float offX=location.x;
                                                     float offY=location.y;     //然后拿到啦  X Y

                     炮台被设置在啦 屏幕的中间

                                                    按照样例上的方法构造啦

               //计算角度====================================================
                                    float angleRadians = atanf((float)offY / (float)offX);  //获得了弧度~~ (⊙_⊙)嗯至少例子上是这么说的
                                    float angleDegrees = CC_RADIANS_TO_DEGREES(angleRadians);         //转成角度  翻译的文字是"弧度转成摄氏度"
                                    float cocosAngle = -1 * angleDegrees;                                  //取个反

                                 pT->setRotation(cocosAngle);   //旋转精灵  

             之后的情况就是  那个角度真么转也转 不对 要不就是偏差太大 要不就是完全转不到左边来.
                                                                                    
                 希望能有大侠帮个忙吧~

atanf 貌似得不出34象限,需要另外加180度,或者试试用atan2f

CCPoint pos = m_pCtrl->getPoint();
float l = sqrtf(pos.xpos.x+pos.ypos.y);
float d = 0;
if (0==pos.x)
{
d = pos.y>0? -90.0f: 90.0f;
}
else
{

			float r = atanf(pos.y/pos.x);//需要特殊处理34象限
			if (pos.x<0)
			{
				r += 180.0f;
			}
			//float r = atan2f(pos.y,pos.x);//这个不需要特殊处理34象限
			d = CC_RADIANS_TO_DEGREES(r);
		}

atanf 貌似得不出34象限,需要另外加180度,或者试试用atan2f

CCPoint pos = m_pCtrl->getPoint();
float l = sqrtf(pos.xpos.x+pos.ypos.y);
float d = 0;
if (0==pos.x)
{
d = pos.y>0? -90.0f: 90.0f;
}
else
{

			float r = atanf(pos.y/pos.x);//需要特殊处理34象限
			if (pos.x<0)
			{
				r += 180.0f;
			}
			//float r = atan2f(pos.y,pos.x);//这个不需要特殊处理34象限
			d = CC_RADIANS_TO_DEGREES(r);
		}