求旋转矩形的四个顶点坐标,用来做旋转矩形的碰撞检测

package com.example.com.android.test;

import java.util.Vector; import java.lang.Math;

import android.util.Log; public class MySprite {  private float mRotation = 0;  private float mWidth = 10;  private float mHeight = 20;  private CCPoint mPosition = new CCPoint();  private final static double PI = 3.1415926;  private Vector<CCPoint> mConstFourPoints = new Vector<CCPoint>(4);    private Vector<CCPoint>  mFourPoints = new Vector<CCPoint>(4);    MySprite()  {   initConstPoints();  }  MySprite(float rotation,float width,float height)  { //  mPosition.m_fPositionX = 10; //  mPosition.m_fPositionY = 20;   initRotatedSpriteRecet(rotation,width,height);  }    public void setWidth(float wth)  {   mWidth = wth;  }    public void setHeight(float height)  {   mHeight = height;  }    public float getWidth()  {   return mWidth;  }    public float getHeight()  {   return mHeight;  }    public class CCPoint  {   float m_fPositionX = 0;   float m_fPositionY = 0;  }    private void initConstPoints()  {   for(int i=0; i!=4; ++i)   {    CCPoint tempPoint = new CCPoint();    if(i%2 == 0 )    {     tempPoint.m_fPositionX = mPosition.m_fPositionX + mWidth/2;    }    else    {     tempPoint.m_fPositionX = mPosition.m_fPositionX - mWidth/2;    }        if(i<2)    {     tempPoint.m_fPositionY = mPosition.m_fPositionY + mHeight/2;    }    else    {     tempPoint.m_fPositionY = mPosition.m_fPositionY - mHeight/2;    }    mConstFourPoints.add(tempPoint);    mFourPoints.add(tempPoint);   }    //  for(int i=0; i!=mConstFourPoints.size(); ++i) //  { //   Log.d("CCPoint","Position " + i +" = ("+mFourPoints.get(i).m_fPositionX+","+mFourPoints.get(i).m_fPositionY+")"); //  }  }    public void initRotatedSpriteRecet(float rotation,float width,float height)  {   mRotation = rotation;   mWidth = width;   mHeight = height;   initConstPoints();   newRotationPosition(mRotation);  }    public void newRotationPosition(float rotation)  {   double dirRectPositionX = mPosition.m_fPositionX - mConstFourPoints.get(0).m_fPositionX;   double dirRectPositionY = mPosition.m_fPositionY - mConstFourPoints.get(0).m_fPositionY;   double dirRectSqrt = dirRectPositionX * dirRectPositionX + dirRectPositionY * dirRectPositionY;   double dirRect = Math.sqrt(dirRectSqrt);      double constRotation = Math.asin(mHeight/(2 *dirRect));   double rotation360_1 = constRotation*180/PI;   double appendRotation1 = rotation360_1 + rotation;   double appendRotationPI1 = appendRotation1 * PI/180;   double dirEndPositionY1  = dirRect * Math.sin(appendRotationPI1);   double dirEndPositionX1 = dirRect * Math.cos(appendRotationPI1);      double rotation360_2 = 180 -constRotation*180/PI;   double appendRotation2 = rotation360_2 + rotation;   double appendRotationPI2 = appendRotation2 * PI/180;   double dirEndPositionY2  = dirRect * Math.sin(appendRotationPI2);   double dirEndPositionX2 = dirRect * Math.cos(appendRotationPI2);      mFourPoints.get(0).m_fPositionX = mPosition.m_fPositionX + (float)dirEndPositionX1;   mFourPoints.get(0).m_fPositionY = mPosition.m_fPositionY + (float)dirEndPositionY1;   

  mFourPoints.get(1).m_fPositionX = mPosition.m_fPositionX + (float)dirEndPositionX2;   mFourPoints.get(1).m_fPositionY = mPosition.m_fPositionY + (float)dirEndPositionY2;      mFourPoints.get(2).m_fPositionX = mPosition.m_fPositionX - (float)dirEndPositionX2;   mFourPoints.get(2).m_fPositionY = mPosition.m_fPositionY - (float)dirEndPositionY2;      mFourPoints.get(3).m_fPositionX = mPosition.m_fPositionX - (float)dirEndPositionX1;   mFourPoints.get(3).m_fPositionY = mPosition.m_fPositionY - (float)dirEndPositionY1;   printfPointsPosition();  }  public void printfPointsPosition()  {   for(int i=0; i!=mFourPoints.size(); ++i)   {    Log.d("CCPoint","Position " + i +" = ("+mFourPoints.get(i).m_fPositionX+","+mFourPoints.get(i).m_fPositionY+")");   }      double dir1X = (mFourPoints.get(0).m_fPositionX - mFourPoints.get(1).m_fPositionX)*(mFourPoints.get(0).m_fPositionX - mFourPoints.get(1).m_fPositionX);   double dir1Y = (mFourPoints.get(0).m_fPositionY - mFourPoints.get(1).m_fPositionY)*(mFourPoints.get(0).m_fPositionY - mFourPoints.get(1).m_fPositionY);      double dir3X = (mFourPoints.get(0).m_fPositionX - mFourPoints.get(2).m_fPositionX)*(mFourPoints.get(0).m_fPositionX - mFourPoints.get(2).m_fPositionX);   double dir3Y = (mFourPoints.get(0).m_fPositionY - mFourPoints.get(2).m_fPositionY)*(mFourPoints.get(0).m_fPositionY - mFourPoints.get(2).m_fPositionY);      double dir13X = (mFourPoints.get(1).m_fPositionX - mFourPoints.get(2).m_fPositionX)*(mFourPoints.get(1).m_fPositionX - mFourPoints.get(2).m_fPositionX);   double dir13Y = (mFourPoints.get(1).m_fPositionY - mFourPoints.get(2).m_fPositionY)*(mFourPoints.get(1).m_fPositionY - mFourPoints.get(2).m_fPositionY);      double dir1 = dir1X + dir1Y;   double dir3 = dir3X + dir3Y + dir1;   double dir13 = dir13X + dir13Y;   Log.d("CCPoint","is equals!! " + dir3 + " dir13 " + dir13);  }    static boolean insertPersonRect(MySprite sprite1,MySprite sprite2)  {   float sprite1Radius = (float)Math.sqrt(sprite1.mWidth*sprite1.mWidth + sprite1.mHeight*sprite1.mHeight)/2;   float sprite2Radius = (float)Math.sqrt(sprite2.mWidth*sprite2.mWidth + sprite2.mHeight*sprite2.mHeight)/2;      float dirFormSp1ToSp2 = (float)Math.sqrt((sprite2.mPosition.m_fPositionX-sprite1.mPosition.m_fPositionX)*(sprite2.mPosition.m_fPositionY-sprite1.mPosition.m_fPositionY));      if(sprite1Radius + sprite2Radius < dirFormSp1ToSp2)   {    return false;   }   else   {    double rotationPI = MySprite.rotationToPI(sprite1.mRotation);    float cosValue = Math.abs((float)Math.cos(rotationPI));    if(Math.cos(rotationPI) < 1e-10 && Math.cos(rotationPI) > -1e-10)    {           //精灵角度为90度或者270,矩形长宽调整,直接判断         }    else if((cosValue-1) < 1e-10 && (cosValue-1) > -1e-10)    {     //精灵角度为0度或者360度,直接判断    }    else    {         }    int equals0 = Float.compare(sprite1.mRotation,0); //   int equals0 = Float.compare(sprite1.mRotation,0); //   int equals0 = Float.compare(sprite1.mRotation,0); //   int equals0 = Float.compare(sprite1.mRotation,0);       }   //if(Person.)   return false;  }    static double rotationToPI(float rotation)  {   return rotation *PI/180;  }    static float PIToRotation(double PIrotation)  {   return (float)(PIrotation*180/PI);  } }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zanglengyu

敲碗要饭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值