График интерполяции

Версия Minecraft
1.16+
API
Forge
342
33
54
HI

Как рендерить график интерполяции? (интерполяция может быть разной от linear до elastic)
График должен представлять собой точку, за которой рисуется линия.
 
Создаёшь последовательность из n точек, по которым строятся вектора.
Типа coord1, coord 2, coord3, ..., coord_n.
Тогда вектора имеют вид coord2-coord1, coord3-coord2, ..., coord_n - coord_n-1.
Сами точки откладываешь каждый k тиков.
После, во время рендера, пробегаешься по последовательности и рисуешь вектор coord_i-coord_i-1 параллельно с точкой coord_i.

ЛИБО рисуешь кривыми Безье (более аккуратный вариант, но затратнее по времени разработки).
 
График должен представлять собой точку, за которой рисуется линия
Java:
    private final Minecraft mc = Minecraft.getInstance();

    private double linear(double start, double end, double t) {
        return start + (end - start) * t;
    }

    private double elastic(double start, double end, double t) {
        double c5 = (2 * Math.PI) / 3;
        return (t == 0) ? start : (t == 1) ? end : (Math.pow(2, -10 * t) * Math.sin((t - 0.075) * c5) + end);
    }

    public void renderGraph() {
        List<Vector3d> points = new ArrayList<>();
        double start = 0;
        double end = 1;
        int steps = 100;

        for (int i = 0; i <= steps; i++) {
            double t = (double) i / steps;
            // или так
            double y = this.linear(start, end, t);
            // или так
            double y = this.elastic(start, end, t);
            points.add(new Vector3d(t, y, 0));
        }

        RenderSystem.pushMatrix();
        RenderSystem.disableTexture();
        RenderSystem.enableBlend();
        RenderSystem.defaultBlendFunc();
        RenderSystem.lineWidth(2.0F);

        GL11.glBegin(GL11.GL_LINE_STRIP);
        for (Vector3d point : points) {
            GL11.glVertex3d(point.x * 100, point.y * 100, point.z);
        }
        GL11.glEnd();

        RenderSystem.pointSize(5.0F);
        GL11.glBegin(GL11.GL_POINTS);
        for (Vector3d point : points) {
            GL11.glVertex3d(point.x * 100, point.y * 100, point.z);
        }
        GL11.glEnd();

        RenderSystem.enableTexture();
        RenderSystem.popMatrix();
    }
 
Назад
Сверху