Ich habe ein Problem eine eigene DrawLine Methode mit farbverlauf zu schreiben die die pixel direkt im speicher ändert.
Ich schaf es einfach nicht das die Zeichen Methode korekt funktioniert kann mir jemand dabei behilflich sei?
Ich schaf es einfach nicht das die Zeichen Methode korekt funktioniert kann mir jemand dabei behilflich sei?
Code:
import java.util.*;
import java.awt.*;
import java.awt.image.*;
class Uebung_1_S_Schauer extends Frame {
int W;
int H;
int lauf = 0;
int[][] Pix;
Image m_Img;
int[] m_Pix;
int farbe;
int[] fv;
int index;
int x1,x2,y1,y2;
MemoryImageSource m_ImgSrc;
public Uebung_1_S_Schauer (int b, int h) {
super("Eigene DrawLine mehtode");
W = b;
H = h;
Pix = new int[W][H];
m_Pix = new int[W*H];
setSize(W,H);
m_ImgSrc = new MemoryImageSource(W,H,m_Pix,0,W);
m_Img = createImage(m_ImgSrc);
setVisible(true);
}
public void drawLineFarbe (int x1u, int y1u, int x2u, int y2u, farbe start, farbe ende) {
convert();
int dx;
int dy;
x1 = x1u;
x2 = x2u;
y1 = y1u;
y2 = y2u;
dx = x2-x1;
dy = y2-y1;
int dxb = java.lang.Math.abs(dx);
int dyb = java.lang.Math.abs(dy);
fade(dxb,dyb, start, ende);
if (dxb >= dyb) {
if (x2 < x1) {
int tmp;
tmp = x2;
x2= x1;
x1 = tmp;
}
for (int s = 0; s<dx; s++) {
putpixel ((x1+s),(y1+((s+(dxb/2))*dy)/dxb));
}
} else {
if (y2 < y1 ) {
int tmp = y2;
y2 = y1;
y1 = tmp;
}
for (int s = 0; s<dy; s++) {
putpixel ((x1+((s+(dyb/2))*dx)/dyb),(y1+s)); // (x1+((s+(dyb/2))*dx)/dyb)
}
}
convert2();
m_Img.flush();
getGraphics().drawImage(m_Img,0,0,this);
}
public void convert () {
int index = 0;
for (int con1 = 0; con1 < W; ++con1) {
for (int con2 = 0; con2 < H; ++con2) {
Pix[con1][con2] = m_Pix[index++];
}
}
}
private int compColor(int x1,int x2,int p) {
return x1+(x2-x1)*p/100;
}
private int fade (int dx, int dy,farbe start , farbe ende) {
index = 0;
int as = (int)java.lang.Math.sqrt((dx*dx+dy*dy));
fv = new int[as];
for (int i = 0; i < as; ++i) {
int P = 100*i/as;
int col = 0xff000000
| compColor(start.r,ende.r,P) << 16
| compColor(start.g,ende.g,P) << 8
| compColor(start.b,ende.b,P);
fv[i] = col;
}
farbe = fv[index];
return fv[index];
}
public void putpixel (int ywert, int xwert) {
if (ywert >= 0 && xwert >=0)
Pix[xwert][ywert] = fv[index++];
}
public void convert2 () {
int jeha = 0;
for (int con1 = 0; con1 < W; con1++) {
for (int con2 = 0; con2 < H; con2++) {
m_Pix[jeha++] = Pix[con1][con2];
}
}
}
public void update(Graphics g) {}
public void paint(Graphics g) {}
public static void main(String[] args) throws Exception {
Uebung_1_S_Schauer win = new Uebung_1_S_Schauer(500,500);
win.drawLineFarbe(0,250,500,250,new farbe(255,0,0), new farbe(0,255,0));
win.drawLineFarbe(125,125,10,10,new farbe(0,128,128), new farbe(0,0,255));
win.drawLineFarbe(250,0,250,500,new farbe(255,255,0), new farbe(255,0,0));
}
}
class farbe {
int r;
int g;
int b;
int f;
public farbe() {
this(255,255,255);
}
public farbe(int rot, int gruen, int blau) {
r = rot;
g = gruen;
b = blau;
f = (r << 24) | (g << 16) | (b);
}
}