/// <summary> /// This method calculates the localizer line of the sourceFrame that can be drawn on the destinationFrame. /// You should call the method CanDrawLocalizer prior to check if localizer calculation is valid on the two frames. /// /// This method returns the line of common pixels where the two images intersect. /// If the two images intersect, then it returns <code>true</code> and the out parameters are filled with values. Otherwise the method returns <code>false</code> /// </summary> /// <param name="sourceFrame">The geometry of the frame, that is viewed by the user</param> /// <param name="destinationFrame">The geometry of the scout frame, where the localizer line should be drawn on</param> /// <param name="startPoint">If the frames intersect, then this contains the start point of the localizer line in terms of pixels on destinationFrame</param> /// <param name="endPoint">If the frames intersect, then this contains the end point of the localizer lin in terms of pixels on destinationFrame</param> /// <returns></returns> public static bool CalcualteIntersectionLocalizer(FrameGeometry sourceFrame, FrameGeometry destinationFrame, out Point2 startPoint, out Point2 endPoint) { double t; // coeficient of the plane-equation double nA, nB, nC, nD, nP; var lstProj = new List <Point3D>(); // initialize startPoint = Point2.Origin; endPoint = Point2.Origin; // validation if (destinationFrame.DirectionNormal.IsZero) { return(false); } nP = destinationFrame.DirectionNormal * destinationFrame.PointTopLeft; nA = destinationFrame.DirectionNormal * sourceFrame.PointTopLeft; nB = destinationFrame.DirectionNormal * sourceFrame.PointTopRight; nC = destinationFrame.DirectionNormal * sourceFrame.PointBottomRight; nD = destinationFrame.DirectionNormal * sourceFrame.PointBottomLeft; // segment AB if (Math.Abs(nB - nA) > Constants.Epsilon) { t = (nP - nA) / (nB - nA); if (t > 0 && t <= 1) { lstProj.Add(sourceFrame.PointTopLeft + t * (sourceFrame.PointTopRight - sourceFrame.PointTopLeft)); } } // segment BC if (Math.Abs(nC - nB) > Constants.Epsilon) { t = (nP - nB) / (nC - nB); if (t > 0 && t <= 1) { lstProj.Add(sourceFrame.PointTopRight + t * (sourceFrame.PointBottomRight - sourceFrame.PointTopRight)); } } // segment CD if (Math.Abs(nD - nC) > Constants.Epsilon) { t = (nP - nC) / (nD - nC); if (t > 0 && t <= 1) { lstProj.Add(sourceFrame.PointBottomRight + t * (sourceFrame.PointBottomLeft - sourceFrame.PointBottomRight)); } } // segment DA if (Math.Abs(nA - nD) > Constants.Epsilon) { t = (nP - nD) / (nA - nD); if (t > 0 && t <= 1) { lstProj.Add(sourceFrame.PointBottomLeft + t * (sourceFrame.PointTopLeft - sourceFrame.PointBottomLeft)); } } // the destinationplane should have been crossed exactly two times if (lstProj.Count != 2) { return(false); } // now back from 3D patient space to 2D pixel space startPoint = destinationFrame.TransformPatientPointToImage(lstProj[0]).Round(); endPoint = destinationFrame.TransformPatientPointToImage(lstProj[1]).Round(); return(true); }