Различные цвета в обработке - PullRequest
4 голосов
/ 03 октября 2008

Я работал над переносом части моего кода обработки на обычную Java в NetBeans. Пока все хорошо, почти все прекрасно работает, за исключением случаев, когда я использую цвета не в оттенках серого.

У меня есть сценарий, который рисует спиральный узор и должен варьировать цвета в спирали на основе проверки модуля. Однако сценарий зависает, и я не могу объяснить, почему.

Если у кого-то есть опыт работы с Processing и Java, и вы можете сказать мне, где моя ошибка, я бы очень хотел знать.

Ради обзора, вот моя маленькая программа:

package spirals;
import processing.core.*;

public class Main extends PApplet
{
    float x, y;
    int i = 1, dia = 1;

    float angle = 0.0f, orbit = 0f;
    float speed = 0.05f;

    //color palette
    int gray = 0x0444444;
    int blue = 0x07cb5f7;
    int pink = 0x0f77cb5;
    int green = 0x0b5f77c;

    public Main(){}

    public static void main( String[] args )
    {
        PApplet.main( new String[] { "spirals.Main" } );
    }

    public void setup()
    {
        background( gray );
        size( 400, 400 );
        noStroke();
        smooth();
    }

    public void draw()
    {
        if( i % 11 == 0 )
            fill( green );
        else if( i % 13 == 0 )
            fill( blue );
        else if( i % 17 == 0 )
            fill( pink );
        else
            fill( gray );

        orbit += 0.1f; //ever so slightly increase the orbit
        angle += speed % ( width * height );

        float sinval = sin( angle );
        float cosval = cos( angle );

        //calculate the (x, y) to produce an orbit
        x = ( width / 2 ) + ( cosval * orbit );
        y = ( height / 2 ) + ( sinval * orbit );

        dia %= 11; //keep the diameter within bounds.
        ellipse( x, y, dia, dia );
        dia++;
        i++;
    }
}

Ответы [ 4 ]

2 голосов
/ 04 октября 2008

Рассматривали ли вы добавление отладочных операторов (System.out.println) и просмотр консоли Java?

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

Я считаю логической ошибкой заполнение оператора if; на каждой итерации вы выбираете цвет этой итерации и заполняете этим цветом. Только итерации с i == 11, 13 или 17 заполняются цветом. И на следующей итерации этот цвет перезаписывается серым. Я бы подумал, что он может мигать, возможно, быстро видеть.

Разве вы не хотели что-то вроде

public class Main extends PApplet
{
  ...

  int currentColor = gray;

  public Main(){}

  ...

  public void draw()
    {
        if( i % 11 == 0 )
           currentColor = green;
        else if( i % 13 == 0 )
           currentColor = blue;
        else if( i % 17 == 0 )
           currentColor = pink;
        else {
           // Use current color
        } 

        fill(currentColor);

        ...
}

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

  else if ( i % 19 ) {
    currentColor = gray;
  }

Надеюсь, это поможет.

1 голос
/ 26 октября 2008

Спасибо за всю помощь, но я думаю, что моя конечная цель немного неверно истолкована.

Вот изображение, которое я сгенерировал, используя PDE для обработки:

http://www.deviantart.com/download/97026288/spiral_render_5_by_ishkur88.png

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

Как упоминалось в предыдущем постере: вы используете не серый цвет только на каждой 11-й, 13-й и 17-й итерации.

Спасибо за указание на это, но я уже знаю! Я на самом деле спроектировал это так!

Причина в том, что если бы у меня не было серого значения по умолчанию, вывод был бы безумно хаотичным и очень неприятным для глаз (по крайней мере, для моего глаза).

Если бы я мог просто пропустить рендеринг этого круга целиком, мне бы это больше понравилось.

0 голосов
/ 30 октября 2008

Не уверен, если у вас все еще есть проблема. Вы упоминаете повешение. Это выстрел в темноте, но я помню, Фрай, повторяя, что вызов size () должен быть первой инструкцией в setup (). Так что, возможно, поможет перемещение вниз по фону (). В любом случае не может быть больно.

0 голосов
/ 21 октября 2008

Чтобы увидеть, что здесь происходит, добавьте

stroke(255);

в начале розыгрыша. Вы увидите, что все нужные круги нарисованы, но без цвета. Как упоминалось в предыдущем постере: вы используете не серый цвет только каждую 11-ю, 13-ю и 17-ю итерацию.

Я думаю, что ваши цветовые значения являются главной проблемой здесь. Начиная со справочной страницы

С технической точки зрения цвета - это 32 бита информации, упорядоченные как AAAAAAARRRRRRRRGGGGGGGGBBBBBBBB, где А содержат альфа-значение, R - красный / оттенок, G - зеленый / насыщенность, а В - синий / яркость.

Если вы посмотрите на свои значения, вы увидите очень низкое альфа-значение, которое, возможно, невозможно отличить от фона.

...