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}}== |