/* * This file is part of Industrial Wires. * Copyright (C) 2016-2017 malte0811 * * Industrial Wires is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Industrial Wires is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Industrial Wires. If not, see . */ package malte0811.industrialWires.util; import net.minecraft.util.math.Vec3d; public final class Beziers { private Beziers() {} public static Vec3d getPoint(double t, Vec3d[] controls) { if (t==0) { return controls[0]; } else if (t==1) { return controls[controls.length-1]; } Vec3d ret = new Vec3d(0, 0, 0); int n = controls.length-1; for (int i = 0;i<=n;i++) { double coeff = binomialCoeff(n, i)*Math.pow(t, i)*Math.pow(1-t, n-i); ret = ret.addVector(coeff*controls[i].xCoord, coeff*controls[i].yCoord, coeff*controls[i].zCoord); } return ret; } public static int binomialCoeff(int n, int k) { return factorial(n-k+1, n)/factorial(2, k); } public static int factorial(int start, int end) { int ret = 1; for (int i = start;i<=end;i++) { ret *= i; } return ret; } }