public void line_rotate_rad(float rang, Point3D p1, Point3D p2) { p2 = new Point3D(p2.x - p1.x, p2.y - p1.y, p2.z - p1.z); p2 = Point3D.norm(p2); float[,] mt = get_matrix(); apply_matrix(rotate_around_line(mt, p1, p2, rang)); }
// вычисление локальной модели освещения public Point3D shade(Point3D hit_point, Point3D normal, Point3D color_obj, float diffuse_coef) { Point3D dir = point_light - hit_point; dir = Point3D.norm(dir); // направление луча из источника света в точку удара Point3D diff = diffuse_coef * color_light * Math.Max(Point3D.scalar(normal, dir), 0); return(new Point3D(diff.x * color_obj.x, diff.y * color_obj.y, diff.z * color_obj.z)); }
public static Point3D norm(Side S) { if (S.points.Count() < 3) { return(new Point3D(0, 0, 0)); } Point3D U = S.get_point(1) - S.get_point(0); Point3D V = S.get_point(S.points.Count - 1) - S.get_point(0); Point3D normal = U * V; return(Point3D.norm(normal)); }
public override bool figure_intersection(Ray r, out float t, out Point3D normal) { t = 0; normal = null; if (ray_sphere_intersection(r, points[0], radius, out t) && (t > EPS)) { normal = (r.start + r.direction * t) - points[0]; normal = Point3D.norm(normal); return(true); } return(false); }
public override bool figure_intersection(Ray r, out float t, out Point3D normal) { t = 0; normal = null; if (ray_sphere_intersection(r, points[0], radius, out t) && (t > EPS)) { normal = (r.start + r.direction * t) - points[0]; normal = Point3D.norm(normal); figure_material.clr = new Point3D(drawing_pen.Color.R / 255f, drawing_pen.Color.G / 255f, drawing_pen.Color.B / 255f); return(true); } return(false); }
public void run_rayTrace() { get_pixels(); for (int i = 0; i < w; ++i) { for (int j = 0; j < h; ++j) { Ray r = new Ray(focus, pixels[i, j]); r.start = new Point3D(pixels[i, j]); Point3D clr = RayTrace(r, 10, 1); if (clr.x > 1.0f || clr.y > 1.0f || clr.z > 1.0f) { clr = Point3D.norm(clr); } color_pixels[i, j] = Color.FromArgb((int)(255 * clr.x), (int)(255 * clr.y), (int)(255 * clr.z)); } } }
// преломление public Ray refract(Point3D hit_point, Point3D normal, float eta) { Ray res_ray = new Ray(); float sclr = Point3D.scalar(normal, direction); float k = 1 - eta * eta * (1 - sclr * sclr); if (k >= 0) { float cos_theta = (float)Math.Sqrt(k); res_ray.start = new Point3D(hit_point); res_ray.direction = Point3D.norm(eta * direction - (cos_theta + eta * sclr) * normal); return(res_ray); } else { return(null); } }
public Ray(Point3D st, Point3D end) { start = new Point3D(st); direction = Point3D.norm(end - st); }