Example #1
0
        private Coordinate3D getPlaneSegmentIntersection(Coordinate3D v1, Coordinate3D v2, double z)
        {
            double f = (z - v1.Z) / (v2.Z - v1.Z);

            return new Coordinate3D(
                f * (v2.X - v1.X) + v1.X, 
                f * (v2.Y - v1.Y) + v1.Y, 
                z);
        }
Example #2
0
        private double getZ(ICoordinate p, Coordinate3D v1, Coordinate3D v2, Coordinate3D v3)
        {
            double a = (v2.Y - v1.Y) * (v3.Z - v1.Z) - (v3.Y - v1.Y) * (v2.Z - v1.Z);
            double b = (v2.X - v1.X) * (v3.Z - v1.Z) - (v3.X - v1.X) * (v2.Z - v1.Z);
            double c = (v2.X - v1.X) * (v3.Y - v1.Y) - (v3.X - v1.X) * (v2.Y - v1.Y);
            double z = v1.Z + ((p.Y - v1.Y) * b - (p.X - v1.X) * a) / c;

            return z;
        }
        /// <summary>
        /// Calculates luminosity of the triangle.
        /// </summary>
        /// <param name="triangle">A triangle</param>
        /// <param name="lightX">An X component of the light vector</param>
        /// <param name="lightY">A Y component of the light vector</param>
        /// <param name="lightZ">A Z component of the light vector</param>
        /// <param name="zFactor">A value at which to multiply z-values for luminosity calculation</param>
        /// <returns>A luminosity value ranging from zero to one</returns>
        public static double GetLuminosity(Triangle triangle, double lightX, double lightY, double lightZ, double zFactor)
        {
            if (!(triangle.Cell1.DataPoint is Coordinate3D) ||
                !(triangle.Cell2.DataPoint is Coordinate3D) ||
                !(triangle.Cell3.DataPoint is Coordinate3D))
                throw new ArgumentException("All coordinates should be instances of the MapAround.Geometry.Coordinate3D", "triangle");

            Coordinate3D p1 = (Coordinate3D)triangle.Cell1.DataPoint.Clone();
            Coordinate3D p2 = (Coordinate3D)triangle.Cell2.DataPoint.Clone();
            Coordinate3D p3 = (Coordinate3D)triangle.Cell3.DataPoint.Clone();

            p1.Z = p1.Z * zFactor;
            p2.Z = p2.Z * zFactor;
            p3.Z = p3.Z * zFactor;

            if (PlanimetryAlgorithms.OrientationIndex(p1, p2, p3) < 0)
            {
                Coordinate3D temp = p1;
                p1 = p2;
                p2 = temp;
            }

            double A = p1.Y * (p2.Z - p3.Z) + p2.Y * (p3.Z - p1.Z) + p3.Y * (p1.Z - p2.Z);
            double B = p1.Z * (p2.X - p3.X) + p2.Z * (p3.X - p1.X) + p3.Z * (p1.X - p2.X);
            double C = p1.X * (p2.Y - p3.Y) + p2.X * (p3.Y - p1.Y) + p3.X * (p1.Y - p2.Y);
            double D = -(p1.X * (p2.Y * p3.Z - p3.Y * p2.Z) + p2.X * (p3.Y * p1.Z - p1.Y * p3.Z) + p3.X * (p1.Y * p2.Z - p2.Y * p1.Z));

            double sinePhi =
                Math.Abs(A * lightX + B * lightY + C * lightZ) /
                Math.Sqrt(A * A + B * B + C * C) /
                Math.Sqrt(lightX * lightX + lightY * lightY + lightZ * lightZ);

            Coordinate3D lightPoint = new Coordinate3D();
            lightPoint.X = p1.X + lightX;
            lightPoint.Y = p1.Y + lightY;
            lightPoint.Z = p1.Z + lightZ;

            if (A * lightPoint.X + B * lightPoint.Y + C * lightPoint.Z + D > 0)
                return 0;

            return sinePhi;
        }