2009-09-17 9 views
5

Me gusta el efecto de papel desaliñado de http://yuml.me diagramas UML, ¿existe un algoritmo para que preferiblemente no en Ruby, pero en PHP, Java o C#, me gustaría ver si es fácil de hacer lo mismo en Rebol:Algoritmo para crear un efecto de papel "desaliñado" para diagramas UML?

http://reboltutorial.com/blog/easy-yuml-dialect-for-mere-mortals2/

+0

+1 para el buen sitio/enlace, parece facil :) Visitado – leppie

+0

sus proyectos: wow estoy sorprendido. ¿Incluirías Rebol en tu IDE;) –

Respuesta

10

El efecto combina

  • un gradiente diagonal llenar
  • una gota de sombra
  • líneas que, en lugar de ser recta, tener algunas pequeñas desviaciones aparentemente aleatorias en ellos, lo que le da una sensación "desaliñada".

Puede inicializar su generador de números aleatorios con un hash de la entrada para obtener la misma imagen cada vez.

Esto parece funcionar bien para scruffing líneas:

public class ScruffyLines { 
    static final double WOBBLE_SIZE = 0.5; 
    static final double WOBBLE_INTERVAL = 16.0; 

    Random random; 

    ScruffyLines (long seed) { 
     random = new Random(seed); 
    } 


    public Point2D.Double[] scruffUpPolygon (Point2D.Double[] polygon) { 
     ArrayList<Point2D.Double> points = new ArrayList<Point2D.Double>(); 
     Point2D.Double    prev = polygon[0]; 

     points.add (prev); // no wobble on first point 

     for (int index = 1; index < polygon.length; ++index) { 
      final Point2D.Double point = polygon[index]; 
      final double   dist = prev.distance (point); 

      // interpolate between prev and current point if they are more 
      // than a certain distance apart, adding in extra points to make 
      // longer lines wobbly 
      if (dist > WOBBLE_INTERVAL) { 
       int stepCount = (int) Math.floor (dist/WOBBLE_INTERVAL); 
       double step = dist/stepCount; 

       double x = prev.x; 
       double y = prev.y; 
       double dx = (point.x - prev.x)/stepCount; 
       double dy = (point.y - prev.y)/stepCount; 

       for (int count = 1; count < stepCount; ++count) { 
        x += dx; 
        y += dy; 

        points.add (perturb (x, y)); 
       } 
      } 

      points.add (perturb (point.x, point.y)); 

      prev = point; 
     } 

     return points.toArray (new Point2D.Double[ points.size() ]); 
    } 

    Point2D.Double perturb (double x, double y) { 
     return new Point2D.Double ( 
      x + random.nextGaussian() * WOBBLE_SIZE, 
      y + random.nextGaussian() * WOBBLE_SIZE); 
    } 
} 

example scruffed up rectangle http://img34.imageshack.us/img34/4743/screenshotgh.png

+0

Muchas gracias eres un genio! –

Cuestiones relacionadas