public DrawObject ExtendDrawObject(DrawObjectExtendInfo extendInfo) { if (extendInfo.ExtendedDrawObject is TDrawObject tDrawObject) { return(ExtendDrawObject(tDrawObject, extendInfo)); } return(null); }
protected abstract DrawObject ExtendDrawObject(TDrawObject drawObject, DrawObjectExtendInfo objectExtendInfo);
protected override DrawObject ExtendDrawObject(Line line, DrawObjectExtendInfo objectExtendInfo) { var intersectPoints = objectExtendInfo.IntersectPositions; var extendArea = objectExtendInfo.ExtendArea; if (line == null) { return(null); } if (intersectPoints == null) { return(null); } if (extendArea == null) { return(null); } var startIsInArea = objectExtendInfo.ExtendArea.Contains(line.Line2D.Start); var endIsInArea = objectExtendInfo.ExtendArea.Contains(line.Line2D.End); if (startIsInArea == endIsInArea) { return(null); } (Vector2D rayStartPos, Vector2D rayEndPos) = startIsInArea ? (line.Line2D.End, line.Line2D.Start) : (line.Line2D.Start, line.Line2D.End); var rayVector = rayEndPos - rayStartPos; //检查是否在射线的延长线上; intersectPoints = intersectPoints.Where(p => { if (p.IsInLine(line.Line2D)) { return(false); } var rayStartToPointVector = p - rayStartPos; var cross = rayStartToPointVector.Cross(rayVector); var dot = rayStartToPointVector.Dot(rayVector); if (cross.AreEqual(0) && dot.AreEqual(rayStartToPointVector.Modulus() * rayVector.Modulus())) { return(true); } return(false); }).OrderBy(p => p.Distance(line.Line2D.Start)).ToArray(); if (intersectPoints.Length != 1) { return(null); } //寻找距离射线起点最近的点; Vector2D closestPoint = null; double shortestDis = 0; foreach (var point in intersectPoints) { var thisDis = point.Distance(rayStartPos); if (closestPoint == null) { closestPoint = point; shortestDis = thisDis; continue; } if (thisDis < shortestDis) { closestPoint = point; shortestDis = thisDis; } } return(new Line(new Line2D(closestPoint, rayStartPos))); }