From 4b14f30509a0d90d8f35116783b367360da36d8c Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Thu, 17 Mar 2022 13:46:46 -0500 Subject: [PATCH] Implement polygon scanline renderer --- bin/sig/Edge.class | Bin 0 -> 1462 bytes bin/sig/Panel.class | Bin 2832 -> 5367 bytes bin/sig/Point.class | Bin 0 -> 995 bytes src/sig/Edge.java | 33 +++++++++++++++ src/sig/Panel.java | 100 +++++++++++++++++++++++++++++++++++++++++++- src/sig/Point.java | 32 ++++++++++++++ 6 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 bin/sig/Edge.class create mode 100644 bin/sig/Point.class create mode 100644 src/sig/Edge.java create mode 100644 src/sig/Point.java diff --git a/bin/sig/Edge.class b/bin/sig/Edge.class new file mode 100644 index 0000000000000000000000000000000000000000..d3dcbdeb16c32e735d7866fee1f7b8bae8b4c02a GIT binary patch literal 1462 zcmaJ>*-leY6kVr9J8&pi0YydYfVSmgou>+psMX@c;E46Mz2e2vl2S~4)`ZW{H(xce z)o9`e_)+TG=T@kikkGr=K4$HR}GU%vww#j^l>3c)3JE;U}9a{}m4=$W@)+NqLV zo=e@z&pU;hg0dAlvto6-;+AV^p5zraEV$*|E8>h`yDr$A)mu7cxSp##%l$FDtkC6_ zUpmz#C%06pEIJAs&$?x|Hl{ETZwt@{6Eg}Omnuak3_p4`deEofk0)kAP}rie0UHGk zXaodp$6x?E6hf=nYV1UaS-uJ*hCKo7R*0;XIAPbGYwX27k}^$Z9?xVF8KK;-5kyG5 z;u;Ch!mi8Butpdm2{xi}(6F2HLmHiOu5d&{d+3-(7b0?YLZcfIh3>3dc5W^&rWMPZa9JUn_=lsF`Fb3;n6?!&OJ#WO2+v)G9r4V1Zd0C{ zEb3?wT&osIo!b4?JJBAp(^hP4bxoAV5@lARTwX6qjxWfH{k7#}No$qN zz-tWNl17{szG3V^^!#UBWKI1|j7Kv~+#ud6_@;-4nz$XE^l(z}w1-oI?|JyJ;0GQ) s+Qg&i6AvF3{FJzf{09c~nGQru6@wV(e<_!>OJ&+is8yLl(O5gb0Z^qZvH$=8 literal 0 HcmV?d00001 diff --git a/bin/sig/Panel.class b/bin/sig/Panel.class index df5611367834ab7ea1536de7fb821740880e418a..f510fa99a062be333b08d64c417a25064926f422 100644 GIT binary patch literal 5367 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 delta 1518 zcmZ8hTXR!Y6#n+fNl$aw4W#$lG`-M5dP-Xgc&W5Pg+fCMRA>vWAjI})Lql4U(2I&e zyrW|Ac&$8m8HX1ibf!r=%JAZh4?gJ+@kM8JMnU{`5~E{g&R*Z%d#!J+_3gd$d+Tzg z`NLn|+y>B#8`sT0oqAE-TrE+K8UZ~x(K_aVK&^xarb2ZR8(vhD!keGL~IvZoS(!cPY1Re=oIifH#EOnq6<5mMQvYk2X;x^j|ZIZ zwCsoLDhDJ=QKrx#2?NEdsv(KPIO5!ORc{SoSmH4p5ilZ&zG!6LRu0D{ zMo=N(P9($eq=7M~M{n_t;-qS4T%b7^3OQX`t#eg3gO5vWg3rV#PD?zY#M+RslYOzs z`Eb&v3ZpnH5k`%3ORot`!Zt7^u&L16$n0!%CX$qR3Qs$~>g~moh)A5nj1zSCi}Oy* zJv^L{n8O8=OZM!*%n7*jcxC9W$%BW}-yBeA5LS3>>VN}Bg1-p2<@ny76vUJo8> z9W(He6EY77!&x@FQwBN8QNgj2QK#T00-7v+4ON!UjWq7FeAdNCYlPICUZWDecTt=U#R|P`e|IdVy&Y;jf2)Ii(iF*x`$)vdq`z& z*M0`ms=Z~V5wccOXvtu31tr`fI=aHWEIP(^N5_e?477?Z^q`Xsq`EMP9hkvRB(MuF@L4I{Dsz40 zb@Sl@V(edFmU|xPchD$`%8Izao5oQcU6_)n=IgAsHN+`pGFQz)8*S9(;>t58{(oxS zDMsxkWiOw_9{92MKk4i8>B))9EKMEQ6}*_wH%)6WpQeAQ#%!;uB48lPF_7CWaAoESBcb#Yj}-F-6;*P6Dd+YBaW)gFX*kjI@ndn`Mjhx^{>={ zY|5jIJ;u1>OgDlW+RdD|V?0}ym5a`o<)*!gVsabUf;SkY@y=G^O(IuTZ6EZz>W}j+ zaR<7Pe^4udYlU)7BCIh6@KN8l%kj=S-o1J6x1pQ&exaXEni71NzX{%Kqi48!7G9jr ZmXmuRzI-|Acn#7G84MCw;Z(!Ne*@_<@iG7a diff --git a/bin/sig/Point.class b/bin/sig/Point.class new file mode 100644 index 0000000000000000000000000000000000000000..d51625bc7801003b8620c3714dfd21b6c188aeff GIT binary patch literal 995 zcmaJfgc5Ph3Cj^ny%YMPd|A+$iiHf_zmP@e~3kQ@pWtX9kJ2q>?jfv+PE!+?fmfxKmRN)T8vP=Lzb zs(~U@inN2!e>3^e^W(Q(Z{!P@?WpgKI$j*`Jqs$y`(P}v)SeM*Qk$Wlyp!NWL>bGA zVxV9m1Im(!%tW)ZgqHm-(WPJ+?Ek2UPlh*AtoM;&*0rh5Wa z>pGC#;f(tR9>Ag^@9fME2Ld%BbuBrAZ)$Kz#yu|FIXbinvfw?CRp~_ouSTa^mohkS#ks(evwe=TQ#(iH z8-;Q($(m5e(%&JAN+?s=4T|ifWmrR%ZUi9P2?Gt@#rfh&MQ`* NBifiL_C#hq{R?-FkvjkY literal 0 HcmV?d00001 diff --git a/src/sig/Edge.java b/src/sig/Edge.java new file mode 100644 index 0000000..e8c88c7 --- /dev/null +++ b/src/sig/Edge.java @@ -0,0 +1,33 @@ +package sig; + +public class Edge { + Point a,b; + int min_y; + int max_y; + int min_x; + int max_x; + double x_of_min_y; + double inverse_slope; + public Edge(Point a, Point b) { + super(); + this.a = a; + this.b = b; + min_y=Math.min(a.y, b.y); + max_y=Math.max(a.y, b.y); + min_x=Math.min(a.x, b.x); + max_x=Math.max(a.x, b.x); + if (a.y==min_y) { + x_of_min_y=a.x; + } else { + x_of_min_y=b.x; + } + + inverse_slope=(double)(a.x-b.x)/(a.y-b.y); + } + @Override + public String toString() { + return "Edge [a=" + a + ", b=" + b + ", min_y=" + min_y + ", max_y=" + max_y + ", min_x=" + min_x + ", max_x=" + + max_x + ", x_of_min_y=" + x_of_min_y + ", inverse_slope=" + inverse_slope + "]"; + } + +} diff --git a/src/sig/Panel.java b/src/sig/Panel.java index b4516dc..521244b 100644 --- a/src/sig/Panel.java +++ b/src/sig/Panel.java @@ -6,6 +6,8 @@ import java.awt.Image; import java.awt.Toolkit; import java.awt.image.ColorModel; import java.awt.image.MemoryImageSource; +import java.util.ArrayList; +import java.util.List; import javax.swing.JPanel; @@ -17,6 +19,8 @@ public class Panel extends JPanel implements Runnable { private Image imageBuffer; private MemoryImageSource mImageProducer; private ColorModel cm; + int scanLine=0; + int nextScanLine=0; public Panel() { super(true); @@ -85,9 +89,103 @@ public class Panel extends JPanel implements Runnable { } } - + FillPolygon(new Point[] { + new Point(135,2), + new Point(166,96), + new Point(265,97), + new Point(185,156), + new Point(215,251), + new Point(134,192), + new Point(54,251), + new Point(84,156), + new Point(4,97), + new Point(103,96), + }); + } + + public void FillPolygon(Point...points) { + Edge[] edges = new Edge[points.length]; + List edges_sorted = new ArrayList(); + for (int i=0;iedges[i].min_y) { + edges_sorted.add(j,edges[i]); + inserted=true; + break; + } else + if (e2.min_y==edges[i].min_y){ + if (e2.min_x>edges[i].min_x) { + edges_sorted.add(j,edges[i]); + inserted=true; + break; + } + } + } + if (!inserted) { + edges_sorted.add(edges[i]); + } + } + } + List active_edges = new ArrayList(); + scanLine = edges_sorted.get(0).min_y-1; + nextScanLine = scanLine+1; + do { + if (active_edges.size()%2==0) { + for (int i=0;i0); } + private void GetNextScanLineEdges(List edges_sorted, List active_edges) { + if (scanLine==nextScanLine) { + for (int i=0;iscanLine) { + nextScanLine=e.min_y; + break; + } + } + } + } + @Override public void run() { while (true) { diff --git a/src/sig/Point.java b/src/sig/Point.java new file mode 100644 index 0000000..d55943a --- /dev/null +++ b/src/sig/Point.java @@ -0,0 +1,32 @@ +package sig; + +public class Point { + int x,y; + + public Point(int x, int y) { + super(); + this.x = x; + this.y = y; + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + + @Override + public String toString() { + return "Point(" + x + "," + y + ")"; + } +}