How to draw a decent looking Circle in Java

前端 未结 7 1387
我在风中等你
我在风中等你 2020-11-27 06:20

I have tried using the method drawOval with equal height and width but as the diameter increases the circle becomes worse looking. What can I do to have a decent looking cir

7条回答
  •  攒了一身酷
    2020-11-27 06:49

    EDITED: 06 September 2017

    That's an algorithm invented by me to draw a circle over a integer matrix. The same idea could be used to write a circle inside a BufferedImage. If you are trying to draw that circle using the class Graphics this is not the answare you are looking for (unless you wish to modify each color-assignement with g.drawLine(x, y, x+1, y), but it could be very slow).

    protected boolean runOnCircumference(int[][] matrix, int x, int y, int ray, int color) {
        boolean ret;
        int[] rowUpper = null, rowInferior = null, rowCenterUpper = null, rowCenterInferior = null;
    
        if (ret = ray > 0) {
            if (ray == 1) {
                matrix[y][x + 1] = color;
                rowUpper = matrix[++y];
                rowUpper[x] = color;
                rowUpper[x + 2] = color;
                matrix[y][x] = color;
            } else {
                double rRay = ray + 0.5;
                int r = 0, c = 0, ray2 = ray << 1, ray_1 = ray - 1, halfRay = (ray >> 1) + ray % 2, rInf,
                        ray1 = ray + 1, horizontalSymmetricOldC;
                // draw cardinal points
    
                rowUpper = matrix[ray + y];
                rowUpper[x] = color;
                rowUpper[x + ray2] = color;
                matrix[y][x + ray] = color;
                matrix[ray2 + y][x + ray] = color;
    
                horizontalSymmetricOldC = ray1;
                rInf = ray2;
                c = ray_1;
                for (r = 0; r < halfRay; r++, rInf--) {
    
                    rowUpper = matrix[r + y];
                    rowInferior = matrix[rInf + y];
    
                    while (c > 0 && (Math.hypot(ray - c, (ray - r)) < rRay)) {
    
                        rowUpper[x + c] = color;
                        rowUpper[x + horizontalSymmetricOldC] = color;
                        rowInferior[x + c] = color;
                        rowInferior[x + horizontalSymmetricOldC] = color;
    
                        // get the row pointer to optimize
                        rowCenterUpper = matrix[c + y];
                        rowCenterInferior = matrix[horizontalSymmetricOldC + y];
                        // draw
                        rowCenterUpper[x + r] = color;
                        rowCenterUpper[x + rInf] = color;
                        rowCenterInferior[x + r] = color;
                        rowCenterInferior[x + rInf] = color;
                        horizontalSymmetricOldC++;
                        c--;
                    }
                } // end r circle
            }
        }
        return ret;
    }
    

    I tried it so many times, verifying manually it correctness, so I think it will work. I haven't made any range-check just to simplify the code. I hope it will help you and everyone wish to draw a circle over a matrix (for example, those programmer who tries to create their own videogames on pure code and need to manage a matrix-oriented game-map to store the objects lying on the game-map [if you need help on this, email me]).

提交回复
热议问题