Я создаю средство 3D-рендеринга на Java, но у меня возникла проблема при попытке отобразить многоугольники с заливкой сплошным цветом. Он работает отлично, но время от времени он рвется, но я не уверен, потому ли это, что алгоритм неэффективен, или это что-то еще, потому что он рвется только в вершинах. Вот картинка:
Каркас: Вы можете видеть, что рядом с вершинами или, вернее, точками полигонов оно рвется. Я сохраняю цвет пикселей в двумерном массиве, а затем просматриваю его и визуализирую. Он все еще рвется, даже когда я делаю полигон очень маленьким, поэтому я не думаю, что это проблема производительности. Я использую алгоритм Брешема и сохраняю пиксели в двумерном массиве, затем в многоугольнике я получаю пиксели и превращаю их в один большой массив, который я циклически перебираю по y, а затем по x, пока не наткнусь на пиксель. Это устанавливается как beginLine, а затем последний устанавливается как endLine. Затем я рисую линию между точками.
public void render()
{
int tempPixels[][] = new int[(int) Math.max(vertex_1.getX(), Math.max(vertex_2.getX(), vertex_3.getX())) + 30][(int) Math.max(vertex_1.getY(), Math.max(vertex_2.getY(), vertex_3.getY())) + 30];
for (int x = 0; x < vector_1.getWidth(); x++)
{
for (int y = 0; y < vector_1.getHeight(); y++)
{
if (vector_1.getPixels()[x][y] == 1)
{
tempPixels[(int) (x + Math.min(vertex_1.getX(), vertex_2.getX()))][(int) (y + Math.min(vertex_1.getY(), vertex_2.getY()))] = 1;
}
}
}
for (int x = 0; x < vector_2.getWidth(); x++)
{
for (int y = 0; y < vector_2.getHeight(); y++)
{
if (vector_2.getPixels()[x][y] == 1)
{
tempPixels[(int) (x + Math.min(vertex_2.getX(), vertex_3.getX()))][(int) (y + Math.min(vertex_2.getY(), vertex_3.getY()))] = 1;
}
}
}
for (int x = 0; x < vector_3.getWidth(); x++)
{
for (int y = 0; y < vector_3.getHeight(); y++)
{
if (vector_3.getPixels()[x][y] == 1)
{
tempPixels[(int) (x + Math.min(vertex_3.getX(), vertex_1.getX()))][(int) (y + Math.min(vertex_3.getY(), vertex_1.getY()))] = 1;
}
}
}
for (int y = 0; y < (int) Math.max(vertex_1.getY(), Math.max(vertex_2.getY(), vertex_3.getY())) + 4; y++)
{
int beginLine = -1;
int endLine = -1;
for (int x = 0; x < (int) Math.max(vertex_1.getX(), Math.max(vertex_2.getX(), vertex_3.getX())) + 4; x++)
{
if (tempPixels[x][y] == 1)
{
if (beginLine == -1)
{
beginLine = x;
}
else
{
endLine = x;
}
}
}
for (int i = beginLine; i < endLine; i++)
{
pixels[i][y] = 1;
colors[i][y] = Color.PINK;
}
}
vector_1.render();
vector_2.render();
vector_3.render();
vertex_1.render();
vertex_2.render();
vertex_3.render();
}
Итак, в основном мои вопросы: является ли этот алгоритм неэффективным, если да, то что было бы лучше? Почему рвется только около вершин?