перепиши , мой алгоритм render. Я хочу добавить алгоритм z буффера для корректного отображения модельки, а также растеризацию полигонов. Гарантируется , что полигон это треугольник. Вот примерный алгоритм рестеризации через барицентрические координаты:

public class Triangle {
    private double xA, yA;
    private double xB, yB;
    private double xC, yC;

    public Triangle(double xA, double yA, double xB, double yB, double xC, double yC) {
        this.xA = xA;
        this.yA = yA;
        this.xB = xB;
        this.yB = yB;
        this.xC = xC;
        this.yC = yC;
    }

    public void setVertexA(double x, double y) {
        xA = x;
        yA = y;
    }

    public void setVertexB(double x, double y) {
        xB = x;
        yB = y;
    }

    public void setVertexC(double x, double y) {
        xC = x;
        yC = y;
    }

    public double[] getVertexA() {
        return new double[]{xA, yA};
    }

    public double[] getVertexB() {
        return new double[]{xB, yB};
    }

    public double[] getVertexC() {
        return new double[]{xC, yC};
    }

    public void draw(GraphicsContext gc) {
        // Отрисовка треугольника и его вершин
        rasterizeTriangle(gc);
        gc.setFill(Color.BLACK);
        gc.fillOval(xA - 5, yA - 5, 10, 10);
        gc.fillOval(xB - 5, yB - 5, 10, 10);
        gc.fillOval(xC - 5, yC - 5, 10, 10);
    }

    private void rasterizeTriangle(GraphicsContext gc) {
        double xMin = Math.min(xA, Math.min(xB, xC));
        double xMax = Math.max(xA, Math.max(xB, xC));
        double yMin = Math.min(yA, Math.min(yB, yC));
        double yMax = Math.max(yA, Math.max(yB, yC));

        for (int x = (int) xMin; x <= xMax; x++) {
            for (int y = (int) yMin; y <= yMax; y++) {
                double alpha = ((yB - yC) * (x - xC) + (xC - xB) * (y - yC)) /
                        ((yB - yC) * (xA - xC) + (xC - xB) * (yA - yC));
                double beta = ((yC - yA) * (x - xC) + (xA - xC) * (y - yC)) /
                        ((yB - yC) * (xA - xC) + (xC - xB) * (yA - yC));
                double gamma = 1 - alpha - beta;

                if (alpha >= 0 && beta >= 0 && gamma >= 0) {
                    // Интерполяция цвета
                    Color color = interpolateColor(alpha, beta, gamma, Color.RED, Color.BLACK, Color.BLUE);
                    gc.getPixelWriter().setColor(x, y, color);
                }
            }
        }
    }

    private Color interpolateColor(double alpha, double beta, double gamma, Color colorA, Color colorB, Color colorC) {
        double r = alpha * colorA.getRed() + beta * colorB.getRed() + gamma * colorC.getRed();
        double g = alpha * colorA.getGreen() + beta * colorB.getGreen() + gamma * colorC.getGreen();
        double b = alpha * colorA.getBlue() + beta * colorB.getBlue() + gamma * colorC.getBlue();
        return new Color(r, g, b, 1.0);
    }

    public boolean isNear(double mouseX, double mouseY, double x, double y) {
        return Math.hypot(mouseX - x, mouseY - y) < 10;
    }
}

однако в моем коде есть только Polygon
package com.cgvsu.model;

import java.util.ArrayList;
import java.util.List;

public class Polygon {

    // Индексы вершин, текстурных вершин и нормалей для каждой грани многоугольника
    private List<Integer> vertexIndices;
    private List<Integer> textureVertexIndices;
    private List<Integer> normalIndices;

    // Конструктор для инициализации списков
    public Polygon() {
        this.vertexIndices = new ArrayList<>();
        this.textureVertexIndices = new ArrayList<>();
        this.normalIndices = new ArrayList<>();
    }

    // Установить индексы вершин многоугольника
    public void setVertexIndices(List<Integer> vertexIndices) {
        if (vertexIndices.size() < 3) {
            throw new IllegalArgumentException("Многоугольник должен содержать не менее трех вершин.");
        }
        this.vertexIndices = new ArrayList<>(vertexIndices);
    }

    // Установить индексы текстурных вершин
    public void setTextureVertexIndices(List<Integer> textureVertexIndices) {
        this.textureVertexIndices = new ArrayList<>(textureVertexIndices);
    }

    // Установить индексы нормалей
    public void setNormalIndices(List<Integer> normalIndices) {
        this.normalIndices = new ArrayList<>(normalIndices);
    }

    // Получить индексы вершин
    public List<Integer> getVertexIndices() {
        return vertexIndices;
    }

    // Получить индексы текстурных вершин
    public List<Integer> getTextureVertexIndices() {
        return textureVertexIndices;
    }

    // Получить индексы нормалей
    public List<Integer> getNormalIndices() {
        return normalIndices;
    }

    // Метод для добавления индекса вершины
    public void addVertexIndex(int index) {
        vertexIndices.add(index);
    }

    // Метод для добавления индекса текстурной вершины
    public void addTextureVertexIndex(int index) {
        textureVertexIndices.add(index);
    }

    // Метод для добавления индекса нормали
    public void addNormalIndex(int index) {
        normalIndices.add(index);
    }

    // Метод для проверки, является ли многоугольник треугольником
    public boolean isTriangle() {
        return vertexIndices.size() == 3;
    }


}

можно ли как-то адаптировать полигон(я решил задачу триангуляции и теперь у меня все полигоны это треугольники) для растеризации треугольника, если да -то делай.

Итак, суммирую. Твоя задача: переписать метод render() добавив z буффер и растеризацию полигонов