-2
import java.awt.Color;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

import javax.imageio.ImageIO;


public class Voronoi
{
    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);
        }

        ArrayList<Point> dis = new ArrayList<Point>();
        int min = 5000;

        for(int i = 0; i < buf.getWidth(); i++)
        {
            for(int j = 0; j < buf.getHeight(); j++)
            {
                for(int k = 0; k < points.length; k++)
                {
                    if(buf.getRGB(i, j) == b)
                        continue;

                    int d = distance(i, points[k].x, j, points[k].y);

                    if(d == min)
                    {
                        dis.add(points[k]);
                    }
                    else if(d < min)
                    {
                        dis.clear();
                        dis.add(points[k]);
                        min = d;
                    }

                }

                if(dis.size() == 1)
                {
                        buf.setRGB(i, j, w);
                }
                else if(dis.size() > 1)
                {
                    Point m = midPoint(dis);

                    buf.setRGB(m.x, m.y, g);
                }

                dis.clear();
                min = 5000;
            }
        }

        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));
    }

    public static Point midPoint(ArrayList<Point> p)
    {
        int totX = 0;
        int totY = 0;

        for(Point a: p)
        {
            totX += a.x;
            totY += a.y;
        }

        totX /= p.size();
        totY /= p.size();

        return new Point(totX, totY);
    }
}

生成されるのは次のようなものだけです。

ここに画像の説明を入力してください

コードが実行することになっていること:各ピクセルを1つずつ調べて、各ピクセルに最も近いポイント[青い点]を見つけます。ポイントが1つしかない場合は、そのピクセルを白に着色します。ただし、複数のポイントがある場合は、その緑色に色を付けます。

4

1 に答える 1

0

何が悪かったのか:

元は:

int d = distance(i, points[k].x, j, points[k].y);

正しいバージョン:

int d = distance(i, j, points[k].x, points[k].y);

それに加えて、私はここにいたので正しいポイントを平均することになっていませんでした:

Point m = midPoint(dis);

私は単に(i、j)を緑色にすることになっていた。

于 2011-06-10T16:23:05.200 に答える