c# - 如何通过给定的点集合确定形状是半圆?
问题描述
这是多边形的点集合
<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;
}
我可以为半圆形或圆形检测写这样的东西吗?提前致谢。
解决方案
什么将形状定义为半圆?
从真正意义上讲,您的形状都不是半圆形,因为它们都是由直线段组成的。
一个形状需要多少个点才能被视为一个半圆(三角形是否足够圆)。在不再将形状视为半圆形之前,圆周上每个点(半径的某个百分比)的误差范围是多少。
给你一些伪代码......
- 给定 n 个点 P1, P2 .. Pn 的集合
- 对于每对点,计算它们之间的距离。
- 它们之间距离最大的两个点(Pa 和 Pb)被认为是半圆的直径(平边)。
- 半圆的中心点是 Pa 和 Pb 的中点。
- Pa & Pb 到中心点的距离为半径 R。
- 对于集合中的每个剩余点,计算到中心点的距离。如果该距离对于所有点都在 (1 +/- e) * R 范围内,则该形状为半圆形。e 的值留给您定义。
请注意,无论半圆的方向如何,此方法都适用。如果你需要更具体的东西,那么还要检查从 Pa 到 Pb 的线的斜率。
推荐阅读
- python - 如何创建一个不断更新的全局变量?
- php - PHP MySql 时间计算
- javascript - RxJS:禁止在效果和史诗中使用不安全的 catch 并请求嵌套
- c# - Blazor Swagger:无法加载 API 定义。获取错误:未定义 /swagger/v1/swagger.json
- javascript - 通过从 Firebase 存储访问来更新用户的 photoURL
- api - 存储 API 密钥
- javascript - 如何将孩子添加到具有唯一名称的 firebase 数据列表中?
- python - 为什么在机器学习模型中所有真阳性都被归类为真阴性?
- css - 如何更改外部 React Native 模块的样式
- javascript - 如何获取在 `env` 对象中定义的 Nuxt.js 环境变量?