Hallo zusammen,
ich möchte ein altes BASIC Programm in Java verwenden.
Dazu habe ich das Programm so gut, wie ich kann, in Java übersetzt, an meine Bedürfnisse angepasst, und verwende es nun.
Das Programm ansich tut auch das, was es soll: Nämlich Bereiche füllen.
Das Problem hierbei ist nun, dass es mir bei längeren Füllvorgängen einen StackOverFlow error auswirft.
Diesen Fehler konnte ich zwar erfolgreich 'catch'en, aber er ist ja immernoch vorhanden.
Was nun ist an meinem Code noch falsch?
Wer sich mit Java auskennt, bitte: Hilfeeeeeee!!! ;)
(Zum Octoate und zum Nurgle *schiel*)
protected int[] x = new int[52];
protected int[] y = new int[52];
protected int z, xStep;
protected Color hf, vfl, vfr, fr, fl;
protected int fillX, fillY;
public Color test(int x, int y){
Color result = CPC.getCol(pen);
if (x <= img.getWidth() && y <= img.getHeight() && x>=0 && y>=0)
result = new Color(img.getRGB(x, y));
return result;
}
public void Fill(int x, int y, int p){
fillX = x;
fillY = y;
xStep = 1;
if (mode == 1)
xStep = 2;
if (mode == 0)
xStep = 4;
putScreen();
z = 0;
hf = new Color(img.getRGB(fillX, fillY));
System.out.println(Util.hex(hf.getRGB()));
if (hf.getRGB() == CPC.getCol(p).getRGB())
return;
getCoords();
}
protected void getCoords(){
if (fillX <0 || fillX >640-xStep || fillY <0 || fillY>399){
getnewCoords();
} else
searchUP();
}
public void searchUP(){
try{
while (test(fillX, fillY).getRGB() == hf.getRGB() && fillY < 398)
fillY+=2;
fillY-=2; fl = new Color (0x44,0x44,0x44); fr = fl;
fillDown();
}
catch (java.lang.StackOverflowError So){System.gc();}
}
public void fillDown(){
while (fillY>=0 && test(fillX, fillY).getRGB() == hf.getRGB() && fillX<(640-xStep)){
// look to left
vfl = fl; fl = test(fillX-xStep, fillY);
if (vfl.getRGB() != hf.getRGB() && fl.getRGB() == hf.getRGB()){
x[z] = fillX-xStep; y[z] = fillY; z++;
}
// look to right
vfr = fr; fr = test(fillX+xStep, fillY);
if (vfr.getRGB() != hf.getRGB() && fr.getRGB() == hf.getRGB()){
x[z] = fillX+xStep; y[z] = fillY; z++;
}
int cpcY = fillY / 2;
int cpcX = fillX / xStep;
// plot point
CPC.PLOT(cpcX, cpcY, pen, mode);
Graphics page = getGraphics();
img.getGraphics().setColor(CPC.getCol(pen));
page.setColor(CPC.getCol(pen));
img.getGraphics().fillRect(fillX, fillY, xStep, 2);
page.fillRect(fillX, fillY, xStep, 2);
fillY-=2;
}
getnewCoords();
}
protected void getnewCoords(){
// get new coordinates
z--;
if (z>=0){
fillX=x[z]; fillY=y[z]; getCoords();
}
}
Hier übrigens das Original BASIC-Listing: (Schneider CPC Basic 1.0)
10 '***********************************
20 '*********** FILL - Basic **********
30 '***********************************
40 MODE 1:DEFINT a-z:DIM x(50),y(50)
50 '*** Testfigur zeichnen
60 MOVE 100,100:DRAW 150,150,2:DRAW 100,200:DRAW 200,200:DRAW 180,180:DRAW 200,140:DRAW 200,100:DRAW 100,100
70 MOVE 120,120:TAG:PRINT"X Y Z";:TAGOFF
80 '*** Startpunkt und Farbe bestimmen
90 x=160:y=160:f=3:GOSUB 1000:END
1000 '******** FILL-Subroutine ********
1010 '*** Hintergrundfarbe ermitteln
1020 z=0:hf=TEST(x,y):IF hf=f THEN RETURN
1030 '*** Koord. auf dem Bildschirm ?
1040 IF x<0 OR x>639 OR y<0 OR y>399 THEN 1190
1050 '*** Oberen Rand suchen
1060 WHILE TEST(x,y)=hf AND y<399:y=y+2:WEND
1070 y=y-2:fl=-1:fr=-1
1080 '*** Linie nach unten zeichnen
1090 WHILE y>=0 AND TEST(x,y)=hf
1100 '*** Schaue nach links
1110 vfl=fl:fl=TEST(x-2,y)
1120 IF vfl<>hf AND fl=hf THEN x(z)=x-2:y(z)=y:z=z+1
1130 '*** Schaue nach rechts
1140 vfr=fr:fr=TEST(x+2,y)
1150 IF vfr<>hf AND fr=hf THEN x(z)=x+2:y(z)=y:z=z+1
1160 '*** Punkt setzen
1170 PLOT x,y,f:y=y-2
1180 WEND
1190 '*** Neue Koordinaten holen
1200 z=z-1
1210 IF z>=0 THEN x=x(z):y=y(z):GOTO 1040
1220 '*** Zurueck,falls keine mehr da
1230 RETURN
Habe es hinbekommen.
protected int[] xx = new int[52];
protected int[] yy = new int[52];
protected int z, xStep;
protected Color hf, vfl, vfr, fr, fl;
protected int fillX, fillY;
public void Fill(int x, int y, int p){
for (int pf = 0; pf < 52; pf++){
xx[pf] = 0;
yy[pf] = 0;
}
fillX = x;
fillY = y;
xStep = 1;
if (mode == 1)
xStep = 2;
if (mode == 0)
xStep = 4;
putScreen();
z = 0;
hf = new Color(img.getRGB(fillX, fillY));
if (hf.getRGB() == CPC.getCol(p).getRGB())
return;
getCoords();
}
protected void getCoords(){
while (fillX <0 || fillX >640-xStep || fillY <0 || fillY>399){
z--;
if (z>=0)
fillX=xx[z]; fillY=yy[z];
}
searchUP();
}
public void searchUP(){
try{
//Graphics page = getGraphics();
//page.setColor(CPC.getCol(pen));
while (test(fillX, fillY).getRGB() == hf.getRGB() && fillY < 400)
fillY+=2;
fillY-=2; fl = new Color (0x44,0x44,0x44); fr = fl;
while (fillY>=0 && test(fillX, fillY).getRGB() == hf.getRGB()&& fillX >=0 && fillX<=(640-xStep)){
// look to left
vfl = fl; fl = test(fillX-xStep, fillY);
if (vfl.getRGB() != hf.getRGB() && fl.getRGB() == hf.getRGB()){
if (fillX >= xStep){
xx[z] = fillX-xStep; yy[z] = fillY; z++;}
else{
xx[z] = 0; yy[z] = fillY; z++;}
}
// look to right
vfr = fr; fr = test(fillX+xStep, fillY);
if (vfr.getRGB() != hf.getRGB() && fr.getRGB() == hf.getRGB()){
xx[z] = fillX+xStep; yy[z] = fillY; z++;
}
int cpcY = fillY / 2;
int cpcX = fillX / xStep;
// plot point
CPC.PLOT(cpcX, cpcY, pen, mode);
img.getGraphics().setColor(CPC.getCol(pen));
img.getGraphics().drawLine(fillX, fillY, fillX, fillY);
//page.fillRect(fillX, fillY, xStep, 2);
fillY-=2;
}
z--;
if (z>=0){
fillX=xx[z]; fillY=yy[z]; getCoords();
}
}
catch (java.lang.StackOverflowError So){}
}
public Color test(int x, int y){
Color result = CPC.getCol(pen);
try{
if (x<0)
x = 0;
if (y<0)
y = 0;
if (x>=640)
x = 639;
if (y>=400)
y = 399;
result = new Color(img.getRGB(x, y));}
catch (java.lang.ArrayIndexOutOfBoundsException ek){
System.err.println("Error in TEST! X " + x + " Y " + y);}
return result;
}
(http://cpc-live.com/javacpc_fill.gif)