type
vertex = point; {point hold real x,y}
edge = array[1..2] of vertex;
vertexArray = array[1..MAX] of vertex; {MAX is a declared constant}
procedure SutherlandHodgmanPolygoClip (
inVertexArray : vertexArray; {Input vertex array}
var outVertexArray : vertexArray; {Output vertex array}
inLength : integer; {Number of entries in inVertexArray}
var outLength : integer; {Number of entries in outVertexArray}
clipBoundary : edge); {Edge of clip polygon}
var
s,p, {Start, end point of current polygon edge}
i : vertex; {Intersection point with a clip boundary}
j : integer; {Vertex loop counter}
procedure Output(
newVertex : vertex;
var outLength : integer; var outVertexArray : vertexArray);
{Adds newVertex to outVertexArray and then updates outLength }
begin
...
end;
function Inside(testVertex : vertex; clipBoundary : edge):boolean;
{Checks whether the vertex lies inside the clip edge or not}
begin
...
end;
procedure Intersect(first,second:vertex; clipBoundary:edge;
var intersectPt:vertex);
{Clips polygon edge (first,second) against clipBoundary, outputs the
new point}
begin
...
end;
begin
outLength := 0;
s := inVertexArray[inLength];
{Start with the last vertex in inVertexArray}
for j := 1 to inLength do
begin
p := inVertexArray[j]; {Now s and p correspond to the vertices in
Fig. 3.48}
if Inside(p,clipBoundary) then {Cases 1 and 4}
if Inside(s, clipBoundary) then
Output(p, outLength, outVertexArray) {Case 1}
else
begin
Intersect(s, p, clipBoundary, i);
Output(i, outLength, outVertexArray);
Output(p, outLength, outVertexArray)
end
else {Cases 2 and 3}
if Inside(s, clipBoundary) then {Cases 2}
begin
Intersect(s, p, clipBoundary, i);
Output(i, outLength, outVertexArray)
end; {No action for case 3}
s := p {Advance to next pair of vertices}
end {for}
end; {SutherlandHodgmanPolygonClip}
Go back to Clipping polygons