Я поиграл с этим и нашел хакерский способ избавиться от них. Я не уверен на 100%, что это будет работать во всех случаях, но может.
После прочтения, что JavaDoc в Area.transform упоминает
Преобразует геометрию этой области, используя указанные
AffineTransform. Геометрия преобразуется в место, которое
навсегда изменяет закрытую область, определенную этим объектом.
У меня была догадка, и я добавил возможность вращать Зону, удерживая клавишу. Когда Область вращалась, «внутренние» края начали медленно исчезать, пока не остался только контур. Я подозреваю, что «внутренние» ребра на самом деле являются двумя ребрами, очень близкими друг к другу (поэтому они выглядят как одно ребро), и что вращение области вызывает очень маленькие неточности округления, поэтому вращающийся вид «плавит» их вместе.
Затем я добавил код, чтобы вращать область очень маленькими шагами для полного круга при нажатии клавиш, и похоже, что артефакты исчезают:
Изображение слева - это Зона, построенная из 10 разных случайных треугольников (я увеличил количество треугольников, чтобы чаще получать «провальные» Области), а тот, что справа, - это та же Зона, после поворота на 360 градусов. градусов с очень маленьким шагом (10000 шагов).
Вот фрагмент кода для поворота области небольшими шагами (в большинстве случаев, вероятно, с меньшим количеством, чем 10000 шагов), будет работать нормально:
final int STEPS = 10000; //Number of steps in a full 360 degree rotation
double theta = (2*Math.PI) / STEPS; //Single step "size" in radians
Rectangle bounds = area.getBounds(); //Getting the bounds to find the center of the Area
AffineTransform trans = AffineTransform.getRotateInstance(theta, bounds.getCenterX(), bounds.getCenterY()); //Transformation matrix for theta radians around the center
//Rotate a full 360 degrees in small steps
for(int i = 0; i < STEPS; i++)
{
area.transform(trans);
}
Как я уже говорил, я не уверен, что это работает во всех случаях, и количество необходимых шагов может быть намного меньше или больше в зависимости от сценария. YMMV.