有很多不同的方法可以做到這一點,這取決於您需要的性能和準確性以及您願意編寫多少幾何代碼。
1.使用FillContains
的一種方法是構造連續線的幾何形狀和使用path.Data.FillContains(幾何形狀),以確定它們是否相交的附圖。沿着這些路線的東西:
Transform rotation = new RotateTransform { Angle = 30 };
double max = path.Width + path.Height;
double current = 0;
for(double delta = max/2; delta > 0.25; delta = delta/2)
{
var line = new LineGeometry(
new Point(centerX + current, centerY),
new Point(centerX + max, centerY),
rotation);
if(path.Data.FillContains(line))
current += delta;
}
var intersectPoint = rotation.Transform(new Point(current, 0));
2.使用GetFlattenedPathGeometry
另一種方法是使用GetFlattenedPathGeometry:
var flattened = path.Data.GetFlattenedPathGeometry();
var segment = pg.Figures[0].Segments[0] as PolyLineSegment;
Point[] points = segment.Points;
for(int i=0; i<points.Count-1; i++)
{
... check for intersection with the line from points[i] to points[i+1] ...
}
這可能是更快,因爲幾何只處理一次,但需要你編寫自己的直線交點算法(這非常簡單)。
3.使用PathGeometry.CreateFromGeometry
所有的最有效的方式是把已知幾何轉換成的PathGeometry,然後通過在幾何圖和段手動迭代:
變種地理= PathGeometry.CreateFromGeometry(path.Data); 的foreach(在geo.Figures VAR圖) 的foreach(在figure.Segments VAR段) 如果(段是線段) ... 否則,如果(段ArcSegment) ... 否則,如果(段BezierSegment ) ... 否則,如果(段QuadraticBezierSegment) ... 否則,如果(段PolyLineSegment) ... 否則,如果(段PolyBezierSegment) ... 否則,如果(段PolyQuadraticBezierSegment) ...
這種方法需要相當多的幾何分析代碼,但速度非常快,因爲WPF不必構造扁平幾何體或重複交叉。當我需要我的代碼運行速度非常快時,這是我通常使用的技術。在GetWidenedPathGeometry
注意
一切到目前爲止,我說給你交叉口幾何路徑的數據和相貫線之間:它沒有考慮到線寬,端蓋等。要考慮這些因素,以及你將需要使用GetWidenedPathGeometry
如下:
var widenedData = path.Data.GetWidenedPathGeometry(new Pen { ... });
在筆參數從path.Stroke,path.StrokeWidth設置等
這樣做了以後,用一個上述技術將「path.Data」替換爲「widenedData」。
感謝...我會這樣。 – 2010-04-09 09:10:00