如何通过给定的点集合确定形状是半圆?

时间:2018-10-05 11:46:08

标签: c# wpf algorithm math image-processing

这是多边形的点集合

<Polygon Points="24,188,24,183,25,176,26,172,29,166,33,160,38,155,44,151,50,148,54,147,61,146,67,146,74,147,78,148,84,151,90,155,95,160,99,166,102,172,103,176,104,183,104,188" Stroke="Black" StrokeThickness="1" />
<Polygon Points="568,263,520,263,520,256,521,253,523,249,526,245,531,241,536,239,540,238,548,238,552,239,557,241,562,245,565,249,567,253,568,256,568,263" Stroke="Black" StrokeThickness="1" />

这给了我下面的形状。

enter image description here

enter image description here

我需要检查形状是否为半圆形? 请任何人都可以指导我确定。是半圆形吗?

我只会在绘制图形之前先收集图片,然后确定形状。它可以是任何矩形(矩形,直线形,半圆形,曲线形等)。我能够从点集合中找到矩形,三角形和直线形。 就像矩形一样,我正在检查其相对的面应该相等并且内角应该为90度。

  public bool IsRectangle()
        {                
            var pointColl = polygon.PointCollection;
            bool isRightAngle = false;

            if (polygon == null || pointColl == null)
            {
                return false;
            }
            if (pointColl.Count == 5)
            {
                double length1 = (pointColl[0] - pointColl[1]).LengthSquared;
                double width1 = (pointColl[1] - pointColl[2]).LengthSquared;
                double length2 = (pointColl[2] - pointColl[3]).LengthSquared;
                double width2 = (pointColl[3] - pointColl[0]).LengthSquared;

                if ((length1 == length2 && length1 != 0) && (width1 == width2 && width1 != 0))
                    isRightAngle = CalculateAngle(polygon);
            }
            else
            {
                isRightAngle = false;
            }

我可以为半圆形或圆形检测编写类似的内容吗? 预先感谢。

2 个答案:

答案 0 :(得分:4)

什么将形状定义为半圆?

从字面上看,您的形状都不是半圆的,因为它们都是由直线段组成。

一个形状需要多少个点才能视为一个半圆(三角形是否足够圆)。在不再将形状视为半圆形之前,圆周上每个点的误差容限(半径的一定百分比)是多少?

为您提供一些伪代码...

  1. 给出n个点P1,P2..Pn的集合
  2. 对于每对点,计算它们之间的距离。
  3. 两个点之间的最大距离(Pa和Pb)被视为半圆的直径(平坦边)。
  4. 半圆的中心点是Pa和Pb之间的中点。
  5. Pa和Pb到中心点的距离为半径R。
  6. 对于集合中的每个剩余点,计算到中心点的距离。 如果所有点的距离都在(1 +/- e)* R之内,则该形状为半圆形。 e的值留给您定义。

请注意,无论半圆的方向如何,此方法均适用。如果您需要更具体的信息,请检查从Pa到Pb的直线的斜率。

答案 1 :(得分:1)

算法:

1)从多边形中获取3个点。

2)使用this method(或其他任何方法)估算他们的圈子。

3)检查给定poligon中的其他点是否放置在估计圆上。

相关问题