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); }
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; }