asd
fasfasfunknown
java
5 years ago
4.7 kB
6
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...