【问题标题】:Getting points of polygons from a canvas从画布中获取多边形的点
【发布时间】:2015-08-07 19:10:02
【问题描述】:

在 C# 中为 Pixelsense 实现 WPF 应用程序

我很难找到在屏幕上放置多边形以检测多边形重叠的特定点(这是下一阶段)。总的来说,我的应用程序中可以有 7 个多边形,下面是我尝试获取它们的点的代码。

我认为代码理想的做法是启动一个循环,创建一个多边形(形状 1),然后启动第二个循环,创建另一个多边形(形状 2)并获取两个形状点并检查重叠。然后第二个循环将继续检查另一个形状(形状 3)是否与形状 1 重叠,方法是获取其点等等......所以第一个多边形将与其他 6 个多边形检查重叠,因此是嵌套循环。

但是,当前发生的情况是该方法为第一个多边形选取的任何点,它们也会被复制到第二个多边形。因此,它为两个单独的多边形打印出一组重复点并永远循环。

我已经被困了一段时间了,请帮助我:)

public void DefiningPolygonArea()
    {
        foreach (var polygonsCollection1 in this.PlayingCanvas.Children)
        {
            Polygon polygon1 = polygonsCollection1 as Polygon;
            if (polygon1 != null)
            {
                foreach (var polygonsCollection2 in this.PlayingCanvas.Children)
                {
                    Polygon polygon2 = polygonsCollection2 as Polygon;
                    if (polygon1 != polygon2 && polygon2 != null)
                    {
                        HelperMethods.PointCollectionsOverlap_Fast(getPoints(polygon1), getPoints(polygon2));
                    }
                }
            }
        }
    }

private List<Point> getPoints(Polygon poly)
    {
        if (poly.Points.Count == 4)
        {
            var transform = poly.TransformToVisual(this.PlayingCanvas);

            Point point1 = transform.Transform(poly.Points[0]);
            Point point2 = transform.Transform(poly.Points[1]);
            Point point3 = transform.Transform(poly.Points[2]);
            Point point4 = transform.Transform(poly.Points[3]);

            area1.Add(point1);
            area1.Add(point2);
            area1.Add(point3);
            area1.Add(point4);
            Console.WriteLine("polygon with 4 points consists of: " + area1[0] + " , " + area1[1] + " , " + area1[2] + " , " + area1[3]);

        }
        else if (poly.Points.Count == 3)
        {
            var transform = poly.TransformToVisual(this.PlayingCanvas);

            Point point1 = transform.Transform(poly.Points[0]);
            Point point2 = transform.Transform(poly.Points[1]);
            Point point3 = transform.Transform(poly.Points[2]);

            area1.Add(point1);
            area1.Add(point2);
            area1.Add(point3);
            Console.WriteLine("polygon with 3 points consists of: " + area1[0] + " , " + area1[1] + " , " + area1[2]);
        }

        return area1;
    }

输出:

多边形与4分组成:713.345368087522,713.83644226973,550.13652222242424242424.044482999935686,463.0633.067512500125007796,641257796,64125796,6441.64178882788882788888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888882转

三点多边形包括: 713.345368087522,713.83644226973 , 550.136522242161,724.044829935686 , 463.067512500796,641.78273862321

【问题讨论】:

  • 你的循环是错误的。您在第一个循环中要求孩子并获得第一个项目。然后你在第二个循环中再次要求相同的结果。当然它会呈现你所拥有的:)我可以尝试给你一个可能的解决方案,但如果你真的给了我们一个可重现的最小样本。 (也许在 github 上转储一个有问题的示例项目并将其链接到此处,以便我们为您提供适当的修复)

标签: c#


【解决方案1】:

根据我的评论,您的循环需要像这样进行排除:

foreach (var polygon1 in this.PlayingCanvas.Children.OfType<Polygon>())
    foreach (var polygon2 in this.PlayingCanvas.Children.OfType<Polygon>().Where(x => x != polygon1))
            HelperMethods.PointCollectionsOverlap_Fast(getPoints(polygon1), getPoints(polygon2));

写于StackEdit

【讨论】:

  • 感谢您的回复,我现在明白我是如何没有在循环本身进行过滤的。现在它得到了不同的点,但一段时间后这些值出现了问题(因为它目前一直在循环)。如果对象在同一点并且没有移动到画布上的新位置,我该如何阻止它循环?
  • 4 点多边形包括: 382.04,636.94 , 501.04,615.31 , 525.06,747.46 , 406.07,769.09 3 点多边形包括: 502.44,852.86 , 579.60,756,845.2 ,7 6 多边形3 点包括: 502.44,852.86 , 579.80,756.23 , 665.79,845.27 多边形 4 点包括: 11049.04,11311.11 , 11167.98,11289.19 , 11192.32,114213.28 , 13.203s714.
  • 抱歉,我不知道,因为我可以从问题中收集到的信息有限。这些数字对我来说意义不大。也许您应该使用最小的示例项目创建一个新问题,该示例项目重新创建您的问题并将其发布在 github 上,以便其他人可以通过单击问题中的链接下载并查看问题。祝你好运!
  • 我在 pixelense 表上使用带有标签(有形)的物理对象,因此如果没有图片中的它们,运行示例项目并不会做太多事情:(感谢您抽出宝贵时间 :)跨度>
猜你喜欢
  • 2021-07-03
  • 2013-05-26
  • 2020-11-10
  • 2012-11-28
  • 2014-10-06
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
相关资源
最近更新 更多