Алгоритм для создания “потрепанного” бумажного эффекта для диаграмм UML?

Средние пользователи все еще не понимают, каков OpenId, что это для, или как использовать его. Мои родители не были бы в состоянии войти в систему к Переполнению стека, например.

Однако это в основном о пользовательском интерфейсе. Нет ничего по сути препятствования тому, чтобы они использовали OpenId - им просто нужен пользовательский интерфейс, что краткие обзоры далеко OpenId от них, и просто позволяют им войти в систему с их учетной записью Google (например).

5
задан Rebol Tutorial 17 September 2009 в 06:26
поделиться

1 ответ

Эффект объединяет

  • диагональную градиентную заливку
  • линии тени
  • , которые, вместо того, чтобы быть прямыми, имеют небольшие, очевидно случайные отклонения в них, что дает ' ощущение неряшливости.

Вы можете заполнить свой генератор случайных чисел хешем входных данных, чтобы каждый раз получать одно и то же изображение.

Похоже, это нормально работает для зачистки строк:

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 );
    }
}

пример очищенного прямоугольника http : //img34.imageshack.us/img34/4743/screenshotgh.png

10
ответ дан 13 December 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: