using LensSimulatorCore.Shapes; using static System.Double; namespace LensSimulatorCore.Optical; /// /// Contains the function to find intersection of two Lines. /// class FlatSurface : Surface { public override void UpdateSurfacePositions() { SideSign = IsFront ? -1 : 1; _face = new Line(0, SideSign * Parent.Depth / 2); } //This line is defined as x = by+c. It will need converting to y = bx+c. private Line _face; /// /// This function takes a PointVector and checks if there a collision between itself and a Line. /// /// A PointVector where (1,0) is 0 rad. /// public override Point FindIntersection(PointVector pointVector) { //Converts point vector to a line. Line line = pointVector.ToLine(); //This is where the conversion takes place to make it y = bx + c. Line surfaceLine = new Line(1 / _face.B, (1 / _face.B) * _face.C); double x, y, t, u; //If C is infinity it means the line is vertical and can be solved by inserting x into the equation. if (IsInfinity(surfaceLine.C)) { y = (line.B * _face.C) + line.C; x = _face.C; } else //If not it means it is angled and therefore needs solving by substitution. { t = line.B + surfaceLine.B; u = line.C + surfaceLine.C; x = t / u; y = (line.B * x) + line.C; } return new Point(x, y); } /// /// Generates a PolyLine, which can be merged with another to make a full element shape. /// public override void GeneratePolyLine() { PolyLine.Add(new Point(-SideSign * Parent.Depth / 2, SideSign * -Parent.Diameter / 2)); PolyLine.Add(new Point(-SideSign * Parent.Depth / 2, SideSign * Parent.Diameter / 2)); } protected FlatSurface(Element parent) : base(parent) { } }