Почему приведенный ниже код не рисует линию, ближайшую к верхнему левому углу? - PullRequest
0 голосов
/ 09 июня 2011
public static void main(String args[])
{
    Random r = new Random();

    BufferedImage buf = new BufferedImage(500, 500, BufferedImage.TYPE_3BYTE_BGR);

    Point[] points = new Point[50];

    for(int i = 0; i < points.length; i++)
    {
        points[i] = new Point(r.nextInt(500), r.nextInt(500));
    }

    int b = Color.BLUE.getRGB();
    int w = Color.WHITE.getRGB();
    int g = Color.GREEN.getRGB();


    for(int i = 0; i < points.length; i++)
    {
        buf.setRGB(points[i].x, points[i].y, b);
    }
    Point close = null;
    int max = 5000;

    for(int k = 0; k < points.length; k++)
    {
        Point p = points[k];

        int d = distance(0, 0, p.x, p.y);

        if(d < max)
        {
            close = p;
            d = max;
        }
    }

    Graphics gr = buf.getGraphics();
    gr.drawLine(0, 0, close.x, close.y);

    try
    {
        ImageIO.write(buf, "png", new File("this.png"));
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public static int distance(int x1, int y1, int x2, int y2)
{
    return (int)Math.sqrt((Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)));
}

Я получу изображения, подобные этому, но совершенно очевидно, что это неправильно ... и я озадачен, почему это не сработает.

image


EDIT: What it should look like is this: simply a line from the origin to the nearest blue dot.

image

1 Ответ

8 голосов
/ 09 июня 2011

Вы указали

d = max;

в вашем цикле минимизации. Вместо этого следует читать

max = d;
...