// see https://en.wikipedia.org/wiki/Enneper_surface void Enneper(GeometricObject obj) { System.Func <int, int, Vector3> f = (r, c) => { var o = new Vector3(); var u = (float)r / 10f; var v = (float)c / 10f; o.x = u * (1f - u * u + v * v) / 3f; o.y = v * (1f - v * v + u * u) / 3f; o.z = (u * u - v * v) / 3f; return(o * 0.5f); }; var alpha = 1.0f; var pcl = new Color(1.0f, 1.0f, 1.0f, alpha); var fcl = new Color(0.5f, 0.5f, 1.0f, alpha); var bcl = new Color(0.5f, 0.5f, 0.0f, alpha); var rows = 51; var cols = 51; var idxs = new int[rows, cols]; var points = new List <Vector3> (); points.Clear(); for (var r = -rows / 2; r <= rows / 2; r++) { for (var c = -cols / 2; c <= cols / 2; c++) { idxs [rows / 2 + r, cols / 2 + c] = points.Count; points.Add(f(r, c)); } } obj.Begin(); obj.SetPointFrontColor(pcl); for (var r = 0; r < rows; r++) { for (var c = 0; c < cols; c++) { obj.AddPoint(points [idxs[r, c]]); } } obj.SetMeshFrontColor(fcl); obj.SetMeshBackColor(bcl); obj.AddMesh(rows, cols, points, idxs); obj.End(); }