这是多边形的点集合

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

这给了我下面的形状。
c# - 如何通过给定的点集合确定形状是半圆?-LMLPHP
c# - 如何通过给定的点集合确定形状是半圆?-LMLPHP
我需要检查一下这个形状是不是半圆?
任何人都可以引导我去决定。是半圆吗?
我只会在画之前收集,只有我应该确定形状。它可以是任意的(矩形、直线、半圆、曲线等),我可以从点集合中找到矩形、三角形和直线形状。
就像一个矩形,我检查它的相对面应该相等,内角应该是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;
            }

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

最佳答案

什么定义形状为半圆?
在这个词的真正意义上,你的形状都不是半圆,因为它们都是由直线段组成的。
一个形状需要被视为一个半圆的点有多少(三角形足够圆)在形状不再被视为半圆形之前,圆周上每个点(半径的某个百分比)的误差范围是多少?
一些伪代码给你…
给出n个点p1,p2的集合。PN公司
对于每对点,计算它们之间的距离。
这两个点之间的最大距离(PA和PB)被认为是直径(平侧)的半圆。
半圆的中心点是Pa和Pb之间的中点。
从Pa&Pb到中心点的距离是半径R。
对于集合中的每个剩余点,计算到中心点的距离。
如果所有点的距离都在(1+/-e)*r范围内,则该形状为半圆。e的值留给您定义。
请注意,无论半圆的方向如何,此方法都有效。如果你需要更具体的东西,那么还要检查从pa到pb的直线斜率。

10-08 13:15