Sutherland–Hodgman algorithm: Difference between revisions

Content deleted Content added
WP is not a source code repository; that is too long, improperly sourced/attributed, and redundant given the pseudocode
Line 35:
 
''ComputeIntersection'' is a trivial function, omitted here for clarity, which returns the intersection of a line segment and an infinite edge. Note that it is only called if such an intersection is known to exist, and hence can simply treat both lines as being infinitely long.
 
==Working Code in C++==
<source lang="cpp">
//Sutherland-Hodgman Polygon Clipping
//Copyright © 2015 by Mohammad Nazmul Saqib.
#include <iostream>
#include <vector>
#include "graphics.h"
#include "Line2d.h"
#include "Coordinates2d.h"
#include "Polygon2d.h"
 
class ClippingPolygon2d
{
private:
Polygon2d clippingPolygon;
Polygon2d candidatePolygon;
 
public:
ClippingPolygon2d(){}
 
void SetCandidatePolygon(Polygon2d & pol)
{
candidatePolygon = pol;
}
 
void SetClippingPolygon(Polygon2d & pol)
{
clippingPolygon = pol;
}
 
public:
std::vector<Point2d> GetClippedPoints()
{
std::vector<Point2d> polygonVertices = candidatePolygon.GetVertices();
std::vector<Point2d> clipping = clippingPolygon.GetVertices();
 
for (size_t i = 0; i < clipping.size(); i++)
{
Line2d clippingEdge(clipping[i], clipping[(i + 1) % clipping.size()]);
std::vector<Point2d> temp;
 
for (size_t j = 0; j < polygonVertices.size(); j++)
{
Point2d polygonEdgeStart = polygonVertices[j];
Point2d polygonEdgeEnd = polygonVertices[(j + 1) % polygonVertices.size()];
 
if (clippingEdge.onLeft(polygonEdgeStart))
{
if (clippingEdge.onLeft(polygonEdgeEnd))
{
temp.push_back(polygonEdgeEnd);
}
else //Right
{
temp.push_back(clippingEdge.GetIntersectionExtended(Line2d(polygonEdgeStart, polygonEdgeEnd)));
}
}
else //Right
{
if (clippingEdge.onLeft(polygonEdgeEnd))
{
temp.push_back(clippingEdge.GetIntersectionExtended(Line2d(polygonEdgeStart, polygonEdgeEnd)));
temp.push_back(polygonEdgeEnd);
}
else //Right
{
// nothing to do: outside of the window
}
}
}
polygonVertices = temp;
}
return polygonVertices;
}
};
 
int main()
{
//////////////////////// Initialize /////////////////////////
Coordinates2d::ShowWindow("Sutherland-Hodgman Line Clipping");
///////////////////////////////////////////////////////////////
 
Polygon2d clippingPolygon;
clippingPolygon.Add(20,20);
clippingPolygon.Add(200,20);
clippingPolygon.Add(200,160);
clippingPolygon.Add(20,160);
Polygon2d candidatePolygon;
candidatePolygon.Add(Point2d(-20, 80));
candidatePolygon.Add(Point2d(10, 80));
candidatePolygon.Add(Point2d(110, 180));
candidatePolygon.Add(Point2d(210, 80));
candidatePolygon.Add(Point2d(240, 80));
candidatePolygon.Add(Point2d(110, 210));
 
ClippingPolygon2d clip;
clip.SetClippingPolygon(clippingPolygon);
clip.SetCandidatePolygon(candidatePolygon);
 
std::vector<Point2d> clippedVerticesList = clip.GetClippedPoints();
 
Coordinates2d::Draw(candidatePolygon, Red);
Coordinates2d::Draw(clippingPolygon, Magenta);
 
Polygon2d poly2(clippedVerticesList);
 
Coordinates2d::Draw(poly2, Yellow);
 
/////////////////////// Finalize /////////////////////////////
Coordinates2d::Wait();
return 0;
///////////////////////////////////////////////////////////////
}
</source>
 
==See also==