Простая java-игра: Заполнение фигур, нарисованных движущимся курсором

Итак, я делаю проект вводного курса по Java, и кажется, что я выбрал что-то, что выходит далеко за рамки того, что я могу сделать. :P
Будем очень признательны за любую помощь. Вот с чем у меня проблемы:

У вас есть курсор, которым управляет игрок (движется вперед или поворачивается на 90°), который оставляет за собой цветную линию. Если вам удастся пройти по своей линии и замкнуть многоугольник любой формы (правда, только прямые углы), его поверхность меняет цвет на цвет вашей линии.

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

Я посмотрел на алгоритм Scanline fill, но я думаю, что у него начнутся проблемы к тому времени, когда на карте уже будут заполнены некоторые полигоны. Алгоритм Floodfill был бы идеальным, если бы у меня был способ найти точку внутри многоугольника, но, поскольку существует множество различных возможностей, я не могу придумать для этого общего правила.

Я использую массив целых чисел 2x2, где каждый цвет представлен числом.

Кто-нибудь знает, как подойти к этой проблеме?


person José Miguel Arroyo    schedule 20.03.2013    source источник
comment
не могли бы вы опубликовать часть своего кода? что пробовали до сих пор?   -  person Aboutblank    schedule 20.03.2013


Ответы (2)


Если вы можете обнаружить ситуацию, то это можно решить очень просто. Вопрос в том, какую точку выбрать в качестве начальной точки заливки. Ответ прост: попробуйте все. Конечно имеет смысл начинать только с точек, смежных с той, где находится ваш курсор. В этом случае у вас будет не более 8 пунктов для проверки. Еще лучше - по крайней мере 2 из них уже точно закрашены, если текущая точка образует многоугольник.

Итак, у вас есть 8 пунктов для проверки. Запустите заливку 8 раз, начиная с каждой из этих точек.

Две вещи, которые вы, вероятно, должны иметь в виду:

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

  2. Запуская заливку второй раз и позже, вы должны повторно использовать эту клонированную версию вашего поля, чтобы увидеть, было ли оно там заполнено. Это позволит вам проверить каждую точку не более одного раза, и это сделает ваши 8 заливок почти такими же быстрыми, как 1 заливка.

person Snowbear    schedule 20.03.2013

Проверьте этот вопрос, используя Graphics2 и Polygon для заполнения произвольного многоугольника: проблема

Узнать, находится ли точка внутри или снаружи многоугольника: http://en.wikipedia.org/wiki/Point_in_polygon

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

person David    schedule 20.03.2013