c语言结构体实现矩形顶点坐标,求旋转矩形的四个顶点坐标,用来做旋转矩形的碰撞检测...

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 mConstFourPoints = new Vector(4);

private Vector  mFourPoints = new Vector(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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值