Go to the documentation of this file.00001 #include <stdlib.h>
00002
00003
00004 #include "Obb2D.h"
00005 #include <iostream>
00006
00007
00008 OBB2D::OBB2D()
00009 {
00010 }
00011
00012 OBB2D::~OBB2D()
00013 {
00014 }
00015
00016 std::pair<CVec2,CVec2> OBB2D::computeAABB() const
00017 {
00018 CVec2 mins(999999,999999);
00019 CVec2 maxs(-999999,-999999);
00020 for (int i=0;i<4;i++)
00021 {
00022 if (mPoints[i][0]<mins[0]) mins[0]=mPoints[i][0];
00023 if (mPoints[i][1]<mins[1]) mins[1]=mPoints[i][1];
00024 if (mPoints[i][0]>maxs[0]) maxs[0]=mPoints[i][0];
00025 if (mPoints[i][1]>maxs[1]) maxs[1]=mPoints[i][1];
00026 }
00027 return std::make_pair(mins,maxs);
00028 }
00029
00030
00031 int clipEdge(const CVec2* points, int numPoints, const CVec2& clipStart, const CVec2& clipEnd, CVec2* dest)
00032 {
00033 int result=0;
00034
00035
00036 CVec2 n(clipEnd[1] - clipStart[1],
00037 clipStart[0] - clipEnd[0]);
00038
00039
00040
00041 float d0=clipStart*n;
00042
00043 int i=numPoints-1;
00044 for (int iNext=0;iNext<numPoints;iNext++)
00045 {
00046 const CVec2& a=points[i];
00047 const CVec2& b=points[iNext];
00048
00049 float adotn=a*n;
00050 float bdotn=b*n;
00051 float da=adotn-d0;
00052 float db=bdotn-d0;
00053
00054 if (da<=0)
00055 {
00056 if (db<=0)
00057 {
00058
00059
00060 dest[result++]=b;
00061 }
00062 else
00063 {
00064
00065 float t=-da/(bdotn-adotn);
00066
00067 dest[result++]=a+t*(b-a);
00068 }
00069 }
00070 else
00071 {
00072 if (db<=0)
00073 {
00074
00075 float t=-da/(bdotn-adotn);
00076
00077
00078 dest[result++]=a+t*(b-a);
00079 dest[result++]=b;
00080 }
00081 else
00082 {
00083
00084 }
00085 }
00086
00087 i=iNext;
00088 }
00089
00090 return result;
00091 }
00092
00093 float OBB2D::computeClippedArea(const OBB2D& clipPoly)
00094 {
00095 CVec2* tmp1=(CVec2*)alloca(20*sizeof(CVec2));
00096 CVec2* tmp2=(CVec2*)alloca(20*sizeof(CVec2));
00097
00098 int res=0;
00099
00100 res=clipEdge(mPoints,4,clipPoly[3],clipPoly[0],tmp1);
00101 res=clipEdge(tmp1,res,clipPoly[0],clipPoly[1],tmp2);
00102 res=clipEdge(tmp2,res,clipPoly[1],clipPoly[2],tmp1);
00103 res=clipEdge(tmp1,res,clipPoly[2],clipPoly[3],tmp2);
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 float area=0;
00115 for (int i=0;i<res;i++)
00116 {
00117 area+=(tmp2[i][1]+tmp2[(i+1)%res][1])*(tmp2[i][0]-tmp2[(i+1)%res][0]);
00118 }
00119 area=0.5f*fabs(area);
00120 return area;
00121 }
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149