import java.applet.*; import java.awt.*; import java.awt.image.*; public class MainClass extends Applet { final int W=320, H=240; Image img = null; MemoryImageSource mis = null; public void init() { this.setSize(W,H); this.setBackground(Color.GRAY); int pixels[] = new int[W*H]; for (int i=0; i < W*H; i++) pixels[i] = 255 << 24 | 255 << 16 | 255 << 8 | 255; int color[] = new int[3]; color[0] = 200; color[1] = 200; color[2] = 200; pixels = filledPolygon( new Point(50,50), new Point(200,100), new Point(70,220), color, pixels); mis = new MemoryImageSource(W, H, pixels, 0, W); img = createImage(mis); } public void paint (Graphics g) { g.drawImage(img,0,0,this); } //----------------------------------------------------------------------- // Draw filled polygon //----------------------------------------------------------------------- public int[] filledPolygon( Point fpP1, Point fpP2, Point fpP3, int fpColor[], int fpPixels[]) { // Order vertices if (fpP1.y > fpP2.y) { Point temp = fpP1; fpP1 = fpP2; fpP2 = temp; } if (fpP2.y > fpP3.y) { Point temp = fpP2; fpP2 = fpP3; fpP3 = temp; } if (fpP1.y > fpP3.y) { Point temp = fpP1; fpP1 = fpP3; fpP3 = temp; } float CEdgeX = fpP1.x; float CEdgeDeltaY = fpP3.y - fpP1.y; float CEdgeDeltaX = fpP3.x - fpP1.x; float CEdgeStep = CEdgeDeltaX/CEdgeDeltaY; // Polygon top if (fpP1.y != fpP2.y) { float AEdgeX = fpP1.x; float AEdgeDeltaY = fpP2.y-fpP1.y; float AEdgeDeltaX = fpP2.x-fpP1.x; float AEdgeStep = AEdgeDeltaX/AEdgeDeltaY; for (int i=fpP1.y; i < fpP2.y; i++) { AEdgeX += AEdgeStep; CEdgeX += CEdgeStep; int x1 = (int)AEdgeX; int x2 = (int)CEdgeX; fpPixels = scanLine ( new Point(x1,i), new Point(x2,i), fpColor, fpPixels); } } // Polygon bottom if (fpP2.y != fpP3.y) { float BEdgeX = fpP2.x; float BEdgeDeltaY = fpP3.y-fpP2.y; float BEdgeDeltaX = fpP3.x-fpP2.x; float BEdgeStep = BEdgeDeltaX/BEdgeDeltaY; for (int i=fpP2.y; i < fpP3.y; i++) { BEdgeX += BEdgeStep; CEdgeX += CEdgeStep; int x1 = (int)BEdgeX; int x2 = (int)CEdgeX; fpPixels = scanLine ( new Point(x1,i), new Point(x2,i), fpColor, fpPixels); } } // Return pixels return fpPixels; } //----------------------------------------------------------------------- //----------------------------------------------------------------------- // Draw scanline //----------------------------------------------------------------------- public int[] scanLine( Point fpP1, Point fpP2, int fpColor[], int fpPixels[]) { if (fpP1.x > fpP2.x) { Point temp = fpP1; fpP1 = fpP2; fpP2 = temp; } int delta = fpP2.x - fpP1.x; if (delta != 0) { for (int i=fpP1.x; i < fpP2.x; i++) { fpPixels[fpP1.y * W + i] = 255<<24|fpColor[0]<<16|fpColor[1]<<8|fpColor[2]; } } return fpPixels; } //----------------------------------------------------------------------- }