Obb2D.cpp
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 // Polygon an Kante (clipStart, clipEnd) clippen, Originalpunkte werden ueberschrieben
00031 int clipEdge(const CVec2* points, int numPoints, const CVec2& clipStart, const CVec2& clipEnd, CVec2* dest)
00032 {
00033         int result=0;
00034 
00035         // Normale zeigt nach aussen
00036         CVec2 n(clipEnd[1] - clipStart[1],
00037                        clipStart[0] - clipEnd[0]);
00038 
00039         //n=n*(-1);
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                                 // beide innerhalb
00059                                 //outputPoints.push_back(b);
00060                                 dest[result++]=b;
00061                         }
00062                         else
00063                         {
00064                                 // a drinnen, b draussen => schnittpunkt
00065                                 float t=-da/(bdotn-adotn);
00066                                 //outputPoints.push_back(a+t*(b-a));
00067                                 dest[result++]=a+t*(b-a);
00068                         }
00069                 }
00070                 else
00071                 {
00072                         if (db<=0)
00073                         {
00074                                 // a draussen, b drinnen => schnittpunkt
00075                                 float t=-da/(bdotn-adotn);
00076                                 //outputPoints.push_back(a+t*(b-a));
00077                                 //outputPoints.push_back(b);
00078                                 dest[result++]=a+t*(b-a);
00079                                 dest[result++]=b;
00080                         }
00081                         else
00082                         {
00083                                 // beide ausserhalb
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         static int maxres=0;
00107         if (res>=maxres)
00108         {
00109                 std::cout << "res: " << res << std::endl;
00110                 maxres=res;
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 /*float Polygon2D::computeArea() const
00124 {
00125 #if 0
00126         float area=0;
00127         CVec2 last=mPoints[1];
00128         for (int i=2;i<mPoints.size();i++)
00129         {
00130                 CVec2 a=last-mPoints[0];
00131                 CVec2 b=mPoints[i]-mPoints[0];
00132                 area+=0.5f*fabs(a.x*b.y-a.y*b[0]);
00133 
00134                 last=mPoints[i];
00135         }
00136         return area;
00137 #else
00138         float area2=0;
00139         for (int i=0;i<mPoints.size();i++)
00140         {
00141                 area2+=(mPoints[i][1]+mPoints[(i+1)%mPoints.size()][1])*(mPoints[i][0]-mPoints[(i+1)%mPoints.size()][0]);//mPoints[i].x*mPoints[i+1].y-mPoints[i+1].x*mPoints[i][1];
00142         }
00143         area2=0.5f*fabs(area2);
00144         //std::cout << "area: " << area << " " << area2 << std::endl;
00145         return area2;
00146 #endif
00147 }*/
00148 //----------------------------------------------------------------------------------------------------------
00149 


robbie_architecture
Author(s): Viktor Seib
autogenerated on Mon Oct 6 2014 02:53:09