- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定这样的路径:
<Path Stretch="Fill" Stroke="#FFD69436" Data="M 0,20 L 22.3,20 L 34,0 L 44.7,20 L 68,20 L 55.8,40 L 68,60 L 44.7,60 L 34,80 L 22.3,60 L 0,60 L 11.16,40 L 0,20 Z">
<Path.Fill>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFFFFF" Offset="0" />
<GradientStop Color="Orange" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Path.Fill>
</Path>
如何获取该图形任意角度边缘的点?假设我想要该图形的边缘与穿过该图形中心的线之间的交点,与 OX 轴成 30 度角?
谢谢。
最佳答案
有很多不同的方法可以做到这一点,具体取决于您需要的性能和准确性以及您愿意编写多少几何代码。
<强>1。使用 FillContains
一种方法是构造连续的线几何图形并使用 path.Data.FillContains(geometry) 来确定它们是否与图形相交。大致如下:
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,然后手动迭代几何图形中的图形和线段:
var geo = PathGeometry.CreateFromGeometry(path.Data); foreach(geo.Figures 中的 var 图) foreach(图中的var段.Segments) if(线段是线段) ... else if(线段是ArcSegment) ... else if(线段是BezierSegment) ... else if(线段是 QuadraticBezierSegment) ... else if(线段是PolyLineSegment) ... else if(线段是PolyBezierSegment) ... else if(线段是 PolyQuadraticBezierSegment) ...
这种方法需要相当多的几何分析代码,但速度非常快,因为 WPF 不需要构造展平的几何图形或进行重复的相交。当我需要代码运行得非常快时,这是我通常使用的技术。
关于 GetWidenedPathGeometry 的说明
到目前为止我所说的一切都会为您提供几何路径数据和相交线之间的交集:它不考虑线宽、端盖等。要考虑这些,您将需要使用GetWidenedPathGeometry
如下:
var widenedData = path.Data.GetWidenedPathGeometry(new Pen { ... });
Pen 参数是通过 path.Stroke、path.StrokeWidth 等设置的。
完成此操作后,使用上述技术之一将“path.Data”替换为“widenedData”。
关于c# - silverlight/wpf 中的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2595359/
我创建了一个函数来计算两条线段的交点。 不幸的是,如果其中一个段是垂直的,下面的代码将不起作用 public static Point intersection(Segment s1, Seg
我有一个由中心 (x,y,z)、半径和方向矢量定义的圆,该矢量指定圆的朝向。我需要测试这样的圆是否与轴对齐的边界框相交。为了澄清,通过相交,我的意思是如果圆圈描述的区域内的任何点在边界框内,那么就构成
虽然我认为这是一个基本问题,但我似乎无法找到如何在 R 中计算: 2 个或多个正态分布(拟合在直方图上)的交点(我需要 x 值),例如具有以下参数: d=data.frame(mod=c(1,2),m
我看过几个关于找到两个 OBB 之间的交点的线程。我仍然不明白如何找到最小穿透轴。我需要找到最小穿透轴,我相信它在 David Eberly 的论文中也被称为最后一个分离轴,以确定我应该使用表格的哪一
我想使用 intersection()通过 key 或filter()在 Spark 。 但是我真的不知道怎么用intersection()按键。 所以我尝试使用filter() ,但它不起作用。 示
我正在画一个circle在canvas上。我想知道,给定 circle 的半径和原点 x/y ,在什么时候 circle与 canvas 相交(如果有的话)边缘。 这肯定是一个几何问题,但这部分似乎太
我正在尝试计算任意数量平面的最顶部交点,但没有任何乐趣!我正在使用 actionscript,但只需要找到一个我可以实现的算法。 问题: 考虑 3 个垂直轴。 用户为每个三角形/平面输入 3 个点,使
我是一名优秀的程序员,十分优秀!