2011-06-09 48 views
-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發電機有什麼不正確?

enter image description here

什麼代碼是應該做的事情: 通過每個像素去,一個接一個,並找到點(S)的藍點]最接近每個像素。如果只有一個點,則該像素爲白色。但是,如果有多個點,那就是綠色。

+0

你得到什麼錯誤? – Stuti 2011-06-09 04:42:01

+0

錯誤是輸出本身,藍色點是中心,綠色點應該是邊界,但我只得到一系列的點。 – Atrus 2011-06-09 04:46:24

+0

爲了獲得更好的反饋,我想稍微調整一下這個問題。狀態a)該算法準確地應該做什麼(如果你寫了兩個關於它的句子,你可以從所有可能幫助但不知道Voronoi發電機應該做什麼的人那裏得到反饋)b)用簡單的語言解釋你的算法的工作原理。然後c)儘可能準確地說出什麼地方出了問題 – Nicolas78 2011-06-10 07:59:28

回答

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)變成綠色。

相關問題