/// <summary>
 ///  投影
 /// </summary>
 /// <param name="data">二维数据</param>
 /// <param name="width">数据宽度</param>
 /// <param name="height">数据高度</param>
 /// <param name="orientType">投影的方向(水平或垂直)</param>
 /// <param name="average">是否去平均值</param>
 /// <param name="result">投影的结果</param>
 protected void projection(ref Byte[] data, Int32 width, Int32 height, ValueImage.Infrastructure.OrientationType orientType, Boolean average, out Int32[] result)
 {
     if (orientType == Infrastructure.OrientationType.Horizontal)
     {
         result = new Int32[height];
         for (int i = 0; i < height; i++)
         {
             for (int j = 0; j < width; j++)
             {
                 result[i] += data[i * width + j];
             }
             if (average)
             {
                 result[i] /= width;
             }
         }
     }
     else if (orientType == Infrastructure.OrientationType.Vertical)
     {
         result = new Int32[width];
         for (int i = 0; i < width; i++)
         {
             for (int j = 0; j < height; j++)
             {
                 result[i] += data[j * width + i];
             }
             if (average)
             {
                 result[i] /= height;
             }
         }
     }
     else
     {
         result = new Int32[0];
     }
 }
        /// <summary>
        ///  投影
        /// </summary>
        protected void projection(ref Byte[] data, Int32 width, Int32 height, Double angle, ValueImage.Infrastructure.OrientationType orientType, out Int32[] result)
        {
            if (angle == System.Math.PI / 2)
            {
                projection(ref data, width, height, orientType, false, out result);
                return;
            }

            if (orientType == OrientationType.Horizontal)
            {
                result = new Int32[height];
                for (int j = 0; j < height; j++)
                {
                    for (int i = 0; i < width; i++)
                    {
                        Int32 y = ((Int32)((Double)i / System.Math.Tan(angle)) + j);

                        if (y >= 0 && y < height)
                        {
                            result[y] += data[j * width + i];
                        }
                    }
                }
            }
            else if (orientType == OrientationType.Vertical)
            {
                result = new Int32[width];
                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        Int32 x = ((Int32)((Double)j / System.Math.Tan(angle)) + i);
                        if (x >= 0 && x < width)
                        {
                            result[j * width + x] += data[j * width + i];
                        }
                    }
                }
            }
            else
            {
                result = new Int32[0];
            }
        }
 /// <summary>
 ///  投影
 /// </summary>
 /// <param name="data">二维数据</param>
 /// <param name="width">数据宽度</param>
 /// <param name="height">数据高度</param>
 /// <param name="orientType">投影的方向(水平或垂直)</param>
 /// <param name="result">投影的结果</param>
 protected void projection(ref Byte[] data, Int32 width, Int32 height, ValueImage.Infrastructure.OrientationType orientType, out Int32[] result)
 {
     this.projection(ref data, width, height, orientType, true, out result);
 }