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

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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zanglengyu

敲碗要饭

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

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

打赏作者

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

抵扣说明:

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

余额充值