Esempio n. 1
0
    private void read_triangles()
    {
        int index = 0;

        while (text_read_letter() == 't')
        {
            triangle_class triangle_temporary;
            triangle_temporary = new triangle_class();

            for (int i = 0; i < 3; i++)
            {
                index = (int)text_read_number();

                for (int n = 0; n < 3; n++)
                {
                    triangle_temporary.vertex[i][n] = vertex[index - 1][n];
                }
            }

            triangle_temporary.material_index = (int)text_read_number();
            triangle_temporary.initialize();

            triangle.Add(triangle_temporary);
        }
    }
Esempio n. 2
0
    public double[] get_next_direction_triangle(double[] input_vector, triangle_class input_triangle, ref double incidence_ior, ref double[] multiplier)
    {
        double[] output_vector = new double[3];
        double[] random_vector = new double[3];
        double   a, b, c, angle, radius;

        angle  = 2 * System.Math.PI * random.NextDouble();
        radius = System.Math.Sqrt(random.NextDouble());

        a = System.Math.Sin(angle) * radius;
        b = System.Math.Cos(angle) * radius;
        c = System.Math.Sqrt(1.0 - (a * a + b * b));

        if (vector_class.vector_dot_product(input_triangle.normal, input_vector) > 0)
        {
            input_triangle.normal = vector_class.vector_negative(input_triangle.normal);
        }

        random_vector = vector_class.vector_add(vector_class.vector_add(vector_class.vector_scale(input_triangle.v, b),
                                                                        vector_class.vector_scale(input_triangle.u, a)),
                                                vector_class.vector_scale(input_triangle.normal, c));

        if (random.NextDouble() * (reflectivity_mean + refractivity_mean) < reflectivity_mean)  //reflect
        {
            output_vector = vector_class.vector_average(random_vector,
                                                        get_reflection(input_vector, input_triangle.normal),
                                                        reflect_glossiness);

            for (int n = 0; n < 3; n++)
            {
                multiplier[n] *= color[n].reflectivity;
            }
        }
        else //refract
        {
            output_vector = vector_class.vector_average(vector_class.vector_negative(random_vector),
                                                        get_refraction(input_vector, input_triangle.normal, incidence_ior, ref multiplier),
                                                        refract_glossiness);

            for (int n = 0; n < 3; n++)
            {
                multiplier[n] *= color[n].refractivity;
            }

            incidence_ior = refractive_index;
        }

        return(output_vector);
    }
Esempio n. 3
0
    public static double intersection_ray_triangle(double[] position, double[] vector, triangle_class triangle)
    {
        double output_t;

        double[] vector_t, vector_p, vector_q;
        double   determinant, determinant_inverse;
        double   t, u, v;
        double   tolerance;

        output_t            = double.PositiveInfinity;
        vector_t            = new double[3];
        vector_p            = new double[3];
        vector_q            = new double[3];
        determinant         = 0;
        determinant_inverse = 0;
        t         = 0;
        u         = 0;
        v         = 0;
        tolerance = 0.000000001;

        vector_p = vector_class.vector_cross_product(vector, triangle.edge_2);

        determinant = vector_class.vector_dot_product(triangle.edge_1, vector_p);
        if (determinant > -tolerance &&
            determinant < tolerance)
        {
            return(output_t);
        }

        determinant_inverse = 1.0 / determinant;

        vector_t = vector_class.vector_from_2_positions(position, triangle.vertex[0]);

        u = vector_class.vector_dot_product(vector_t, vector_p) * determinant_inverse;
        if (u < 0 ||
            u > 1)
        {
            return(output_t);
        }

        vector_q = vector_class.vector_cross_product(vector_t, triangle.edge_1);

        v = vector_class.vector_dot_product(vector, vector_q) * determinant_inverse;
        if (v < 0 ||
            v + u > 1)
        {
            return(output_t);
        }

        t = vector_class.vector_dot_product(triangle.edge_2, vector_q) * determinant_inverse;

        output_t = t;

        return(output_t);
    }