我想确定一个(或多个)圆占据的网格单元的比例。因此,例如,下面的左上方网格单元将具有较小的值(~0.1),并且中心网格单元格(7,7)将具有值1,因为它完全被圆圈占据。
目前我正在使用canvas.context2d.getImageData,通过对单元格内容进行采样来确定存在的内容。这可行,但方式太慢。这是这个方法:
Microsoft.Azure.WebJobs.WebJobsShutdownWatcher().Token
getImageData调用是问题的根源 - 它太慢了。
鉴于我有一个圆圈阵列,每个圆圈都有x,y和半径,我该如何计算?如果可能的话,我希望每个值都是小数(0到1之间)。
网格是静态的,但圆圈可能在其中移动。我很乐意对这个值进行粗略估计,它不需要100%准确。
答案 0 :(得分:2)
您可以使用蒙特卡罗方法来获得近似解决方案。它是一种基于概率的方法,您可以在其中生成随机样本以估计某些值。在这种情况下,给定圆心的坐标,圆半径和网格单元的边界,您可以通过生成 K 随机样本来估计圆占据的网格单元的比例(全部包含在网格单元格内部,并验证同样在圆圈内的样本的比例。您生成的样本越多,结果就越准确。
请记住:要验证给定样本 P 是否在中心 C 和半径 R 的圆圈内,您所要做的就是检查等式 sqrt((Px-Cx)^ 2 +(Py-Cy)^ 2)< = R 是否为真
答案 1 :(得分:1)
您只需要调用getImageData
一次,即可获得整个画布。
获得图像数据后,您可以访问偏移4 * (celly * width + cellx)
处的字节以获取RGB(A)数据。
这应该大大加快,因为它只调用一次图形硬件而不是数千次。