我有一个2d网格和一个常数半径的圆。我知道圆的中心,半径,向量(或角度,两者都有)定义扇区,扇区在开始和结束之间始终具有常数度数,但是开始和结束可以改变它们的圈子上的位置。
在每次更新时,我需要将此扇区内的切片数据加载到常量大小的1d数组中,以保持相对位置信息
(如果对于当前的开始,结束和半径为sqrt(2)* 1.0(平铺诊断),则左侧(CCW)有40%的区块,中间为100%,右侧为40%(CW) ),我需要在我的数组中使用NULL,INFO,NULL,如果80%在左边100%在中间,0%在右边,那么INFO,INFO,NULL)。
如果它的中心点在里面,瓷砖就算在内部,我想。我不需要%准确度。
现在我最好找到位于扇区内的瓷砖,每次更新都会迭代一个方形区域内的所有瓷砖(2 *半径+ 1),并使用{{3}中的此函数检查它们的中心点复制/粘贴(将函数更改为bool并添加了var类型):
bool areClockwise(Vec2d v1, Vec2d v2) {
return -v1.x*v2.y + v1.y*v2.x > 0;
}
bool isWithinRadius(Vec2d v, float radiusSquared) {
return v.x*v.x + v.y*v.y <= radiusSquared;
}
bool isInsideSector(Vec2d point, Vec2d center, Vec2d sectorStart, Vec2d sectorEnd, float radiusSquared) {
Vec2d relPoint = point - center;
return !areClockwise(sectorStart, relPoint) &&
areClockwise(sectorEnd, relPoint) &&
isWithinRadius(relPoint, radiusSquared);
}
我还不确定,如何使用info,null,info等计算我的数据数组的大小。或者如何填充它就像在半径为1的圆内,然后在1和2之间的第一个去瓦,然后介于2和3之间等,以及如何计算每个“行”中的最大瓦片数。好吧,我认为它不需要按此顺序排列,但每次都必须是相同的顺序。
答案 0 :(得分:1)
要查找该部门内的所有图块,请按以下步骤操作: Get every pixel of an arc/sector suggested Vittorio Romeo hungarian method。或坚持你的方法。因为在我看来,更加困难的部分是“以这种方式保持相对位置信息”要求你提到。这样做的性能成本可能会超过所有受影响像素的天真枚举的成本。
对于相对位置分配,我从弧的标准位置开始,比如原点的中心和正 x 轴的第一条射线。在这种情况下,您可以放置尽可能多的平铺位置,因为您最大限度地期望覆盖。或者更确切地说:你想要在你的1d数组中有多少条目。您不必将它们放置在类似网格的方式中,但可以使用同心圆上的点或任何您想要的点。现在,您将坐标变换应用于实际的平铺位置,将它们转换为标准位置,并将它们与标准位置进行比较。如果您愿意,最终会得到一个距离矩阵,或者可能是平方距离。
现在您应用{{3}}来找到标准位置和实际位置之间的最佳(即最小(平方)距离之和)匹配。这告诉您将瓷砖放在1d数组中的位置。由于匈牙利方法是O(n³),因此O(n)的瓦片枚举成本和O(n²)的成对距离计算的成本相比较小,至少是渐近的。让我们希望覆盖的瓷砖数量n不会太大,这种方法是不可行的。