asd

fasfasf
 avatar
unknown
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...