예제 #1
0
 public Sphere(P3 p, float r, P3 vn = null, P3 ve = null)
 {
     this.center = p;
     this.r = r;
     this.vn = vn == null ? new P3(0, 0, 1) : vn;
     this.ve = ve == null ? new P3(-1, 0, 0) : ve;
 }
예제 #2
0
 public static RColor getLight(P3 p, P3 normal)
 {
     RColor c = new RColor(0, 0, 0);
     foreach (Light l in lights) {
         c = c.Add(l.illumination(p, normal));
     }
     return c;
 }
예제 #3
0
        public static RColor getLight(P3 p, P3 normal)
        {
            RColor c = new RColor(0, 0, 0);

            foreach (Light l in lights)
            {
                c = c.Add(l.illumination(p, normal));
            }
            return(c);
        }
예제 #4
0
 public RColor Color(P3 p, Ray r, SceneObject s)
 {
     P3 N = s.Geo.Normal(p);
     float c1 = -N.Dot(r.direction);
     P3 R1 = r.direction.Add(N.Scale(2).Scale(c1));
     float d;
     Ray r1 = new Ray(p, R1);
     SceneObject so = Form1.shootRay(r1, out d);
     if (so == null) {
         return new RColor(0, 0, 0);
     } else return so.ColorAt(r1.Travel(d), r1);
 }
예제 #5
0
 public RColor illumination(P3 point, P3 normal)
 {
     float inten = this.p.Dot(normal);
     RColor color = new RColor(0, 0, 0);
     if (inten > 0) {
         color = c.Scale(inten);
         float d;
         SceneObject s = Form1.shootRay(new Ray(point, this.p), out d);
         if (s != null) {
             return new RColor(0, 0, 0);
         }
     }
     return color;
 }
예제 #6
0
        public RColor illumination(P3 point, P3 normal)
        {
            float  inten = this.p.Dot(normal);
            RColor color = new RColor(0, 0, 0);

            if (inten > 0)
            {
                color = c.Scale(inten);
                float       d;
                SceneObject s = Form1.shootRay(new Ray(point, this.p), out d);
                if (s != null)
                {
                    return(new RColor(0, 0, 0));
                }
            }
            return(color);
        }
예제 #7
0
        public RColor Color(P3 p, Ray r, SceneObject s)
        {
            P3          N  = s.Geo.Normal(p);
            float       c1 = -N.Dot(r.direction);
            P3          R1 = r.direction.Add(N.Scale(2).Scale(c1));
            float       d;
            Ray         r1 = new Ray(p, R1);
            SceneObject so = Form1.shootRay(r1, out d);

            if (so == null)
            {
                return(new RColor(0, 0, 0));
            }
            else
            {
                return(so.ColorAt(r1.Travel(d), r1));
            }
        }
예제 #8
0
        public P2 ToP2(P3 p)
        {
            P3 vp = p.Sub(center).Normalize();
            //Console.WriteLine(-vn.Dot(vp));
            float vndot = -vn.Dot(vp);

            if (vndot < -1)
            {
                vndot = -1;
            }
            else if (vndot > 1)
            {
                vndot = 1;
            }
            float phi = (float)Math.Acos(vndot);
            float v   = phi / (float)Math.PI;
            float u;
            float vpdotsin = vp.Dot(ve) / (float)Math.Sin(phi);

            if (vpdotsin < -1)
            {
                vpdotsin = -1;
            }
            else if (vpdotsin > 1)
            {
                vpdotsin = 1;
            }
            //theta = ( arccos( dot_product( Vp, Ve ) / sin( phi )) ) / ( 2 * PI)
            float theta = ((float)Math.Acos(vpdotsin) / (2 * (float)Math.PI));

            if (vp.Dot(vn.Cross(ve)) > 0)
            {
                u = theta;
            }
            else
            {
                u = 1 - theta;
            }
            //Console.WriteLine(u + " " + v);
            return(new P2(u, v));
        }
예제 #9
0
 public P2 ToP2(P3 p)
 {
     P3 vp = p.Sub(center).Normalize();
     //Console.WriteLine(-vn.Dot(vp));
     float vndot = -vn.Dot(vp);
     if (vndot < -1) vndot = -1;
     else if (vndot > 1) vndot = 1;
     float phi = (float)Math.Acos(vndot);
     float v = phi / (float)Math.PI;
     float u;
     float vpdotsin = vp.Dot(ve) / (float)Math.Sin(phi);
     if (vpdotsin < -1) vpdotsin = -1;
     else if (vpdotsin > 1) vpdotsin = 1;
     //theta = ( arccos( dot_product( Vp, Ve ) / sin( phi )) ) / ( 2 * PI)
     float theta = ((float)Math.Acos(vpdotsin) / (2 * (float)Math.PI));
     if (vp.Dot(vn.Cross(ve)) > 0) {
         u = theta;
     } else {
         u = 1 - theta;
     }
     //Console.WriteLine(u + " " + v);
     return new P2(u, v);
 }
예제 #10
0
 public RColor illumination(P3 p, P3 normal)
 {
     return(l);
 }
예제 #11
0
 public P3 Normal(P3 p)
 {
     return n;
 }
예제 #12
0
파일: Ray.cs 프로젝트: Jiig/school-examples
 public Ray(P3 start, P3 direction)
 {
     this.start     = start;
     this.direction = direction.Normalize();
     color          = new RColor(0, 0, 0);
 }
예제 #13
0
 public P3 Normal(P3 p)
 {
     return(n);
 }
예제 #14
0
 public RColor ColorAt(P3 p, Ray r)
 {
     return(Skin.Color(p, r, this));
 }
예제 #15
0
 public P3 Normal(P3 p, P3 x)
 {
     return x.Sub(p).Scale((1 / (x.Magnitude() - p.Magnitude())));
 }
예제 #16
0
 public RColor Color(P3 p, Ray r, SceneObject s) {
     RColor light = Form1.getLight(p, s.Geo.Normal(p));
     return light.Mul(s.Texture.Color(s.Geo.ToP2(p)));
 }
예제 #17
0
파일: P3.cs 프로젝트: Jiig/school-examples
 public float Theta(P3 p)
 {
     return((float)Math.Acos(Dot(p) / p.Magnitude() * this.Magnitude()));
 }
예제 #18
0
파일: P3.cs 프로젝트: Jiig/school-examples
 public float Dot(P3 p)
 {
     return((this.x * p.x) + (this.y * p.y) + (this.z * p.z));
 }
예제 #19
0
파일: P3.cs 프로젝트: Jiig/school-examples
 public P3 Add(P3 p)
 {
     return(new P3(this.x + p.x, this.y + p.y, this.z + p.z));
 }
예제 #20
0
 public P3 Normal(P3 x)
 {
     return(x.Sub(this.center).Scale(1 / r));
 }
예제 #21
0
 public RColor Color(P3 p, Ray r, SceneObject s)
 {
     RColor light = Form1.getLight(p, s.Geo.Normal(p));
     return light.Mul(s.Texture.Color(s.Geo.ToP2(p)));
 }
예제 #22
0
 public P3 Normal(P3 x)
 {
     return x.Sub(this.center).Scale(1 / r);
 }
예제 #23
0
 public RColor illumination(P3 p, P3 normal)
 {
     return l;
 }
예제 #24
0
 public P2 ToP2(P3 p)
 {
     return(new P2(0, 0));
 }
예제 #25
0
파일: P3.cs 프로젝트: Jiig/school-examples
 public P3 Sub(P3 p)
 {
     return(new P3(this.x - p.x, this.y - p.y, this.z - p.z));
 }
예제 #26
0
 public DirectionalLight(RColor c, P3 p)
 {
     this.c = c;
     this.p = p;
 }
예제 #27
0
파일: P3.cs 프로젝트: Jiig/school-examples
 public P3 Cross(P3 p)
 {
     return(new P3((this.y * p.z) - (this.z * p.y), (this.z * p.x) - (this.x * p.z), (this.x * p.y) - (this.y * p.x)));
 }
예제 #28
0
 public DirectionalLight(RColor c, float theta, float phi)
 {
     this.c = c;
     this.p = P3.fromSphere(theta, phi);
 }
예제 #29
0
 public RColor ColorAt(P3 p, Ray r)
 {
     return Skin.Color(p, r, this);
 }
예제 #30
0
 public P3 Normal(P3 p, P3 x)
 {
     return(x.Sub(p).Scale((1 / (x.Magnitude() - p.Magnitude()))));
 }
예제 #31
0
 public void nonThreadedTrace()
 {
     float distance;
     P3 d;
     Ray r;
     SceneObject s;
     for (int i = 0; i < width; i++) {
         for (int j = 0; j < height; j++) {
             d = new P3(i / Form1.width * 2 - 1, 0, j / Form1.height * 2 - 1);
             r = new Ray(Form1.cameraPos, d.Sub(Form1.cameraPos));
             s = Form1.shootRay(r, out distance);
             if (s != null) {
                 try {
                     Form1.cs[i, j] = s.ColorAt(r.Travel(distance), r);
                 } catch (Exception e) { //Set pixel to black if there are any errors
                     Form1.cs[i, j] = new RColor(0, 0, 0);
                 }
             }
         }
     }
 }
예제 #32
0
파일: P3.cs 프로젝트: Jiig/school-examples
 public P3 Cross(P3 p)
 {
     return new P3((this.y * p.z) - (this.z * p.y), (this.z * p.x) - (this.x * p.z), (this.x * p.y) - (this.y * p.x));
 }
예제 #33
0
 public P2 ToP2(P3 p)
 {
     return new P2(0, 0);
 }
예제 #34
0
파일: P3.cs 프로젝트: Jiig/school-examples
 public P3 Sub(P3 p)
 {
     return new P3(this.x - p.x, this.y - p.y, this.z - p.z);
 }
예제 #35
0
파일: Ray.cs 프로젝트: Jiig/school-examples
 public Ray(P3 start, P3 direction)
 {
     this.start = start;
     this.direction = direction.Normalize();
     color = new RColor(0, 0, 0);
 }
예제 #36
0
 public Plane(P3 p, P3 n)
 {
     this.p = p;
     this.n = n;
     d      = -p.Dot(n);
 }
예제 #37
0
파일: P3.cs 프로젝트: Jiig/school-examples
 public P3 Add(P3 p)
 {
     return new P3(this.x + p.x, this.y + p.y, this.z + p.z);
 }
예제 #38
0
파일: Ray.cs 프로젝트: Jiig/school-examples
 public P3 Travel(float distance)
 {
     this.start = this.start.Add(direction.Scale(distance));
     return start;
 }
예제 #39
0
파일: P3.cs 프로젝트: Jiig/school-examples
 public float Dot(P3 p)
 {
     return ((this.x * p.x) + (this.y * p.y) + (this.z * p.z));
 }
예제 #40
0
 public DirectionalLight(RColor c, P3 p)
 {
     this.c = c;
     this.p = p;
 }
예제 #41
0
파일: P3.cs 프로젝트: Jiig/school-examples
 public float Theta(P3 p)
 {
     return (float)Math.Acos(Dot(p) / p.Magnitude() * this.Magnitude());
 }
예제 #42
0
 public DirectionalLight(RColor c, float theta, float phi)
 {
     this.c = c;
     this.p = P3.fromSphere(theta, phi);
 }
예제 #43
0
파일: Ray.cs 프로젝트: Jiig/school-examples
 public P3 Travel(float distance)
 {
     this.start = this.start.Add(direction.Scale(distance));
     return(start);
 }
예제 #44
0
 public Plane(P3 p, P3 n)
 {
     this.p = p;
     this.n = n;
     d = -p.Dot(n);
 }