2011-06-09 2 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); 
    } 
} 

Tout ce qu'il génère est quelque chose comme ceci:Qu'est-ce qui est incorrect avec mon générateur Voronoi?

enter image description here

Qu'est-ce que le code est supposé faire: Passez par chaque pixel, un par un, et trouver le point (s) [La points bleus] les plus proches de chaque pixel. S'il n'y a qu'un seul point, colorez ce pixel en blanc. Cependant, s'il y a plusieurs points, colorez ce vert.

+0

Quelle erreur obtenez-vous? – Stuti

+0

L'erreur est la sortie elle-même, les points bleus sont centrés, les points verts sont supposés être les limites, et pourtant je ne reçois qu'une série de points. – Atrus

+0

Je restructurerais un peu cette question afin d'obtenir de meilleurs commentaires. Indiquez a) ce que l'algorithme est censé faire exactement (si vous écrivez deux phrases à ce sujet, vous pourriez recevoir des commentaires de toutes les personnes qui pourraient vous aider mais qui ne savent pas ce qu'un générateur de Voronoi est censé faire) expliquer en mots simples comment fonctionne votre algorithme. alors c) essayez de dire aussi précisément que possible ce qui ne va pas – Nicolas78

Répondre

0

Voici ce qui était erroné:

origine:

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

La version correcte:

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

En plus de cela, je ne devais pas être en moyenne des points corrects comme J'étais ici:

Point m = midPoint(dis); 

Je devais simplement colorer (i, j) le vert.

Questions connexes