Ejemplo n.º 1
0
        private double GetRandomTime(TimeComponent thisTimeComponent)
        {
            double result = 0;

            switch (thisTimeComponent)
            {
            case TimeComponent.hours:
                result = ImSoRandom.Next(0, 24);
                break;

            case TimeComponent.minutes:
                result = ImSoRandom.Next(0, 60);
                break;

            case TimeComponent.seconds:
                result = ImSoRandom.Next(0, 60);
                break;

            case TimeComponent.milliseconds:
                result = ImSoRandom.Next(0, 1000);
                break;

            default:
                break;
            }

            return(result);
        }
Ejemplo n.º 2
0
        public Ray GetRay(float u, float v, ImSoRandom rnd)
        {
            var   rd     = LensRadius * rnd.RandomInUnitDisk();
            var   offset = U * rd.X + V * rd.Y;
            float time   = Time0 + rnd.NextFloat() * (Time1 - Time0);

            return(new Ray(Origin + offset, LowerLeftCorner + u * Horizontal + v * Vertical - Origin - offset, time));
        }
Ejemplo n.º 3
0
        public static (List <IHitable>, Camera) PoolScene(ImSoRandom rnd, int nx, int ny)
        {
            var world = new List <IHitable>();

            world.Add(new Sphere(new Vector3(0, -1000f, 0), 1000, new Lambertian(new ConstantTexture(0.33f, 0.67f, 0.0f))));
            var red    = new ConstantTexture(0.68f, 0.13f, 0.16f);
            var yellow = new ConstantTexture(1f, 0.74f, 0.13f);
            var black  = new ConstantTexture(0.14f, 0.07f, 0.07f);
            var white  = new ConstantTexture(1f, 1f, 0.9f);

            for (var a = 1f; a <= 5; a += 1f)
            {
                var counter = 0 - a;
                for (var b = 0f; b < a; b += 1f)
                {
                    var center = new Vector3(a * 0.9f - 5f, 0.5f, a / 2f - b - 0.5f);
                    var colour = counter % 2 == 0 ? red : yellow;
                    if (a == 3 && b == 1)
                    {
                        colour = black;
                    }
                    if (a == 3 && b == 2)
                    {
                        colour = red;
                    }
                    if (a == 5 && b == 4)
                    {
                        colour = red;
                    }
                    world.Add(new Sphere(center, 0.45f,
                                         new Lambertian(colour)));
                    world.Add(new Sphere(center, 0.5f,
                                         new Dialectric(1.5f)));
                    counter++;
                }
            }

            var cueCenter  = new Vector3(-6, 0.5f, 0);
            var cueCenter1 = cueCenter + new Vector3(0.75f * rnd.NextFloat(), 0, 0);

            world.Add(new MovingSphere(cueCenter, cueCenter1, 0.0f, 1.0f, 0.5f,
                                       new Dialectric(1.5f)));
            world.Add(new MovingSphere(cueCenter, cueCenter1, 0.0f, 1.0f, 0.45f,
                                       new Lambertian(white)));

            world.Add(new RectXZ(-3, 3, -2, 2, 5, new DiffuseLight(new ConstantTexture(new Vector3(15, 15, 15)))));

            var lookFrom    = new Vector3(-9, 3.5f, 12);
            var lookAt      = new Vector3(-3, 0, 0);
            var distToFocus = (lookFrom - new Vector3(-6, 0.5f, 0)).Length();
            var aperture    = 0.5f;

            var cam = new Camera(lookFrom, lookAt, new Vector3(0, 1, 0), 20, (float)nx / (float)ny, aperture, distToFocus, 0.0f, 1.0f);

            return(world, cam);
        }
        public static Vector3 RandomInUnitSphere(this ImSoRandom random)
        {
            var p = new Vector3();

            do
            {
                p = 2.0f * new Vector3(random.NextFloat(), random.NextFloat(), random.NextFloat()) - new Vector3(1, 1, 1);
            } while (p.LengthSquared() >= 1.0f);
            return(p);
        }
        public static Vector3 RandomInUnitDisk(this ImSoRandom random)
        {
            var p = new Vector3();

            do
            {
                p = 2.0f * new Vector3(random.NextFloat(), random.NextFloat(), 0) - new Vector3(1, 1, 0);
            } while (Vector3.Dot(p, p) >= 1.0f);
            return(p);
        }
        public double GetGaussianDouble()
        {
            // http://stackoverflow.com/questions/218060/random-gaussian-variables
            // Box-Muller transform
            double u1            = ImSoRandom.NextDouble();
            double u2            = ImSoRandom.NextDouble();
            double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2);
            double randNormal    = this.Mean + this.StandardDeviation * randStdNormal;

            return(randNormal);
        }
Ejemplo n.º 7
0
 public object SelectData()
 {
     if (ImSoRandom.Next(0, 2) == 0)
     {
         return(false);
     }
     else
     {
         return(true);
     }
 }
Ejemplo n.º 8
0
        public object SelectData()
        {
            TimeSpan timeSpan = Upper.Subtract(Lower);
            DateTime result   = Lower.AddDays(ImSoRandom.Next(0, timeSpan.Days + 1));

            result = result.AddHours(GetRandomTime(TimeComponent.hours));
            result = result.AddMinutes(GetRandomTime(TimeComponent.minutes));
            result = result.AddSeconds(GetRandomTime(TimeComponent.seconds));
            result = result.AddMilliseconds(GetRandomTime(TimeComponent.milliseconds));
            return(result);
        }
Ejemplo n.º 9
0
        public static (List <IHitable>, Camera) RandomScene(ImSoRandom rnd, int nx, int ny)
        {
            var world = new List <IHitable>();

            var texture = new CheckerTexture(new ConstantTexture(0.2f, 0.3f, 0.1f), new ConstantTexture(0.9f, 0.9f, 0.9f));

            world.Add(new Sphere(new Vector3(0, -1000f, 0), 1000, new Lambertian(texture)));

            for (int a = -11; a < 11; a++)
            {
                for (int b = -11; b < 11; b++)
                {
                    float choose_mat = rnd.NextFloat();
                    var   center     = new Vector3(a + 0.9f * rnd.NextFloat(), 0.2f, b + 0.9f * rnd.NextFloat());
                    if ((center - new Vector3(4, 0.2f, 0)).Length() > 0.9)
                    {
                        if (choose_mat < 0.8)
                        {  // diffuse
                            world.Add(new MovingSphere(center, center + new Vector3(0, 0.5f * rnd.NextFloat(), 0), 0.0f, 1.0f, 0.2f, new Lambertian(new ConstantTexture(rnd.NextFloat() * rnd.NextFloat(), rnd.NextFloat() * rnd.NextFloat(), rnd.NextFloat() * rnd.NextFloat()))));
                            //world.Add(new Sphere(center, 0.2f, new Lambertian(new Vector3(rnd.NextFloat() * rnd.NextFloat(), rnd.NextFloat() * rnd.NextFloat(), rnd.NextFloat() * rnd.NextFloat()))));
                        }
                        else if (choose_mat < 0.95)
                        { // metal
                            world.Add(new Sphere(center, 0.2f,
                                                 new Metal(new Vector3(0.5f * (1 + rnd.NextFloat()), 0.5f * (1 + rnd.NextFloat()), 0.5f * (1 + rnd.NextFloat())), 0.5f * rnd.NextFloat())));
                        }
                        else
                        {  // glass
                            world.Add(new Sphere(center, 0.2f, new Dialectric(1.5f)));
                        }
                    }
                }
            }

            world.Add(new Sphere(new Vector3(0, 1, 0), 1.0f, new Dialectric(1.5f)));
            world.Add(new Sphere(new Vector3(-4, 1, 0), 1.0f, new Lambertian(new ConstantTexture(0.4f, 0.2f, 0.1f))));
            world.Add(new Sphere(new Vector3(4, 1, 0), 1.0f, new Metal(new Vector3(0.7f, 0.6f, 0.5f), 0f)));

            world.Add(new Sphere(new Vector3(0, 0, 0), 20.0f, new DiffuseLight(new ConstantTexture(new Vector3(1, 1, 1)))));


            var lookFrom    = new Vector3(13, 2, 3);
            var lookAt      = new Vector3(0, 0, 0);
            var distToFocus = 10;
            var aperture    = 0.1f;

            var cam = new Camera(lookFrom, lookAt, new Vector3(0, 1, 0), 20, (float)nx / (float)ny, aperture, distToFocus, 0.0f, 1.0f);

            return(world, cam);
        }
Ejemplo n.º 10
0
        static Vector3 Color(Ray r, IHitable[] world, int depth, ImSoRandom rnd, ref uint rayCount)
        {
            rayCount++;

            var rec = new HitRecord();

            if (world.Hit(r, 0.001f, float.MaxValue, ref rec))
            {
                Ray     scattered;
                Vector3 attenuation;
                var     emitted = rec.Material.Emitted(0, 0, ref rec.P);
                if (depth < 50 && rec.Material.Scatter(r, rec, out attenuation, out scattered, rnd))
                {
                    return(emitted + attenuation * Color(scattered, world, depth + 1, rnd, ref rayCount));
                }
                else
                {
                    return(emitted);
                }
            }
            return(Vector3.Zero);
        }
Ejemplo n.º 11
0
        private static void RenderRow(Image <Rgba32> image, IHitable[] wl, Camera cam, int j, int nx, int ny, int ns, ImSoRandom rnd, ConcurrentDictionary <int, int> processedRows, ref uint rayCount)
        {
            var index   = ny - 1 - j;
            var rowSpan = image.GetPixelRowSpan(index);

            for (int i = 0; i < nx; i++)
            {
                var col = new Vector3(0);

                for (var s = 0; s < ns; s++)
                {
                    float u = ((float)i + rnd.NextFloat()) / (float)nx;
                    float v = ((float)j + rnd.NextFloat()) / (float)ny;
                    var   r = cam.GetRay(u, v, rnd);
                    col += Color(r, wl, 0, rnd, ref rayCount);
                }

                col /= (float)ns;
                col  = new Vector3((float)Math.Sqrt(col.X), (float)Math.Sqrt(col.Y), (float)Math.Sqrt(col.Z));

                rowSpan[i] = new Rgba32(col);
            }
            processedRows.TryAdd(j, Thread.CurrentThread.ManagedThreadId);
        }
Ejemplo n.º 12
0
 public object SelectData()
 {
     return(ImSoRandom.Next(this.Lower, this.Upper));
 }
Ejemplo n.º 13
0
 public int SelectRandom(int lower, int upper)
 {
     return(ImSoRandom.Next(lower, upper));
 }
Ejemplo n.º 14
0
        public object SelectData()
        {
            double result = ImSoRandom.NextDouble();

            return((Single)result);
        }
Ejemplo n.º 15
0
 public object SelectData()
 {
     return((decimal)ImSoRandom.NextDouble());
 }
 public static Vector3 RandomVector(this ImSoRandom random)
 {
     return(new Vector3(10 + random.NextFloat() * 400f, 10 + random.NextFloat() * 400f, 10 + random.NextFloat() * 400f));
 }
        public override bool Scatter(Ray rayIn, HitRecord rec, out Vector3 attenuation, out Ray scattererd, ImSoRandom random)
        {
            Vector3 reflected = Vector3.Reflect(rayIn.Direction, rec.Normal);

            attenuation = new Vector3(1.0f);

            Vector3 outward_normal;
            float   niOverNt;
            float   cosine;

            if (Vector3.Dot(rayIn.Direction, rec.Normal) > 0)
            {
                outward_normal = -rec.Normal;
                niOverNt       = _refIndex;
                cosine         = _refIndex * Vector3.Dot(rayIn.Direction, rec.Normal) / rayIn.Direction.Length();
            }
            else
            {
                outward_normal = rec.Normal;
                niOverNt       = 1.0f / _refIndex;
                cosine         = -Vector3.Dot(rayIn.Direction, rec.Normal) / rayIn.Direction.Length();
            }

            Vector3 refracted;
            float   reflectProb;

            if (Refract(rayIn.Direction, outward_normal, niOverNt, out refracted))
            {
                reflectProb = Schlick(cosine, _refIndex);
            }
            else
            {
                reflectProb = 1.0f;
            }

            if (random.NextFloat() < reflectProb)
            {
                scattererd = new Ray(rec.P, reflected, rayIn.Time);
            }
            else
            {
                scattererd = new Ray(rec.P, refracted, rayIn.Time);
            }
            return(true);
        }
        public override bool Scatter(Ray rayIn, HitRecord rec, out Vector3 attenuation, out Ray scattererd, ImSoRandom rnd)
        {
            Vector3 target = rec.P + rec.Normal + rnd.RandomInUnitSphere();

            scattererd  = new Ray(rec.P, target - rec.P, rayIn.Time);
            attenuation = _albedo.value(rec.U, rec.V, ref rec.P);
            return(true);
        }
Ejemplo n.º 19
0
 public object SelectData()
 {
     return(ImSoRandom.Next(int.MinValue, int.MaxValue));
 }
 public override bool Scatter(Ray rayIn, HitRecord hitRecord, out Vector3 attenuation, out Ray scattererd, ImSoRandom rnd)
 {
     attenuation = Vector3.Zero;
     scattererd  = new Ray(Vector3.Zero, Vector3.Zero, 0);
     return(false);
 }
 public object SelectData()
 {
     return(ImSoRandom.NextDouble() * (Upper - Lower) + Lower);
 }
 public object SelectData()
 {
     return(Strings.ElementAt(ImSoRandom.Next(0, Strings.Count())));
 }
Ejemplo n.º 23
0
        public static (List <IHitable>, Camera) CornellScene(string objPath, ImSoRandom rnd, int nx, int ny)
        {
            var world = new List <IHitable>();

            var grad  = new Lambertian(new ColourTexture());
            var blue  = new Lambertian(new ConstantTexture(0.05f, 0.05f, 0.65f));
            var red   = new Lambertian(new ConstantTexture(0.65f, 0.05f, 0.05f));
            var white = new Lambertian(new ConstantTexture(0.73f, 0.73f, 0.73f));
            var green = new Lambertian(new ConstantTexture(0.12f, 0.45f, 0.15f));
            var light = new DiffuseLight(new ConstantTexture(15f, 15f, 15f));
            var glass = new Dialectric(1.5f);

            world.Add(new RectXZ(213, 343, 227, 332, 554, light));

            world.Add(new FlipNormals(new RectYZ(0, 555, 0, 555, 555, green)));
            world.Add(new RectYZ(0, 555, 0, 555, 0, red));
            world.Add(new FlipNormals(new RectXZ(0, 555, 0, 555, 555, white)));
            world.Add(new RectXZ(0, 555, 0, 555, 0, white));
            world.Add(new FlipNormals(new RectXY(0, 555, 0, 555, 555, white)));

            //world.Add( new Translate( new Box(Vector3.Zero, new Vector3(165, 165, 165), white), new Vector3(130, 0, 65)));
            //world.Add( new Translate( new Box(Vector3.Zero, new Vector3(165, 330, 165), white), new Vector3(265, 0, 295)));

            //world.Add(new Sphere(new Vector3(0, 0, 0), 3000.0f, new DiffuseLight(new ConstantTexture(new Vector3(1, 1, 1)))));

            /*
             * for (int i = 0; i < 50; i++)
             * {
             *  var a = rnd.RandomVector();
             *  var b = rnd.RandomVector();
             *  var c = rnd.RandomVector();
             *
             *  //world.Add(new Translate(new Triangle(new Vector3(rnd.NextFloat() * 555f, rnd.NextFloat() * 555f, rnd.NextFloat() * 555f), new Vector3(rnd.NextFloat() * 555f, rnd.NextFloat() * 555f, rnd.NextFloat() * 555f), new Vector3(rnd.NextFloat() * 555f, rnd.NextFloat() * 555f, rnd.NextFloat() * 555f), red),new Vector3(10 + rnd.NextFloat() * 100f, 10 + rnd.NextFloat() * 100f, 10 + rnd.NextFloat() * 100f)));
             *  world.Add(new Triangle(a, b, c, blue));
             * }
             *
             */
            //world.Add(new Triangle( new Vector3(340, 90, 62),new Vector3(100, 320, 190), new Vector3(262, 331, 400), grad));

            var objLoaderFactory = new ObjLoaderFactory();
            var objLoader        = objLoaderFactory.Create();
            var fileStream       = new FileStream(objPath, FileMode.Open);
            var obj          = objLoader.Load(fileStream);
            var objBox       = obj.GetBoundingBox();
            var centerOffset = objBox.Center();
            var height       = objBox.Max.Y - objBox.Min.Y;

            var scaleFactor      = new Vector3(50, 50, 50);       // scale obj to wold space
            var displacement     = new Vector3(555f / 2, height / 2f * scaleFactor.Y, 555f / 3 * 2);
            var glossScaleFactor = new Vector3(0.5f, 0.5f, 0.5f); // scale the unit vector normal

            foreach (var g in obj.Groups)
            {
                foreach (var f in g.Faces)
                {
                    // Verticies have their origin set to the center of the bounding box
                    var v0 = obj.Vertices[f[0].VertexIndex - 1].ToVector3() - centerOffset;
                    var v1 = obj.Vertices[f[1].VertexIndex - 1].ToVector3() - centerOffset;
                    var v2 = obj.Vertices[f[2].VertexIndex - 1].ToVector3() - centerOffset;

                    var t = new Triangle(v0 * scaleFactor, v1 * scaleFactor, v2 * scaleFactor, glass);

                    // add Dialectric
                    world.Add(new Translate(t, displacement));

                    // add Lambertian. translated toward obj center by glossScaleFactor of a unit vector
                    world.Add(new Translate(new Triangle(v0 * scaleFactor, v1 * scaleFactor, v2 * scaleFactor, white), displacement - Vector3.Normalize(t.Normal)));
                }
            }

            var lookFrom    = new Vector3(278, 278, -800);
            var lookAt      = new Vector3(278, 278, 0);
            var distToFocus = (lookFrom - lookAt).Length() - scaleFactor.Length() / 2;
            var aperture    = 0.1f;
            var vFov        = 40;

            var cam = new Camera(lookFrom, lookAt, new Vector3(0, 1, 0), vFov, (float)nx / (float)ny, aperture, distToFocus, 0.0f, 1.0f);

            return(world, cam);
        }
Ejemplo n.º 24
0
        public override bool Scatter(Ray rayIn, HitRecord rec, out Vector3 attenuation, out Ray scattererd, ImSoRandom rnd)
        {
            Vector3 reflected = Vector3.Reflect(Vector3.Normalize(rayIn.Direction), rec.Normal);

            scattererd  = new Ray(rec.P, reflected + _fuzz * rnd.RandomInUnitSphere(), rayIn.Time);
            attenuation = _albedo;
            return(Vector3.Dot(scattererd.Direction, rec.Normal) > 0);
        }
        public object SelectData()
        {
            var thisNumber = ImSoRandom.Next(0, Set.Count());

            return(Set.ElementAt(thisNumber));
        }
Ejemplo n.º 26
0
 public abstract bool Scatter(Ray rayIn, HitRecord hitRecord, out Vector3 attenuation, out Ray scattererd, ImSoRandom rnd);