b2Polygon.h
上传用户:gb3593
上传日期:2022-01-07
资源大小:3028k
文件大小:4k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2.  * Copyright (c) 2007 Eric Jordan
  3.  *
  4.  * This software is provided 'as-is', without any express or implied
  5.  * warranty.  In no event will the authors be held liable for any damages
  6.  * arising from the use of this software.
  7.  * Permission is granted to anyone to use this software for any purpose,
  8.  * including commercial applications, and to alter it and redistribute it
  9.  * freely, subject to the following restrictions:
  10.  * 1. The origin of this software must not be misrepresented; you must not
  11.  * claim that you wrote the original software. If you use this software
  12.  * in a product, an acknowledgment in the product documentation would be
  13.  * appreciated but is not required.
  14.  * 2. Altered source versions must be plainly marked as such, and must not be
  15.  * misrepresented as being the original software.
  16.  * 3. This notice may not be removed or altered from any source distribution.
  17.  */
  18. #ifndef B2_POLYGON_H
  19. #define B2_POLYGON_H
  20. #include "Box2D.h"
  21. #include "b2Triangle.h"
  22. class b2Polygon;
  23. int32 remainder(int32 x, int32 modulus);
  24. int32 TriangulatePolygon(float32* xv, float32* yv, int32 vNum, b2Triangle* results);
  25. bool IsEar(int32 i, float32* xv, float32* yv, int32 xvLength); //Not for external use
  26. int32 PolygonizeTriangles(b2Triangle* triangulated, int32 triangulatedLength, b2Polygon* polys, int32 polysLength);
  27. int32 DecomposeConvex(b2Polygon* p, b2Polygon* results, int32 maxPolys);
  28. void DecomposeConvexAndAddTo(b2Polygon* p, b2Body* bd, b2FixtureDef* prototype);
  29. b2Polygon ConvexHull(b2Vec2* v, int nVert);
  30. b2Polygon ConvexHull(float32* cloudX, float32* cloudY, int32 nVert);
  31. void ReversePolygon(float32* x, float32* y, int n);
  32. b2Polygon TraceEdge(b2Polygon* p); //For use with self-intersecting polygons, finds outline
  33. class b2Polygon {
  34. public:
  35.     const static int32 maxVerticesPerPolygon = b2_maxPolygonVertices;
  36.     float32* x; //vertex arrays
  37.     float32* y;
  38.     int32 nVertices;
  39. float32 area;
  40. bool areaIsSet;
  41.     b2Polygon(float32* _x, float32* _y, int32 nVert);
  42.     b2Polygon(b2Vec2* v, int32 nVert);
  43. b2Polygon();
  44.     ~b2Polygon();
  45. float32 GetArea();
  46. void MergeParallelEdges(float32 tolerance);
  47.     b2Vec2* GetVertexVecs();
  48.     b2Polygon(b2Triangle& t);
  49.     void Set(const b2Polygon& p);
  50.     bool IsConvex();
  51. bool IsCCW();
  52. bool IsUsable(bool printError);
  53. bool IsUsable();
  54.     bool IsSimple();
  55.     void AddTo(b2FixtureDef& pd);
  56.     b2Polygon* Add(b2Triangle& t);
  57. void print(){
  58. printFormatted();
  59. // for (int32 i=0; i<nVertices; ++i){
  60. // printf("i: %d, x:%f, y:%fn",i,x[i],y[i]);
  61. // }
  62. }
  63. void printFormatted(){
  64. printf("float xv[] = {");
  65. for (int32 i=0; i<nVertices; ++i){
  66. printf("%ff,",x[i]);
  67. }
  68. printf("};nfloat yv[] = {");
  69. for (int32 i=0; i<nVertices; ++i){
  70. printf("%ff,",y[i]);
  71. }
  72. printf("};n");
  73. }
  74.     
  75. b2Polygon(const b2Polygon& p){
  76. nVertices = p.nVertices;
  77. area = p.area;
  78. areaIsSet = p.areaIsSet;
  79. x = new float32[nVertices];
  80. y = new float32[nVertices];
  81. memcpy(x, p.x, nVertices * sizeof(float32));
  82. memcpy(y, p.y, nVertices * sizeof(float32));
  83. }
  84. };
  85. const int32 MAX_CONNECTED = 32;
  86. const float32 COLLAPSE_DIST_SQR = FLT_EPSILON*FLT_EPSILON;//0.1f;//1000*FLT_EPSILON*1000*FLT_EPSILON;
  87. class b2PolyNode{
  88. public:
  89. b2Vec2 position;
  90. b2PolyNode* connected[MAX_CONNECTED];
  91. int32 nConnected;
  92. bool visited;
  93. b2PolyNode(b2Vec2& pos);
  94. b2PolyNode();
  95. void AddConnection(b2PolyNode& toMe);
  96. void RemoveConnection(b2PolyNode& fromMe);
  97. void RemoveConnectionByIndex(int32 index);
  98. bool IsConnectedTo(b2PolyNode& me);
  99. b2PolyNode* GetRightestConnection(b2PolyNode* incoming);
  100. b2PolyNode* GetRightestConnection(b2Vec2& incomingDir);
  101. };
  102. #endif