首页 > 解决方案 > 如何通过给定的点集合确定形状是半圆?

问题描述

这是多边形的点集合

<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" />

这给了我下面的形状。

在此处输入图像描述

在此处输入图像描述

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

我只会在绘制之前收集,我应该确定形状。它可以是任何形状(矩形、直线、半圆、曲线等)。我能够从点集合中找到矩形、三角形和线条形状。就像一个矩形,我正在检查它的相对面应该相等,内角应该是 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;
            }

我可以为半圆形或圆形检测写这样的东西吗?提前致谢。

标签: c#wpfalgorithmmathimage-processing

解决方案


什么将形状定义为半圆?

从真正意义上讲,您的形状都不是半圆形,因为它们都是由直线段组成的。

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

给你一些伪代码......

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

请注意,无论半圆的方向如何,此方法都适用。如果你需要更具体的东西,那么还要检查从 Pa 到 Pb 的线的斜率。


推荐阅读