00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __UT_Convex__
00023 #define __UT_Convex__
00024
00025 #include "UT_API.h"
00026 #include <SYS/SYS_Types.h>
00027 #include <stdlib.h>
00028
00029 class UT_ConvexPoint;
00030 class UT_Interrupt;
00031
00032 class UT_API UT_Convex {
00033 public:
00034 UT_Convex()
00035 {
00036 myData = 0;
00037 myConvexInfo = 0;
00038 myConvexSize = 0;
00039 myConvexEntries = 0;
00040 myPointList = 0;
00041 myPointSize = 0;
00042 }
00043 virtual ~UT_Convex()
00044 {
00045 if (myConvexInfo) free(myConvexInfo);
00046 if (myPointList) free(myPointList);
00047 }
00048
00049 int isConcave();
00050 void convex(int maxsides);
00051
00052 virtual void initialize();
00053
00054 virtual int getPointCount() const = 0;
00055 virtual void getPoint(int num, float &x, float &y) const = 0;
00056
00057
00058 virtual void beginPolygon(int npoints, int lastone) = 0;
00059 virtual void polyVertex(int num) = 0;
00060 virtual void endPolygon() = 0;
00061
00062
00063
00064
00065 virtual void earlyTermination();
00066
00067 private:
00068 UT_ConvexPoint *polySetup();
00069 int leftOrRight(int v1, int v2, int v3, int &double_back);
00070 int leftOrRight(int v1, int v2, int v3)
00071 {
00072 int double_back;
00073 return leftOrRight(v1, v2, v3, double_back);
00074 }
00075 unsigned leftMost(unsigned a, unsigned b, int &ccwise);
00076 unsigned testConcave(unsigned m, unsigned n);
00077 int arePointsDifferent(unsigned m, unsigned n);
00078 int isDegenerate(unsigned m, unsigned n);
00079 int addPolygon(
00080 UT_Interrupt *boss, unsigned m,
00081 unsigned n, unsigned, unsigned &next);
00082 void doSplit(unsigned m, unsigned m1,
00083 unsigned n1, unsigned n);
00084 unsigned cornerTest(int side, unsigned la, unsigned lb,
00085 unsigned m, unsigned n);
00086 unsigned insideOut(unsigned k, unsigned la,
00087 unsigned lb, unsigned m, unsigned n);
00088 unsigned chooseCoincidentIntruder(
00089 unsigned l, unsigned k1, unsigned k2,
00090 unsigned m, unsigned n, unsigned ccwise);
00091 unsigned findBest(unsigned lb, unsigned la,
00092 unsigned ls, unsigned m, unsigned n);
00093 unsigned testIntersect(unsigned l, unsigned lb, unsigned la,
00094 unsigned m, unsigned n, int &ccwise);
00095
00096 protected:
00097 UT_ConvexPoint *myData;
00098
00099 private:
00100 UT_ConvexPoint *myConvexInfo;
00101 unsigned myConvexSize;
00102 unsigned myConvexEntries;
00103 int *myPointList;
00104 unsigned myPointSize;
00105 };
00106
00107 #endif
00108