- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 PathGeometry(多边形),它由一个 PathFigure 上的 LineSegments 组成,我想确保它是凸面的。我有一个方法使用 CrossProduct 来确定几何是否是凸的,我假设我可以返回一个点列表,当它为假时,它会成为凹面,并删除这些点以填充多边形,但它不能正常工作。
这是我得到的代码:
public static bool IsConvexPolygon(this IList<Point> polygon, out List<Point> concavePoints)
{
int n = polygon.Count;
List<double> result = new List<double>();
concavePoints = new List<Point>();
for (int i = 0; i < n; i++)
{
result.Add(polygon[i].CrossProduct(polygon[i.RotateNext(n)]));
if (result.Last() < 0.0)
{
concavePoints.Add(polygon[i.RotateNext(n)]);
}
}
return (result.All(d => d >= 0.0));
}
public static double CrossProduct(this Point p1, Point p2)
{
return (p1.X * p2.Y) - (p1.Y * p2.X);
}
public static int RotateNext(this int index, int count)
{
return (index + 1) % count;
}
public static PointCollection ExtractPoints(this Geometry geometry)
{
PointCollection pc = new PointCollection();
if (geometry is LineGeometry)
{
var lg = (LineGeometry)geometry;
pc.Add(lg.StartPoint);
pc.Add(lg.EndPoint);
return pc;
}
else if (geometry is PathGeometry)
{
var pg = (PathGeometry)geometry;
if (pg.Figures.Count > 0)
{
List<Point> points;
if ((pg.Figures[0].Segments.Count > 0) && (pg.Figures[0].Segments[0] is PolyLineSegment))
points = ((PolyLineSegment)pg.Figures[0].Segments[0]).Points.ToList();
else
points = pg.Figures[0].Segments.Select(seg => (seg as LineSegment).Point).ToList();
pc.Add(pg.Figures[0].StartPoint);
foreach (Point p in points)
pc.Add(p);
return pc;
}
}
else if (geometry is RectangleGeometry)
{
var rg = (RectangleGeometry)geometry;
var rect = rg.Rect;
pc.Add(rect.TopLeft);
pc.Add(rect.TopRight);
pc.Add(rect.BottomRight);
pc.Add(rect.BottomLeft);
return pc;
}
return pc;
}
public static Geometry CreateGeometryFromPoints(this List<Point> pts)
{
if (pts.Count < 2)
return null;
PathFigure pFig = new PathFigure() { StartPoint = pts[0] };
for (int i = 1; i < pts.Count; i++)
{
pFig.Segments.Add(new LineSegment(pts[i], true));
}
pFig.IsClosed = true;
PathGeometry pg = new PathGeometry(new List<PathFigure>() { pFig });
return pg;
}
public static Path CreatePolygonFromGeometry(this Geometry geo, Brush fillBrush)
{
Path path = new Path() { Stroke = Brushes.Black, StrokeThickness = 1, Fill = fillBrush };
path.Data = geo;
return path;
}
这是我进行检查和更正多边形的地方:
List<Point> outstuff;
if (geo1.ExtractPoints().IsConvexPolygon(out outstuff) == false)
{
// Got to fill it in if it's concave
var newpts = geo1.ExtractPoints().Except(outstuff).ToList();
var z = newpts.CreateGeometryFromPoints().CreatePolygonFromGeometry(Brushes.Purple);
z.MouseRightButtonDown += delegate { canvas.Children.Remove(z); };
canvas.Children.Add(z);
}
最终我希望能够像这样将我的凹面几何变成凸面:
最佳答案
我会计算 convex hull (也:NTS)并删除生成的凸包多边形内部的所有顶点(使用 point-in-polygon 测试)。
关于c# - 将凹面 PathGeometry 填充为凸面(找到凹面顶点并移除它们)的简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3208515/
我想要由 LineSegment 组成的 PathGeometry。 所以,我使用了第一个代码,但它出错了。 PathGeometry temp = (PathGeometry)Geometry.Pa
我有一个包含单条折线的 PathGeometry,并以固定的间隔向该线添加一个新点(以绘制波形)。使用 Perforator 工具时,我可以看到每次向直线添加一个点时,WPF 都会将整个 PathGe
我有一个相当简单的 PathGeometry: M567764.539,5956314.087L567815.077,5956179.775L567821.625,5956182.314L567773
假设我有 PathGeometry ,由 组成线路 , 像这样 (矩形 == 面板,例如 Grid ): 我想将它们填充到面板的底部,如下所示: 我看到的快速但不是很好的解决方案是在底部创建带有 2
我有一个 PathGeometry 定义了一些这样的路径: original path http://devblog.ailon.org/devblog/_stuff/wpfpathgeoquesti
我在一个简单的 PathGeometry 对象上遇到了一个奇怪的错误,我似乎无法弄清楚。如果有人能向我解释为什么这不起作用,我将不胜感激。 这是一个工作路径的示例,它绘制了一个小三角形: 这是一个似
您好,有以下 XAML 我希望为 PathGemorty 设置动画以缓慢显示自身(超过 2 秒左右)。基本上我想要的效果是自动在屏幕上画一条线,特别是上面代码中指定的
在 WPF UI 中,我有通过贝塞尔曲线路径连接的节点,如下所示: It might be... atomic http://nv3wrg.blu.livefilestore.com/y1pIGBd3
我在 Windows Phone 8.1 应用程序中使用 Windows Runtime 运行以下 XAML: 它给了我以下形状: 我的问题是如何使用 C# 生成这样的 path
有没有一种简单的方法可以在 WPF (C#) 中转换 PathGeometry? 有了一个 PathGeometry (System.Windows.Media) 和一个 Vector (System
只是想知道在 Swift 中是否有与 C# 中的 PathGeometry、PathFigure 等价的东西。 正在研究用给定点的集合绘制路径线的东西。 谢谢, 纳什 最佳答案 您可以使用 map 框
我正在尝试使用数据绑定(bind)在 WPF 中制作动画。我正在使用 MatrixAnimationUsingPath 让形状跟随路径。路径在我的 viewModel 中表示为数组;观点[]。我如何在
我有两个巨大的(>100000 项)PathGeometry 集合,我需要使用 PathGeometry.Combine 进行比较,如下所示: List firstList; List secondL
我有一个相当大的 PathGeometry(超过 100,000 个点,并且被描边但未填充)要显示给用户,但任何时候只有一小部分路径可见。澄清一下,路径本身不是预先确定的,而是由数据创建的。 问题:我
我有一个方法占用了 25% 的 cpu 时间。我每秒调用此方法约 27,000 次。 (是的,有很多电话,因为它经常更新)。我想知道是否有人知道一种更快的方法来检测两个多边形是否重叠。基本上,我必须检
我想通过动态 PathGeometry 和它的 PathFigure 来剪辑网格。 在 WPF 应用程序中,UIElement.Clip 具有一些属性,例如 CombinedGeometry、Path
我有一个 PathGeometry(多边形),它由一个 PathFigure 上的 LineSegments 组成,我想确保它是凸面的。我有一个方法使用 CrossProduct 来确定几何是否是凸的
如果我有一条闭合路径,我可以使用 Geometry.GetArea() 来近似计算形状的面积。这很棒,为我节省了很多时间。但是周围有什么东西可以帮助我找到未闭合路径的长度吗? 目前我能想到的最好方法是
我是一名优秀的程序员,十分优秀!