(пожалуйста, не помечайте этот вопрос как неясный, я потратил много времени на его публикацию;))
Хорошо, я пытаюсь сделать простой движок 2d-игры на Java в качестве учебного проекта,и частично это рендеринг заполненного многоугольника как объекта.Я сам создаю этот алгоритм, и я действительно не могу понять, что я делаю неправильно.Мой хотя процесс выглядит примерно так: перебрать каждую строку, получить количество точек в этой строке, затем получить X-положение каждой точки в этой строке, а затем повторить цикл по этой линии снова, проверяя, является ли х в циклевнутри одной из линий в массиве точек, если это так, нарисуйте ее.
Отказ от ответственности: класс Polygon - это другой тип сетки, а его метод draw возвращает массив int, в котором линии проходят через каждую вершину.Отказ от ответственности 2: Я пробовал решения других людей, но никто не помог мне, и никто не объяснил это должным образом (это не главное в учебном проекте).
Методы рисования называются по одному на кадр.FilledPolygon:
@Override
public int[] draw() {
int[] pixels = new Polygon(verts).draw();
int[] filled = new int[width * height];
for (int y = 0; y < height; y++) {
int count = 0;
for (int x = 0; x < width; x++) {
if (pixels[x + y * width] == 0xffffffff) {
count++;
}
}
int[] points = new int[count];
int current = 0;
for (int x = 0; x < width; x++) {
if (pixels[x + y * width] == 0xffffffff) {
points[current] = x;
current++;
}
}
if (count >= 2) {
int num = count;
if (count % 2 != 0)
num--;
for (int i = 0; i < num; i += 2) {
for (int x = points[i]; x < points[i+1]; x++) {
filled[x + y * width] = 0xffffffff;
}
}
}
}
return filled;
}
Класс Polygon просто использует линейный алгоритм Брезенхэма и не имеет ничего общего с проблемой.Класс игры:
@Override
public void load() {
obj = new EngineObject();
obj.addComponent(new MeshRenderer(new FilledPolygon(new int[][] {
{0,0},
{60, 0},
{0, 60},
{80, 50}
})));
((MeshRenderer)(obj.getComponent(MeshRenderer.class))).color = CYAN;
obj.transform.position.Y = 100;
}
Ожидаемый результат - заполнить эту фигуру (она была создана с использованием многоугольной сетки):
фактический результат использования сетки FilledPolygon: