You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.3 KiB
98 lines
3.3 KiB
// COTD Entry submitted by John W. Ratcliff [jratcliff@verant.com]
|
|
|
|
// ** THIS IS A CODE SNIPPET WHICH WILL EFFICIEINTLY TRIANGULATE ANY
|
|
// ** POLYGON/CONTOUR (without holes) AS A STATIC CLASS. THIS SNIPPET
|
|
// ** IS COMPRISED OF 3 FILES, TRIANGULATE.H, THE HEADER FILE FOR THE
|
|
// ** TRIANGULATE BASE CLASS, TRIANGULATE.CPP, THE IMPLEMENTATION OF
|
|
// ** THE TRIANGULATE BASE CLASS, AND TEST.CPP, A SMALL TEST PROGRAM
|
|
// ** DEMONSTRATING THE USAGE OF THE TRIANGULATOR. THE TRIANGULATE
|
|
// ** BASE CLASS ALSO PROVIDES TWO USEFUL HELPER METHODS, ONE WHICH
|
|
// ** COMPUTES THE AREA OF A POLYGON, AND ANOTHER WHICH DOES AN EFFICENT
|
|
// ** POINT IN A TRIANGLE TEST.
|
|
// ** SUBMITTED BY JOHN W. RATCLIFF (jratcliff@verant.com) July 22, 2000
|
|
|
|
/**********************************************************************/
|
|
/************ HEADER FILE FOR TRIANGULATE.H ***************************/
|
|
/**********************************************************************/
|
|
|
|
|
|
#ifndef TRIANGULATE_H
|
|
|
|
#define TRIANGULATE_H
|
|
|
|
/*****************************************************************/
|
|
/** Static class to triangulate any contour/polygon efficiently **/
|
|
/** You should replace Vector2d with whatever your own Vector **/
|
|
/** class might be. Does not support polygons with holes. **/
|
|
/** Uses STL vectors to represent a dynamic array of vertices. **/
|
|
/** This code snippet was submitted to FlipCode.com by **/
|
|
/** John W. Ratcliff (jratcliff@verant.com) on July 22, 2000 **/
|
|
/** I did not write the original code/algorithm for this **/
|
|
/** this triangulator, in fact, I can't even remember where I **/
|
|
/** found it in the first place. However, I did rework it into **/
|
|
/** the following black-box static class so you can make easy **/
|
|
/** use of it in your own code. Simply replace Vector2d with **/
|
|
/** whatever your own Vector implementation might be. **/
|
|
/*****************************************************************/
|
|
|
|
|
|
#include <vector> // Include STL vector class.
|
|
|
|
class Vector2d
|
|
{
|
|
public:
|
|
Vector2d(float x,float y)
|
|
{
|
|
Set(x,y);
|
|
};
|
|
|
|
float GetX(void) const { return mX; };
|
|
|
|
float GetY(void) const { return mY; };
|
|
|
|
void Set(float x,float y)
|
|
{
|
|
mX = x;
|
|
mY = y;
|
|
};
|
|
private:
|
|
float mX;
|
|
float mY;
|
|
};
|
|
|
|
// Typedef an STL vector of vertices which are used to represent
|
|
// a polygon/contour and a series of triangles.
|
|
typedef std::vector< Vector2d > Vector2dVector;
|
|
|
|
|
|
class Triangulate
|
|
{
|
|
public:
|
|
|
|
// triangulate a contour/polygon, places results in STL vector
|
|
// as series of triangles.
|
|
static bool Process(const Vector2dVector &contour,
|
|
Vector2dVector &result);
|
|
|
|
// compute area of a contour/polygon
|
|
static float Area(const Vector2dVector &contour);
|
|
|
|
// decide if point Px/Py is inside triangle defined by
|
|
// (Ax,Ay) (Bx,By) (Cx,Cy)
|
|
static bool InsideTriangle(float Ax, float Ay,
|
|
float Bx, float By,
|
|
float Cx, float Cy,
|
|
float Px, float Py);
|
|
|
|
|
|
private:
|
|
static bool Snip(const Vector2dVector &contour,int u,int v,int w,int n,int *V);
|
|
|
|
};
|
|
|
|
|
|
#endif
|
|
|
|
/**************************************************************************/
|
|
/*** END OF HEADER FILE TRIANGULATE.H BEGINNING OF CODE TRIANGULATE.CPP ***/
|
|
/**************************************************************************/
|
|
|