2016-06-23 2 views
2

У меня есть метод, который создает тени, основанные на том, где вещи находятся на экране, а конечный продукт этого метода - это область, которую я затем рисую на экране и содержит все тени на экране в том же районе. Это связано с тем, что нарисованные тени являются низкой непрозрачностью, поэтому, если это не все, что они будут перекрывать, а непрозрачность сделает это странным.Как угасать края объекта Java2D Area?

Проблема в том, что я хочу, чтобы тени выглядели так, как будто они исчезают, но я понятия не имею, как, или если бы это было возможно. Есть ли способ смягчить края Района или заставить их градиент исчезать? Я попытался сделать graphics2D.setPaint (новый GradientPaint [эффект градиента]), но он ничего не сделал.

Заранее спасибо

EDIT: Here Вот скриншот программы делает тень вокруг «здания» прямоугольника. Зеленый прямоугольник должен показать эффект тени. Конечный результат, который я хочу, вместо того, чтобы тень внезапно заканчивается, должна исчезнуть.

+0

может быть, вы показываете нам пример области и проблемы у вас с ним (картина говорит более чем 1000 слов) –

+0

Я добавил скриншот – Miles

+0

uhm, извините, там было что-то не так, когда вы пытались добавить изображение:/это не видно! –

ответ

0

я предполагаю, что у вас есть проблемы с настройкой правильных цветов для градиента:

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    g.setColor(Color.GREEN);    
    g.fillRect(30, 30, 50, 20); 

    Graphics2D g2d = (Graphics2D) g; 
    Polygon p = new Polygon(new int[]{10,20,50,50,40,10}, new int[]{10,10,40,50,50,20}, 6); 
    Area a = new Area(p); 

    Color b = new Color(0xFF000000, true); //using colors with transparency!!! 
    Color w = new Color(0x00FFFFFF, true); //using colors with transparency!!! 

    //try to use proper values for the x/y values - both, start and end 
    GradientPaint gradient = new GradientPaint(0, 0, b, 40, 40, w);      
    g2d.setPaint(gradient); 
    g2d.fill(a); // fill your area! 
} 

результата является градиент альфа (прозрачность) ...

red - no gradiententer image description here

Площади втягивается красный < ==> Площадь, нарисованная градиентом

не забудьте установить значение альфав FF на 100% непрозрачного (0xFF000000 черный 100% непрозрачный) до 0 (0x00FFFFFF белый, 100% прозрачный)

+0

Спасибо за ответ, но, к сожалению, этот метод не будет работать для меня, потому что область содержит несколько теней (изображение изображения, которое я разместил, но с несколькими другими «зданиями» на экране, каждый с тенями, где каждая из этих теней находится в единый Area.Это означает, что я не могу получить конечные точки линии градиента.Поэтому мне было любопытно больше о том, как унывать/исчезать края Района. – Miles

+0

@ Майлз вы можете рассказать мне больше о ваших областях? –

+0

So каждый раз, когда добавляется новое здание, выполняется метод, который генерирует тени, которые более технически смотрят на углы каждого здания на основе местоположения источника света и соответственно генерируют многоугольник. Затем он добавляет каждый из этих полигонов в область (просто область Java2D, например Area a = new Area(); a.add (polygon)). Это потому, что тени частично прозрачны и если я не добавлял их в область, которая при рисовании essentiall y игнорирует перекрытие, они будут казаться более темными при перекрытиях теней. – Miles

Смежные вопросы