asd
fasfasfunknown
java
4 years ago
4.7 kB
5
Indexable
package cz.osu; import java.awt.*; public class GraphicsOperations { public static void fillBrightness(V_RAM vram, int brightness){ brightness = Math.min(255, Math.max(0, brightness)); for(int y = 0; y < vram.getHeight(); y++) for(int x = 0; x < vram.getWidth(); x++) vram.getRawData()[y][x] = brightness; } public static void drawLine(V_RAM vram, Line2D line, int brightness){ line(vram, line, brightness); } public static void drawTriangle(V_RAM vram, Triangle2D triangle, int brightness){ line(vram, new Line2D(triangle.pointA, triangle.pointB), brightness); line(vram, new Line2D(triangle.pointB, triangle.pointC), brightness); line(vram, new Line2D(triangle.pointC, triangle.pointA), brightness); } private static void line(V_RAM vram, Line2D line, int brightness) { Point pz = line.pointA.getRoundedPoint(); Point pk = line.pointB.getRoundedPoint(); int dx=pk.x-pz.x; int dy=pk.y-pz.y; if (pz.x==pk.x&&pz.y==pk.y){ vram.setPixel(pz.x,pz.y,brightness); return; } else if(dx==0){ if(pz.y>pk.y) switchPoints(pz,pk); int x; int y; for (y=pz.y; y<pk.y; y+=1) { vram.setPixel(pz.x,y,brightness); } return; }else if(dy==0){ if(pz.x>pk.x) switchPoints(pz,pk); int x; int y; for (x=pz.x; x<pk.x; x+=1) { vram.setPixel(x,pz.y,brightness); } return; } float a=(float)dy/dx; if(Math.abs(a)<=1){ if(pz.x>pk.x)switchPoints(pz,pk); //naiveLineLow(pz,pk,vram,brightness); //DDALow(pz,pk,vram,brightness); BresenhamLow(pz,pk,vram,brightness); } else{ if(pz.y>pk.y)switchPoints(pz,pk); //naiveLineHigh(pz,pk,vram,brightness); //DDAHigh(pz,pk,vram,brightness); BresenhamHigh(pz,pk,vram,brightness); } } private static void BresenhamHigh(Point pz, Point pk, V_RAM vram, int brightness) { int d; if (pz.x>pk.x){ d=-1; } else{ d=1; } int h1=2*Math.abs(pk.x-pz.x); int h2=h1-2*(pk.y-pz.y); int h=h1-(pk.y-pz.y); int y; for (y=pz.y; y<pk.y; y+=1) { vram.setPixel(pz.x,y,brightness); if (h>0) {pz.x+=d; h+=h2;} else h+=h1; } vram.setPixel(pk.x,pk.y,brightness); } private static void BresenhamLow(Point pz, Point pk, V_RAM vram, int brightness) { int d; if (pz.y>pk.y){ d=-1; } else{ d=1; } int h1=2*Math.abs(pk.y-pz.y); int h2=h1-2*(pk.x-pz.x); int h=h1-(pk.x-pz.x); int x; for (x=pz.x; x<pk.x; x+=1) { vram.setPixel(x,pz.y,brightness); if (h>0) {pz.y+=d; h+=h2;} else h+=h1; } vram.setPixel(pk.x,pk.y,brightness); } private static void DDAHigh(Point pz, Point pk, V_RAM vram, int brightness) { float a=(float)(pk.x-pz.x)/(pk.y-pz.y); float x=pz.x; for(int y=pz.y;y<=pk.y;y++){ x+=a; vram.setPixel(Math.round(x),y,brightness); } } private static void DDALow(Point pz, Point pk, V_RAM vram, int brightness) { float a=(float)(pk.y-pz.y)/(pk.x-pz.x); float y=pz.y; for(int x=pz.x+1;x<=pk.x;x++){ y+=a; vram.setPixel(x,Math.round(y),brightness); } } private static void naiveLineHigh(Point pz, Point pk, V_RAM vram, int brightness) { float a=(float)(pk.x-pz.x)/(pk.y-pz.y); float b=(float)(pk.y*pz.x-pz.y*pk.x)/(pk.y-pz.y); int x; for (int y = pz.y+1; y <=pk.y; y++) { x=Math.round(a*y+b); vram.setPixel(x,y,brightness); } } private static void naiveLineLow(Point pz, Point pk, V_RAM vram, int brightness) { float a=(float)(pk.y-pz.y)/(pk.x-pz.x); float b=(float)(pk.x*pz.y-pz.x*pk.y)/(pk.x-pz.x); int y; for (int x = pz.x; x <=pk.x; x++) { y=Math.round(a*x+b); vram.setPixel(x,y,brightness); } } private static void switchPoints(Point pz, Point pk) { int x=pz.x; int y=pz.y; pz.x=pk.x; pz.y=pk.y; pk.x=x; pk.y=y; } }
Editor is loading...