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);
        }