2010-05-28 4 views
2

Если у меня есть QuadCurve как это (+ = узел):Java2D: Наполните выпуклый округлый многоугольник (QuadCurves)

+   + 
\  ./ 
    +--⁻⁻ 

И я заполню его в Java 2D получается нечто вроде этого: (x = цвета)

+xxxxxxxxx+ 
\xxxxxx./ 
    +--⁻⁻ 

Но я хочу, чтобы цвет другой стороны:

+   + 
x\  ./x 
xxx +--⁻⁻xx 
xxxxxxxxxxx 

Это succe eds, рисуя прямоугольник вокруг кривой в цвете, я хочу покрасить другую сторону, а затем заполнить кривую цветом фона.

Но это недостаточно для заполнения выпуклого закругленного (на основе QuadCurves) многоугольника. В случае некоторых координат для прямоугольников (как объяснялось в используемом трюке) перекрываются другие части многоугольника. Вот два изображения (зеленая зона мой многоугольник):

alt text http://img204.imageshack.us/img204/7823/convexpolygon.pngalt text http://img708.imageshack.us/img708/3669/convexpolygon2.png

Итак, вопрос прост: «Как я могу окрасить форму сборки кривых?»
Но ответить будет непросто, я думаю ...

Любой совет будет ОЧЕНЬ ОЧЕНЬ высоко оценен.
Спасибо заранее.

Может быть, я собираюсь сделать Баунти на этот вопрос, если я не получаю ответа

ответ

2

Выберите точку, как известно, находится внутри полигона.

Знайте «цвет границы» (в данном случае черный).

recurrsiveFill(Pixel p, Color fill, Color bound) { 
    p.setColor(fill); 
    if(p.left.color != bound && p.left.color != fill) 
     recurrsiveFill(p.left , fill, bound); 
    if(p.right.color != bound && p.right.color != fill) 
     recurrsiveFill(p.right, fill, bound); 
    if(p.up.color != boun d&& p.up.color != fill) 
     recurrsiveFill(p.up, fill, bound); 
    if(p.down.color != bound && p.down.color != fill) 
     recurrsiveFill(p.down, fill, bound); 
} 

Вы можете адаптировать это при необходимости в соответствии с вашими потребностями.

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

+0

Это действительно возможный путь! Но мне нужно это в игре. Итак, мне интересно, достаточно ли это, чтобы сделать игру со скоростью 40 кадров в секунду. –

+0

Не забудьте проверить это! –

+1

Ну, Martijn, если я не сделал в нем какую-то новичковую ошибку (возможно, я не прошел через нее), это должно быть O (n) с точки зрения количества пикселей, которые вам нужно окрасить, Думаю, тебе станет лучше. Там может быть более активное участие, если вы используете диапазон цветов в качестве границы. , , , , Другое дело иметь в виду, почему вы так делаете, и, возможно, есть лучший способ сделать что-то. Есть ли способ, которым вы могли предварительно визуализировать эти кривые и загружать из сохраненного изображения? Оптимизации, как это лучше всего! – corsiKa