package org.geogebra.common.geogebra3D.kernel3D.geos;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.Matrix.CoordMatrix4x4;
import org.geogebra.common.kernel.arithmetic.ExpressionNode;
import org.geogebra.common.kernel.arithmetic.FunctionNVar;
import org.geogebra.common.kernel.arithmetic.MyDouble;
import org.geogebra.common.kernel.arithmetic.NumberValue;
import org.geogebra.common.kernel.kernelND.GeoCoordSys2D;
import org.geogebra.common.kernel.kernelND.GeoDirectionND;
import org.geogebra.common.kernel.kernelND.GeoLineND;
import org.geogebra.common.kernel.kernelND.GeoPointND;
public class SurfaceTransform {
public static void transform(FunctionNVar[] fun, Kernel kernel,
CoordMatrix4x4 m) {
// current expressions
ExpressionNode[] expr = new ExpressionNode[3];
for (int i = 0; i < 3; i++) {
expr[i] = fun[i].deepCopy(kernel).getExpression();
}
for (int row = 0; row < 3; row++) {
MyDouble[] coeff = new MyDouble[4];
for (int i = 0; i < 4; i++) {
coeff[i] = new MyDouble(kernel, m.get(row + 1, i + 1));
}
ExpressionNode trans = new ExpressionNode(kernel, coeff[3]);
for (int i = 0; i < 3; i++) {
trans = trans.plus(expr[i].multiply(coeff[i]));
}
fun[row].setExpression(trans);
}
}
public static void mirror(FunctionNVar[] fun, Kernel kernel,
GeoCoordSys2D plane) {
CoordMatrix4x4 m = plane.getCoordSys().getMatrixOrthonormal();
transform(fun, kernel,
CoordMatrix4x4.PlaneSymetry(m.getVz(), m.getOrigin()));
}
public static void mirror(FunctionNVar[] fun, Kernel kernel,
GeoLineND line) {
transform(fun, kernel,
CoordMatrix4x4.AxialSymetry(
line.getDirectionInD3().normalized(),
line.getStartInhomCoords()));
}
public static void rotate(FunctionNVar[] fun, Kernel kernel, NumberValue r,
GeoPointND s, CoordMatrix4x4 tmpMatrix4x4) {
CoordMatrix4x4.Rotation4x4(r.getDouble(), s.getInhomCoordsInD3(),
tmpMatrix4x4);
transform(fun, kernel, tmpMatrix4x4);
}
public static void rotate(FunctionNVar[] fun, Kernel kernel, NumberValue r,
CoordMatrix4x4 tmpMatrix4x4) {
CoordMatrix4x4.Rotation4x4(r.getDouble(), tmpMatrix4x4);
transform(fun, kernel, tmpMatrix4x4);
}
public static void rotate(FunctionNVar[] fun, Kernel kernel, NumberValue r,
GeoPointND s, GeoDirectionND orientation,
CoordMatrix4x4 tmpMatrix4x4) {
CoordMatrix4x4.Rotation4x4(orientation.getDirectionInD3().normalized(),
r.getDouble(), s.getInhomCoordsInD3(), tmpMatrix4x4);
transform(fun, kernel, tmpMatrix4x4);
}
public static void rotate(FunctionNVar[] fun, Kernel kernel, NumberValue r,
GeoLineND line, CoordMatrix4x4 tmpMatrix4x4) {
CoordMatrix4x4.Rotation4x4(line.getDirectionInD3().normalized(),
r.getDouble(), line.getStartInhomCoords(), tmpMatrix4x4);
transform(fun, kernel, tmpMatrix4x4);
}
}