-3

私は円(r)の可能な半径を繰り返し処理しており、潜在的な候補を見つけたら、基本的にそれらをスタックにプッシュしたいと思います。最後の2つの半径とそれに対応する円の色を覚えておくだけでよいので、これらの変数を格納するために4つの整数を作成しました。ただし、私が含めたprintステートメントは、両方の変数に対して常に0の値を生成します。

 //small stack to hold values of previous circles
            int small_radius    =   0;
            int small_color     =   0;
            int med_radius      =   0;
            int med_color       =   0; 
            //iterate through possible radii       
            while (r<max){
                //check for possibility of a circle
                if(detectCircle(x,y,r,img,g)){
                    //confirm it is a circle and store its color
                    int large_color = confirmCircle(x,y,r,img,g);
                    if(large_color != -1){
                        //if it is a circle, compare the medium circle against the current one and the small one
                        //check if the current circle and small circle do not immediately surround the medium circle
                        boolean matches_small = (med_radius-1 == small_radius && med_color == small_color);
                        boolean matches_large = (r-1 == med_radius && large_color == med_color);
                        if(!matches_small && !matches_large){
                            //if it is a circle of single line thickness, draw it
                            System.out.println("med_radius: "+med_radius+" small_radius: "+small_radius);
                            drawCircle(x,y,r,img,g);
                        }
                        //now push the current circle onto the stack.
                        small_radius = med_radius;
                        small_color  = med_color;
                        med_radius   = r;
                        med_color    = large_color;  
                    }
                }
                r++;
            } 

編集:confirmCircleがどのように見えるか疑問に思っている人のために、ここにありますが、違いはありません。

 static int confirmCircle(int cx, int cy, int r, BufferedImage img, Graphics2D g) {

    int color = img.getRGB(cx,cy+r);

    int f = 1-r;
    int ddF_x = 1;
    int ddF_y = -2 * r;
    int x = 0;
    int y = r;


    while(x < y) {
        if(f >= 0) {
            y--;
            ddF_y += 2;
            f += ddF_y;
        }
        x++;
        ddF_x += 2;
        f += ddF_x;

        if(img.getRGB(cx+x,cy+y) != color){color = -1;}
        if(img.getRGB(cx-x,cy+y) != color){color = -1;}
        if(img.getRGB(cx+x,cy-y) != color){color = -1;}
        if(img.getRGB(cx-x,cy-y) != color){color = -1;}
        if(img.getRGB(cx+y,cy+x) != color){color = -1;}
        if(img.getRGB(cx-y,cy+x) != color){color = -1;}
        if(img.getRGB(cx+y,cy-x) != color){color = -1;}
        if(img.getRGB(cx-y,cy-x) != color){color = -1;}
    }
    return color;
}
4

1 に答える 1

1

このサンプルには、4 つの変数のいずれかに割り当てるコードはありません。

内部で割り当てを行っている場合、問題は、Java で値渡しの場合に s が参照渡しであるとconfirmCircle()予想していることです。int

言い換えると:

int a = 4;

public void changeA(int someVar) {
    someVar++;
}

changeA(a);
System.out.println(a);  //prints 4, not 5.
于 2013-01-28T16:25:17.753 に答える