2015-02-23 3 views
3

Итак, у меня есть проект для класса, над которым я работаю, в котором вам нужно создать графический интерфейс, заполненный кругами, за исключением того, что средний 50% экрана не может быть заполнен кругами. Кроме того, значение красного цвета каждого круга масштабируется линейно сверху донизу экрана, 0 вверху, 255 внизу. Вот то, что он должен выглядеть следующим образом:Как линейно масштабировать окраску пикселей?

Вот что у меня есть. Я попытался сделать 255/500 (500 - это высота), чтобы получить коэффициент масштабирования, который затем использовал бы, чтобы умножить все мои координаты y, чтобы получить указанное красное значение, и оно сработало. Ответ на 255/500 равен 0,51, и когда я использовал 0,51 вместо y * (255/getHeight()); это сработало. Однако мне нужно, чтобы он работал с любыми размерами кадра, поэтому 0.51 не работает. По какой-то причине y * (255/getHeight()) не работает, он, кажется, возвращает 0, так как круги представляют собой различные оттенки синего и зеленого. Что я могу сделать, чтобы исправить это?

код у меня есть:

public class NewJComponent1 extends JComponent { 
    public void paintComponent(Graphics g) { 
     int count = 0; 
     int diameter = 0; 
     Random rand = new Random(); 

     while (count < 5000) { 
      int x = rand.nextInt(getWidth() + 1); 
      int y = rand.nextInt(getHeight() + 1); 
      int greenValue = rand.nextInt(256); 
      int blueValue = rand.nextInt(256); 
      diameter = rand.nextInt(21) + 10; 

      int redValue = y * (255/getHeight()); 
      Color random = new Color (redValue, greenValue, blueValue); 

      if ((x < (getWidth()/4) && y <= (getHeight() - diameter)) 
       || ((x > (getWidth() * .75) && (x < getWidth() - diameter)) && y <= (getHeight() - diameter)) 
       || (x <= (getWidth() - diameter) && y < (getHeight()/4)) 
       || (x <= (getWidth() - diameter) && ((y > (getHeight() * .75)) && (y <= getHeight() - diameter)))){ 

       g.setColor(random); 
       g.fillOval(x, y, diameter, diameter); 
       count++; 
      } 
     } 
     System.out.println(getHeight()); 
     System.out.println(getWidth()); 
    } 
} 

Я пробовал различные итерации redValue кода, поменяв порядок, сделав двойной и типажей для Int, а также различные другие вещи, но я не мог заставить его работать. Я уверен, что это небольшая ошибка, которая все испортит, но, в любом случае, спасибо за помощь независимо. Я использую Android Studio, не уверен, что это действительно повлияет на что угодно.

+1

«int redValue = (int) (y * (255.0/getHeight()));« Ключевым моментом является то, что один из операндов деления должен быть типа с плавающей точкой, поэтому даже «double redValue = 255/getHeight(); 'даст вам« redValue' из «0.0» – clcto

+2

. Еще одно замечание: обратите внимание, что ваш экран можно разделить на 4x4 прямоугольники, и вам не разрешено рисовать только 4 из них. Вы могли бы создать рутину для того, в котором кусочки центра никогда не считаются *, чтобы привлечь. (Гораздо меньшая оптимизация - вы можете сначала проверить центр, и только затем выбрать свои цвета.) – usr2564301

ответ

4

Замените эту строку

int redValue = y * (255/getHeight()); 

с

int redValue = (int) Math.round(y * (255.0/(double) getHeight())); 

Просто изменение redValue к double не изменит тот факт, что 255/getHeight() является целочисленное деление.