示例#1
0
        private void ColorPass(float[] eniromentLight, float[] color, float[] normal, float[] p3D, float[] tex,
                               bool specular, int from)
        {
            ArrayMath.Sub(_lightPosArray, p3D, _l, 0, from, from, 3);
            ArrayMath.Normalize(_l, from, 3);

            var dotNl = ArrayMath.Dot(normal, _l, from, from, 3);

            ArrayMath.Mul(color, Math.Max(0f, dotNl), _Id, from, from, 3);

            ArrayMath.Mul(normal, dotNl * 2, _r, from, from, 3);
            ArrayMath.Sub(_r, _l, _r, from, from, from, 3);
            ArrayMath.Normalize(_r, from, 3);
            ArrayMath.Normalize(p3D, from, 3);

            var rDotP3D = -ArrayMath.Dot(_r, p3D, from, from, 3);

            var Is = 0f;

            if (specular)
            {
                var max = Math.Max(0, rDotP3D);
                Is = DeviceFunction.Pow(max, 50);
            }

            ArrayMath.Mul(eniromentLight, color, color, 0, from, from, 3);
            ArrayMath.Mul(tex, _Id, tex, from, from, from, 3);

            ArrayMath.Add(color, tex, color, from, from, from, 3);

            ArrayMath.Add(color, Is, color, from, 3);
            ArrayMath.Mul(color, 255, color, from, from, 3);
        }
 public virtual void TestAdd()
 {
     double[] d1prime = ArrayMath.Add(d1, 3);
     for (int i = 0; i < ArrayMath.NumRows(d1prime); i++)
     {
         NUnit.Framework.Assert.AreEqual(d1[i] + 3, 1e-5, d1prime[i]);
     }
 }
 /// <summary>
 ///
 /// </summary>
 public static void Add(this IDiscreteField <Vec3d> f0, IDiscreteField <Vec3d> f1, IDiscreteField <Vec3d> result, bool parallel = false)
 {
     if (parallel)
     {
         ArrayMath.AddParallel(f0.Values, f1.Values, f0.Count, result.Values);
     }
     else
     {
         ArrayMath.Add(f0.Values, f1.Values, f0.Count, result.Values);
     }
 }
示例#4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="vectors"></param>
        /// <param name="result"></param>
        public static void Sum(this IEnumerable <double[]> vectors, double[] result)
        {
            if (vectors is double[][] arr)
            {
                ArrayMath.Sum(arr, result);
                return;
            }

            Array.Clear(result, 0, vectors.First().Length);

            foreach (double[] v in vectors)
            {
                ArrayMath.Add(result, v, result);
            }
        }
示例#5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="vectors"></param>
        /// <param name="result"></param>
        public static void Mean(this IEnumerable <double[]> vectors, double[] result)
        {
            if (vectors is double[][] arr)
            {
                ArrayMath.Mean(arr, result);
                return;
            }

            Array.Clear(result, 0, vectors.First().Length);

            int count = 0;

            foreach (double[] v in vectors)
            {
                ArrayMath.Add(result, v, result);
                count++;
            }

            ArrayMath.Scale(result, 1.0 / count, result);
        }
示例#6
0
 public double ValueAt(double[] x)
 {
     return(ArrayMath.InnerProduct(x, ArrayMath.Add(x, 1)));
 }
示例#7
0
 // this function does on a large vector x^2+1
 public double[] DerivativeAt(double[] x)
 {
     return(ArrayMath.Add(ArrayMath.Multiply(x, 2), 1));
 }