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 color1[] = {80, 80, 80}; int color2[] = {120, 120, 120}; int color3[] = {255, 255, 255}; pixels = smoothPolygon( new Point(50,50), new Point(200,100), new Point(70,220), color1, color2, color3, pixels); mis = new MemoryImageSource(W, H, pixels, 0, W); img = createImage(mis); } public void paint (Graphics g) { g.drawImage(img,0,0,this); } //----------------------------------------------------------------------- // Draw smooth polygon //----------------------------------------------------------------------- public int[] smoothPolygon( Point fpP1, Point fpP2, Point fpP3, int fpColor1[], int fpColor2[], int fpColor3[], int fpPixels[]) { if (fpP1.y > fpP2.y) { Point tempPoint = fpP1; fpP1 = fpP2; fpP2 = tempPoint; int tempColor[] = fpColor1; fpColor1 = fpColor2; fpColor2 = tempColor; } if (fpP2.y > fpP3.y) { Point tempPoint = fpP2; fpP2 = fpP3; fpP3 = tempPoint; int tempColor[] = fpColor2; fpColor2 = fpColor3; fpColor3 = tempColor; } if (fpP1.y > fpP3.y) { Point tempPoint = fpP1; fpP1 = fpP3; fpP3 = tempPoint; int tempColor[] = fpColor3; fpColor1 = fpColor3; fpColor3 = tempColor; } float CEdgeX = fpP1.x; float CEdgeDeltaY = fpP3.y - fpP1.y; float CEdgeDeltaX = fpP3.x - fpP1.x; float CEdgeStep = CEdgeDeltaX/CEdgeDeltaY; float CColorR = fpColor1[0]; float CColorG = fpColor1[1]; float CColorB = fpColor1[2]; float CColorDeltaR = fpColor3[0] - fpColor1[0]; float CColorDeltaG = fpColor3[1] - fpColor1[1]; float CColorDeltaB = fpColor3[2] - fpColor1[2]; float CColorStepR = CColorDeltaR/CEdgeDeltaY; float CColorStepG = CColorDeltaG/CEdgeDeltaY; float CColorStepB = CColorDeltaB/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; float AColorR = fpColor1[0]; float AColorG = fpColor1[1]; float AColorB = fpColor1[2]; float AColorDeltaR = fpColor2[0] - fpColor1[0]; float AColorDeltaG = fpColor2[1] - fpColor1[1]; float AColorDeltaB = fpColor2[2] - fpColor1[2]; float AColorStepR = AColorDeltaR/AEdgeDeltaY; float AColorStepG = AColorDeltaG/AEdgeDeltaY; float AColorStepB = AColorDeltaB/AEdgeDeltaY; for (int i=fpP1.y; i < fpP2.y; i++) { AEdgeX += AEdgeStep; CEdgeX += CEdgeStep; AColorR += AColorStepR; AColorG += AColorStepG; AColorB += AColorStepB; CColorR += CColorStepR; CColorG += CColorStepG; CColorB += CColorStepB; int x1 = (int)AEdgeX; int x2 = (int)CEdgeX; int c1[] = {(int)AColorR, (int)AColorG, (int)AColorB}; int c2[] = {(int)CColorR, (int)CColorG, (int)CColorB}; fpPixels = scanLine ( new Point(x1,i), new Point(x2,i), c1, c2, 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; float BColorR = fpColor2[0]; float BColorG = fpColor2[1]; float BColorB = fpColor2[2]; float BColorDeltaR = fpColor3[0] - fpColor2[0]; float BColorDeltaG = fpColor3[1] - fpColor2[1]; float BColorDeltaB = fpColor3[2] - fpColor2[2]; float BColorStepR = BColorDeltaR/BEdgeDeltaY; float BColorStepG = BColorDeltaG/BEdgeDeltaY; float BColorStepB = BColorDeltaB/BEdgeDeltaY; for (int i=fpP2.y; i < fpP3.y; i++) { BEdgeX += BEdgeStep; CEdgeX += CEdgeStep; BColorR += BColorStepR; BColorG += BColorStepG; BColorB += BColorStepB; CColorR += CColorStepR; CColorG += CColorStepG; CColorB += CColorStepB; int x1 = (int)BEdgeX; int x2 = (int)CEdgeX; int c1[] = {(int)BColorR, (int)BColorG, (int)BColorB}; int c2[] = {(int)CColorR, (int)CColorG, (int)CColorB}; fpPixels = scanLine ( new Point(x1,i), new Point(x2,i), c1, c2, fpPixels); } } return fpPixels; } //----------------------------------------------------------------------- //----------------------------------------------------------------------- // Draw smooth scanline //----------------------------------------------------------------------- public int[] scanLine( Point fpP1, Point fpP2, int fpColor1[], int fpColor2[], int fpPixels[]) { if (fpP1.x > fpP2.x) { Point tempPoint = fpP1; fpP1 = fpP2; fpP2 = tempPoint; int tempColor[] = fpColor1; fpColor1 = fpColor2; fpColor2 = tempColor; } int delta = fpP2.x - fpP1.x; float colorR = fpColor1[0]; float colorG = fpColor1[1]; float colorB = fpColor1[2]; int colorDeltaR = fpColor2[0] - fpColor1[0]; int colorDeltaG = fpColor2[1] - fpColor1[1]; int colorDeltaB = fpColor2[2] - fpColor1[2]; float colorStepR = colorDeltaR/delta; float colorStepG = colorDeltaG/delta; float colorStepB = colorDeltaB/delta; if (delta != 0) { for (int i=fpP1.x; i < fpP2.x; i++) { colorR += colorStepR; colorG += colorStepG; colorB += colorStepB; int color[] = {(int)colorR, (int)colorG, (int)colorB}; fpPixels[fpP1.y * W + i] = 255<<24 | color[0]<<16 | color[1]<<8 | color[2]; } } return fpPixels; } //----------------------------------------------------------------------- }