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

标签 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;
            }

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

最佳答案

什么将形状定义为半圆?

在这个词的真正意义上,你的形状都不是半圆,因为它们都是由直线段组成的。

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

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

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

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

关于c# - 如何通过给定的点集合确定形状是半圆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52664955/

相关文章:

algorithm - 具有聚类特性的图像量化算法

java - 避免与 Java Collection 接口(interface)的语义耦合

c# - 将 MenuItems 命令绑定(bind)到 UserControls DataContext

c# - 绑定(bind)到列表的计数,其中 Typeof

c# - 如何使用 MVVM 在 WPF 中实现 NetworkAvailabilityChanged?

WPF组合框文本颜色不改变

c# - WPF 自定义控件 - 绑定(bind)到代码隐藏中定义的命令

c++ - 对表格进行排序 C++

c# - IEnumerable<T> 与 T[]

c# - 可以在后台线程中运行 GC.Collect 吗?