Sutherland-Hodgman polygon clipping: Difference between revisions

Content added Content deleted
m (→‎{{header|Phix}}: syntax coloured, added online link)
Line 2,550: Line 2,550:
=={{header|Phix}}==
=={{header|Phix}}==
{{libheader|Phix/pGUI}}
{{libheader|Phix/pGUI}}
{{libheader|Phix/online}}
<lang Phix>-- demo\rosetta\Sutherland_Hodgman_polygon_clipping.exw
You can run this online [http://phix.x10.mx/p2js/shpc.htm here].
enum X,Y
<!--<lang Phix>(phixonline)-->

<span style="color: #000080;font-style:italic;">--
function inside(sequence cp1, sequence cp2, sequence p)
-- demo\rosetta\Sutherland_Hodgman_polygon_clipping.exw
return (cp2[X]-cp1[X])*(p[Y]-cp1[Y])>(cp2[Y]-cp1[Y])*(p[X]-cp1[X])
-- ====================================================
end function
--</span>

<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
function intersection(sequence cp1, sequence cp2, sequence s, sequence e)
<span style="color: #008080;">enum</span> <span style="color: #000000;">X</span><span style="color: #0000FF;">,</span><span style="color: #000000;">Y</span>
atom {dcx,dcy} = {cp1[X]-cp2[X],cp1[Y]-cp2[Y]},
{dpx,dpy} = {s[X]-e[X],s[Y]-e[Y]},
<span style="color: #008080;">function</span> <span style="color: #000000;">inside</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">cp1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cp2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">)</span>
n1 = cp1[X]*cp2[Y]-cp1[Y]*cp2[X],
<span style="color: #008080;">return</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">cp2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">cp1</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">])*(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">cp1</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">])>(</span><span style="color: #000000;">cp2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">cp1</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">])*(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">cp1</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">])</span>
n2 = s[X]*e[Y]-s[Y]*e[X],
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
n3 = 1/(dcx*dpy-dcy*dpx)
return {(n1*dpx-n2*dcx)*n3,(n1*dpy-n2*dcy)*n3}
<span style="color: #008080;">function</span> <span style="color: #000000;">intersect</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">cp1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cp2</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">e</span><span style="color: #0000FF;">)</span>
end function
<span style="color: #004080;">atom</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">dcx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">dcy</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">cp1</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">cp2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">],</span><span style="color: #000000;">cp1</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">cp2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">]},</span>

<span style="color: #0000FF;">{</span><span style="color: #000000;">dpx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">dpy</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">e</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">],</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">e</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">]},</span>
function sutherland_hodgman(sequence subjectPolygon, sequence clipPolygon)
<span style="color: #000000;">n1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cp1</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">]*</span><span style="color: #000000;">cp2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">cp1</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">]*</span><span style="color: #000000;">cp2</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">],</span>
sequence cp1, cp2, s, e, inputList, outputList = subjectPolygon
<span style="color: #000000;">n2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">]*</span><span style="color: #000000;">e</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">Y</span><span style="color: #0000FF;">]*</span><span style="color: #000000;">e</span><span style="color: #0000FF;">[</span><span style="color: #000000;">X</span><span style="color: #0000FF;">],</span>
cp1 = clipPolygon[$]
<span style="color: #000000;">n3</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">/(</span><span style="color: #000000;">dcx</span><span style="color: #0000FF;">*</span><span style="color: #000000;">dpy</span><span style="color: #0000FF;">-</span><span style="color: #000000;">dcy</span><span style="color: #0000FF;">*</span><span style="color: #000000;">dpx</span><span style="color: #0000FF;">)</span>
for i=1 to length(clipPolygon) do
<span style="color: #008080;">return</span> <span style="color: #0000FF;">{(</span><span style="color: #000000;">n1</span><span style="color: #0000FF;">*</span><span style="color: #000000;">dpx</span><span style="color: #0000FF;">-</span><span style="color: #000000;">n2</span><span style="color: #0000FF;">*</span><span style="color: #000000;">dcx</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">n3</span><span style="color: #0000FF;">,(</span><span style="color: #000000;">n1</span><span style="color: #0000FF;">*</span><span style="color: #000000;">dpy</span><span style="color: #0000FF;">-</span><span style="color: #000000;">n2</span><span style="color: #0000FF;">*</span><span style="color: #000000;">dcy</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">n3</span><span style="color: #0000FF;">}</span>
cp2 = clipPolygon[i]
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
inputList = outputList
outputList = {}
<span style="color: #008080;">function</span> <span style="color: #000000;">sutherland_hodgman</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">subjectPolygon</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">clipPolygon</span><span style="color: #0000FF;">)</span>
s = inputList[$]
<span style="color: #004080;">sequence</span> <span style="color: #000000;">cp1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">clipPolygon</span><span style="color: #0000FF;">[$],</span>
for j=1 to length(inputList) do
<span style="color: #000000;">outputList</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">subjectPolygon</span>
e = inputList[j]
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">clipPolygon</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
if inside(cp1,cp2,e) then
<span style="color: #004080;">sequence</span> <span style="color: #000000;">cp2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">clipPolygon</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span>
if not inside(cp1,cp2,s) then
<span style="color: #000000;">inputList</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">outputList</span><span style="color: #0000FF;">,</span>
outputList = append(outputList,intersection(cp1,cp2,s,e))
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">inputList</span><span style="color: #0000FF;">[$]</span>
end if
<span style="color: #000000;">outputList</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
outputList = append(outputList,e)
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">inputList</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
elsif inside(cp1,cp2,s) then
<span style="color: #004080;">sequence</span> <span style="color: #000000;">e</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">inputList</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span>
outputList = append(outputList,intersection(cp1,cp2,s,e))
<span style="color: #008080;">if</span> <span style="color: #000000;">inside</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cp1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">cp2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
end if
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">inside</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cp1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">cp2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
s = e
<span style="color: #000000;">outputList</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">outputList</span><span style="color: #0000FF;">,</span><span style="color: #000000;">intersect</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cp1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">cp2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">))</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
cp1 = cp2
<span style="color: #000000;">outputList</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">outputList</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #008080;">elsif</span> <span style="color: #000000;">inside</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cp1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">cp2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
return outputList
<span style="color: #000000;">outputList</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">outputList</span><span style="color: #0000FF;">,</span><span style="color: #000000;">intersect</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cp1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">cp2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">))</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>

<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">e</span>
constant subjectPolygon = {{50, 150}, {200, 50}, {350, 150}, {350, 300},
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
{250, 300}, {200, 250}, {150, 350}, {100, 250},
<span style="color: #000000;">cp1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">cp2</span>
{100, 200}},
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
clipPolygon = {{100, 100}, {300, 100}, {300, 300}, {100, 300}}
<span style="color: #008080;">return</span> <span style="color: #000000;">outputList</span>

<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
sequence clippedPolygon = sutherland_hodgman(subjectPolygon,clipPolygon)

<span style="color: #008080;">constant</span> <span style="color: #000000;">subjectPolygon</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">50</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">150</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">200</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">50</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">350</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">150</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">350</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">300</span><span style="color: #0000FF;">},</span>
include pGUI.e
<span style="color: #0000FF;">{</span><span style="color: #000000;">250</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">300</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">200</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">250</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">150</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">350</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">100</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">250</span><span style="color: #0000FF;">},</span>

<span style="color: #0000FF;">{</span><span style="color: #000000;">100</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">200</span><span style="color: #0000FF;">}},</span>
Ihandle dlg, canvas
<span style="color: #000000;">clipPolygon</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">100</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">100</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">300</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">100</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">300</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">300</span><span style="color: #0000FF;">},</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">100</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">300</span><span style="color: #0000FF;">}}</span>
cdCanvas cddbuffer, cdcanvas

<span style="color: #004080;">sequence</span> <span style="color: #000000;">clippedPolygon</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">sutherland_hodgman</span><span style="color: #0000FF;">(</span><span style="color: #000000;">subjectPolygon</span><span style="color: #0000FF;">,</span><span style="color: #000000;">clipPolygon</span><span style="color: #0000FF;">)</span>
procedure draw_poly(sequence poly)
cdCanvasBegin(cddbuffer,CD_FILL)
<span style="color: #008080;">include</span> <span style="color: #000000;">pGUI</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
for i=1 to length(poly) do
atom {x,y} = poly[i]
<span style="color: #004080;">Ihandle</span> <span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">canvas</span>
cdCanvasVertex(cddbuffer,x,y)
<span style="color: #004080;">cdCanvas</span> <span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cdcanvas</span>
end for
cdCanvasEnd(cddbuffer)
<span style="color: #008080;">procedure</span> <span style="color: #000000;">draw_poly</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">poly</span><span style="color: #0000FF;">)</span>
end procedure
<span style="color: #7060A8;">cdCanvasBegin</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span><span style="color: #004600;">CD_FILL</span><span style="color: #0000FF;">)</span>

<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">poly</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
function redraw_cb(Ihandle /*ih*/, integer /*posx*/, integer /*posy*/)
<span style="color: #004080;">atom</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">poly</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
cdCanvasActivate(cddbuffer)
<span style="color: #7060A8;">cdCanvasVertex</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">)</span>
cdCanvasClear(cddbuffer)
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
cdCanvasSetForeground(cddbuffer, CD_CYAN)
<span style="color: #7060A8;">cdCanvasEnd</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
draw_poly(subjectPolygon)
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
cdCanvasSetForeground(cddbuffer, CD_MAGENTA)
draw_poly(clipPolygon)
<span style="color: #008080;">function</span> <span style="color: #000000;">redraw_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000080;font-style:italic;">/*ih*/</span><span style="color: #0000FF;">)</span>
cdCanvasSetForeground(cddbuffer, CD_ORANGE)
<span style="color: #7060A8;">cdCanvasActivate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
draw_poly(clippedPolygon)
<span style="color: #7060A8;">cdCanvasClear</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
cdCanvasFlush(cddbuffer)
<span style="color: #7060A8;">cdCanvasSetForeground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CD_CYAN</span><span style="color: #0000FF;">)</span>
return IUP_DEFAULT
<span style="color: #000000;">draw_poly</span><span style="color: #0000FF;">(</span><span style="color: #000000;">subjectPolygon</span><span style="color: #0000FF;">)</span>
end function
<span style="color: #7060A8;">cdCanvasSetForeground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CD_MAGENTA</span><span style="color: #0000FF;">)</span>

<span style="color: #000000;">draw_poly</span><span style="color: #0000FF;">(</span><span style="color: #000000;">clipPolygon</span><span style="color: #0000FF;">)</span>
function map_cb(Ihandle ih)
<span style="color: #7060A8;">cdCanvasSetForeground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CD_ORANGE</span><span style="color: #0000FF;">)</span>
cdcanvas = cdCreateCanvas(CD_IUP, ih)
<span style="color: #000000;">draw_poly</span><span style="color: #0000FF;">(</span><span style="color: #000000;">clippedPolygon</span><span style="color: #0000FF;">)</span>
cddbuffer = cdCreateCanvas(CD_DBUFFER, cdcanvas)
<span style="color: #7060A8;">cdCanvasFlush</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">)</span>
cdCanvasSetBackground(cddbuffer, CD_WHITE)
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
cdCanvasSetForeground(cddbuffer, CD_GRAY)
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
return IUP_DEFAULT
end function
<span style="color: #008080;">function</span> <span style="color: #000000;">map_cb</span><span style="color: #0000FF;">(</span><span style="color: #004080;">Ihandle</span> <span style="color: #000000;">ih</span><span style="color: #0000FF;">)</span>

<span style="color: #000000;">cdcanvas</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">cdCreateCanvas</span><span style="color: #0000FF;">(</span><span style="color: #004600;">CD_IUP</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">ih</span><span style="color: #0000FF;">)</span>
procedure main()
<span style="color: #000000;">cddbuffer</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">cdCreateCanvas</span><span style="color: #0000FF;">(</span><span style="color: #004600;">CD_DBUFFER</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">cdcanvas</span><span style="color: #0000FF;">)</span>
IupOpen()
<span style="color: #7060A8;">cdCanvasSetBackground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CD_WHITE</span><span style="color: #0000FF;">)</span>

<span style="color: #7060A8;">cdCanvasSetForeground</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cddbuffer</span><span style="color: #0000FF;">,</span> <span style="color: #004600;">CD_GRAY</span><span style="color: #0000FF;">)</span>
canvas = IupCanvas(NULL)
<span style="color: #008080;">return</span> <span style="color: #004600;">IUP_DEFAULT</span>
IupSetAttribute(canvas, "RASTERSIZE", "400x400")
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
IupSetCallback(canvas, "MAP_CB", Icallback("map_cb"))
IupSetCallback(canvas, "ACTION", Icallback("redraw_cb"))
<span style="color: #008080;">procedure</span> <span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>

<span style="color: #7060A8;">IupOpen</span><span style="color: #0000FF;">()</span>
dlg = IupDialog(canvas)
<span style="color: #000000;">canvas</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupCanvas</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"RASTERSIZE=400x400"</span><span style="color: #0000FF;">)</span>
IupSetAttribute(dlg, "TITLE", "Sutherland-Hodgman polygon clipping")
<span style="color: #7060A8;">IupSetCallbacks</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"MAP_CB"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"map_cb"</span><span style="color: #0000FF;">),</span>
IupSetAttribute(dlg, "RESIZE", "NO")
<span style="color: #008000;">"ACTION"</span><span style="color: #0000FF;">,</span> <span style="color: #7060A8;">Icallback</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"redraw_cb"</span><span style="color: #0000FF;">)})</span>

<span style="color: #000000;">dlg</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">IupDialog</span><span style="color: #0000FF;">(</span><span style="color: #000000;">canvas</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"RESIZE=NO"</span><span style="color: #0000FF;">)</span>
IupShow(dlg)
<span style="color: #7060A8;">IupSetAttribute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"TITLE"</span><span style="color: #0000FF;">,</span> <span style="color: #008000;">"Sutherland-Hodgman polygon clipping"</span><span style="color: #0000FF;">)</span>
IupMainLoop()
<span style="color: #7060A8;">IupShow</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dlg</span><span style="color: #0000FF;">)</span>
IupClose()
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()!=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span>
end procedure
<span style="color: #7060A8;">IupMainLoop</span><span style="color: #0000FF;">()</span>

<span style="color: #7060A8;">IupClose</span><span style="color: #0000FF;">()</span>
main()</lang>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">main</span><span style="color: #0000FF;">()</span>
<!--</lang>-->


=={{header|PHP}}==
=={{header|PHP}}==