// lattice point == узел решетки public static DataSource CreateSpiral(double width = 1, double height = 1, double depth = 2, int latticeCountX = 100, int latticeCountY = 100, int latticeCountZ = 200) { FuncDataSource3D <Vector3D> dataSource = new FuncDataSource3D <Vector3D>(latticeCountX, latticeCountY, latticeCountZ, (i, j, k) => { var xyAngle = 2 * Math.PI * j / latticeCountY; if (xyAngle < 0) { xyAngle += 2 * Math.PI; } else if (xyAngle > 2 * Math.PI) { xyAngle -= 2 * Math.PI; } Debug.WriteLine(xyAngle); Point3D result = new Point3D( width / 2.0 / latticeCountX * i * Math.Cos(xyAngle), height / 2.0 / latticeCountX * i * Math.Sin(xyAngle), depth / latticeCountZ * (k + xyAngle / (2 * Math.PI))); return(result); }, (i, j, k) => { //double x = i - latticeX / 2.0; //double y = j - latticeY / 2.0; //var xyAngle = Math.Atan2(y, x); var xyAngle = 2 * Math.PI * j / latticeCountY; var vector = new Vector3D( width / 2.0 / latticeCountX * i * Math.Cos(xyAngle), width / 2.0 / latticeCountY * i * Math.Sin(xyAngle), 0); var perpendicular = Vector3D.CrossProduct(vector, new Vector3D(0, 0, depth / latticeCountZ / 2.0)); perpendicular.Z = 0.1; perpendicular.Normalize(); perpendicular *= 0.1; return(perpendicular); }); return(dataSource); }
// lattice point == узел решетки public static DataSource CreateSpiral(double width = 1, double height = 1, double depth = 2, int latticeCountX = 100, int latticeCountY = 100, int latticeCountZ = 200) { FuncDataSource3D<Vector3D> dataSource = new FuncDataSource3D<Vector3D>(latticeCountX, latticeCountY, latticeCountZ, (i, j, k) => { var xyAngle = 2 * Math.PI * j / (double)(latticeCountY); if (xyAngle < 0) xyAngle += 2 * Math.PI; else if (xyAngle > 2 * Math.PI) xyAngle -= 2 * Math.PI; Debug.WriteLine(xyAngle); Point3D result = new Point3D( width / 2.0 / latticeCountX * i * Math.Cos(xyAngle), height / 2.0 / latticeCountX * i * Math.Sin(xyAngle), depth / latticeCountZ * (k + xyAngle / (2 * Math.PI))); return result; }, (i, j, k) => { //double x = i - latticeX / 2.0; //double y = j - latticeY / 2.0; //var xyAngle = Math.Atan2(y, x); var xyAngle = 2 * Math.PI * j / (double)(latticeCountY); var vector = new Vector3D( width / 2.0 / latticeCountX * i * Math.Cos(xyAngle), width / 2.0 / latticeCountY * i * Math.Sin(xyAngle), 0); var perpendicular = Vector3D.CrossProduct(vector, new Vector3D(0, 0, depth / latticeCountZ / 2.0)); perpendicular.Z = 0.1; perpendicular.Normalize(); perpendicular *= 0.1; return perpendicular; }); return dataSource; }