Algoritmo para crear un & # 8220; desaliñado & # 8221; efecto de papel para diagramas UML?

StackOverflow https://stackoverflow.com/questions/1437019

  •  08-07-2019
  •  | 
  •  

Pregunta

Me gusta el efecto de papel desaliñado de los http://yuml.me diagramas UML, ¿hay algún algoritmo para eso preferiblemente? no en Ruby sino en PHP, java o C #, me gustaría ver si es fácil hacer lo mismo en Rebol:

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

¿Fue útil?

Solución

El efecto combina

  • un relleno degradado diagonal
  • una sombra paralela
  • líneas que, en lugar de ser rectas, tienen algunas pequeñas desviaciones aparentemente aleatorias en ellas, lo que da una sensación 'desaliñada'.

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

Esto parece funcionar bien para eliminar 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 );
    }
}

ejemplo rectángulo desaliñado http://img34.imageshack.us/img34/4743/screenshotgh.png

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top