-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);
}
}
它所產生是這樣的:我的Voronoi發電機有什麼不正確?
什麼代碼是應該做的事情: 通過每個像素去,一個接一個,並找到點(S)的藍點]最接近每個像素。如果只有一個點,則該像素爲白色。但是,如果有多個點,那就是綠色。
你得到什麼錯誤? – Stuti 2011-06-09 04:42:01
錯誤是輸出本身,藍色點是中心,綠色點應該是邊界,但我只得到一系列的點。 – Atrus 2011-06-09 04:46:24
爲了獲得更好的反饋,我想稍微調整一下這個問題。狀態a)該算法準確地應該做什麼(如果你寫了兩個關於它的句子,你可以從所有可能幫助但不知道Voronoi發電機應該做什麼的人那裏得到反饋)b)用簡單的語言解釋你的算法的工作原理。然後c)儘可能準確地說出什麼地方出了問題 – Nicolas78 2011-06-10 07:59:28