Пример #1
0
void Poly::SortVerticesCW ( )
{
	//
	// Calculate center of polygon
	//
	Vector3	center;

	for ( int i = 0; i < GetNumberOfVertices ( ); i++ )
	{
		center = center + verts[ i ].p;
	}

	center = center / GetNumberOfVertices ( );

	//
	// Sort vertices
	//
	for ( i = 0; i < GetNumberOfVertices ( ) - 2; i++ )
	{
		Vector3	a;
		Plane	p;
		double	SmallestAngle	= -1;
		int		Smallest		= -1;

		a = verts[ i ].p - center;
		a.Normalize ( );

		p.PointsToPlane ( verts[ i ].p, center, center + plane.n );

		for ( int j = i + 1; j < GetNumberOfVertices ( ); j++ )
		{
			if ( p.ClassifyPoint ( verts[ j ].p ) != Plane::eCP::BACK )
			{
				Vector3	b;
				double	Angle;
				
				b = verts[ j ].p - center;
				b.Normalize ( );

				Angle = a.Dot ( b );

				if ( Angle > SmallestAngle )
				{
					SmallestAngle	= Angle;
					Smallest		= j;
				}
			}
		}

		if ( Smallest == -1 )
		{
			cout << "Error: Degenerate polygon!" << endl;

			abort ( );
		}

		Vertex	t			= verts[ Smallest ];
		verts[ Smallest ]	= verts[ i + 1 ];
		verts[ i + 1 ]		= t;
	}

	//
	// Check if vertex order needs to be reversed for back-facing polygon
	//
	Plane	oldPlane = plane;

	CalculatePlane ( );

	if ( plane.n.Dot ( oldPlane.n ) < 0 )
	{
		int j = GetNumberOfVertices ( );

		for ( int i = 0; i < j / 2; i++ )
		{
			Vertex v			= verts[ i ];
			verts[ i ]			= verts[ j - i - 1 ];
			verts[ j - i - 1 ]	= v;
		}
	}
}