private ISurface CreateSegment(int uIdx, int vIdx, MathFunction function) { var meshDensity = Properties.MeshDensity; var uSize = Math.Abs(UDimension.Max - UDimension.Min) /(UDimension.KnotCount - 1); var vSize = Math.Abs(VDimension.Max - VDimension.Min) /(VDimension.KnotCount - 1); var u0 = UDimension.Min + uSize*uIdx; //afv[uIdx][vIdx].X; var u1 = UDimension.Min + uSize*(uIdx + 1); var v0 = VDimension.Min + vSize*vIdx; var v1 = VDimension.Min + vSize*(vIdx + 1); var uKnotsDistance = Math.Abs(u1 - u0); var xCount = Math.Ceiling(uKnotsDistance/meshDensity); var yKnotDistance = Math.Abs(v1 - v0); var yCount = Math.Ceiling(yKnotDistance/meshDensity); var verticesCount = (int) ((++xCount)*(++yCount)); var segmentMeshVertices = new VertexPositionNormalColor[verticesCount]; var k = 0; var x = (float) u0; for (var i = 0; i < xCount; i++, x += meshDensity) { x = x < u1 ? x : (float) u1; var y = (float) v0; for (var j = 0; j < yCount; j++, y += meshDensity) { y = y < v1 ? y : (float) v1; var z = (float) function.SafeCall(x, y); segmentMeshVertices[k++] = new VertexPositionNormalColor(new Vector3(x, y, z), DefaultNormal, DefaultColor); } } return new SimpleSurface(segmentMeshVertices, (int) xCount, (int) yCount); }