javascript算法:检查x/y点以获得组件是否为圆
我有一个这样的矩阵,所以我希望你能得到圆的轮廓:javascript算法:检查x/y点以获得组件是否为圆,javascript,algorithm,math,matrix,coordinates,Javascript,Algorithm,Math,Matrix,Coordinates,我有一个这样的矩阵,所以我希望你能得到圆的轮廓: var coordinates = [ [13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1], [11,2],[21,2], [9,3],[23,3], [8,4],[24,4], [8,5],[24,5], [7,6],[25,6], [6,7],[26,7], [6,8],[26,8], [6,9],[26,9], [5,10],[26,10],
var coordinates = [
[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],
[11,2],[21,2],
[9,3],[23,3],
[8,4],[24,4],
[8,5],[24,5],
[7,6],[25,6],
[6,7],[26,7],
[6,8],[26,8],
[6,9],[26,9],
[5,10],[26,10],
[5,11],[26,11],
[5,12],[26,12],
[5,13],[26,13],
[5,14],[26,14],
[6,15],[26,15],
[6,16],[26,16],
[6,17],[25,17],
[7,18],[24,18],
[8,19],[24,19],
[8,20],[23,20],
[9,21],[22,21],
[11,22],[12,22],[13,22],[14,22],[15,22],[16,22],[17,22],[18,22],[19,22],[20,22]]
编辑1:轮廓如何?轮廓不包含空格(因此每个y值至少有2个x值)
编辑2:什么是圆?搜索更多或更少的“精确圆”,如下面的示例所示!(每个点的半径几乎相同)
我还有一个这样的数组,包括轮廓的所有位置:
var coordinates = [
[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[20,1],
[11,2],[21,2],
[9,3],[23,3],
[8,4],[24,4],
[8,5],[24,5],
[7,6],[25,6],
[6,7],[26,7],
[6,8],[26,8],
[6,9],[26,9],
[5,10],[26,10],
[5,11],[26,11],
[5,12],[26,12],
[5,13],[26,13],
[5,14],[26,14],
[6,15],[26,15],
[6,16],[26,16],
[6,17],[25,17],
[7,18],[24,18],
[8,19],[24,19],
[8,20],[23,20],
[9,21],[22,21],
[11,22],[12,22],[13,22],[14,22],[15,22],[16,22],[17,22],[18,22],[19,22],[20,22]]
检查坐标是否匹配为圆的好方法是什么
我的第一个想法是使用这样的代码,但我相信有一种更有效的方法:
[13,1,[15,1,[17,1,[18,1,[19,1,[19,1,[19,1,[19,1,[19,1,[19,1,[11,1,[11,2,[21,2,[21,2,[9,2,[9,3[9[9,1[13[13[[13[[13[13[13[13[13,1][[[[[13[13,1][[13[13[13,1][13,1][[[13[13[13[13,1][[11[11,1][11,1[11,1][[11,1[11,1[11,1[11,1[11,1[11,1[11,1[11,1[11,1[11,1[11,1[11,1[11,1[11,1[11,1[11,11,1[11,11,11,11,11,11,11[26,16]、[6,17]、[25,17]、[7,18]、[24,18]、[8,19]、[24,19]、[8,20]、[23,20],[9,21],[22,21],[11,22],[12,22],[13,22],[14,22],[15,22],[16,22],[17,22],[18,22],[19,22],[20,22]]
变量no_圆=[[13,1],[14,1],[25,4]]
Array.prototype.is_circle=函数(){
最小值={
“x”:无限,
“y”:无穷大
};
var max={
“x”:0,
“y”:0
};
变量中心={
“x”:0,
“y”:0
};
变异半径;
this.forEach(函数(a){
a[0]=a[0]
a[1]=a[1]
如果(a[0]>max.x)max.x=a[0];
如果(a[0]is_circle
测试
我建议你用一些额外的圆度裕度进行两阶段测试,称为
e
。遍历整组点,记住x\u min,y\u max
和y\u max
。然后检查x的增量和y的增量之间的差值是否在误差裕度范围内,即abs((x\u max-x\u min)-(y\u max-y\u min))计算机不能处理“或多或少的精确”就像人类一样。除非你想钻研机器学习解决方案,否则你需要从算法上定义这意味着什么。从最左边/右边向上/向下取中间的中心,然后你就完成了。为什么?如果组件是圆或其他什么东西,我就不会得到信息,我只知道中心点。例如,它是c也应该是正方形,@JonasW@JonasW。你的评论没有多大意义,而且过于简单化,如果我理解正确,你可以尝试在轮廓上拟合一个圆(参见示例),并使用拟合余数作为衡量你的形状“圆形”的标准。匿名否决票?写简短的评论是否有害?