我试图通过将它包装在循环中来压缩它:
if (pos.X + pixelRadius < 0) {
pos.X = bounds.Width - pixelRadius;
} else if (pos.X + pixelRadius > bounds.Width) {
pos.X = pixelRadius;
}
if (pos.Y + pixelRadius < 0) {
pos.Y = bounds.Heigh - pixelRadius;
} else if (pos.Y + pixelRadius > bounds.Height) {
pos.Y = pixelRadius;
}
我的第一直觉是做这样的事情:
foreach (float coord in new float[] { pos.X, pos.Y }) {
float upperBound = (coord == pos.X ? bounds.Width : bounds.Height);
if (coord + pixelRadius < 0) {
coord = upperBound - pixelRadius;
} else if (coord + pixelRadius > upperBound) {
coord = pixelRadius;
}
}
但当然我收到错误消息:
Cannot assign to 'coord' because it is a 'foreach iteration variable'
有什么方法可以将这段代码包装在一个循环中?或者也许这不值得付出努力,而且留下第一种形式更具可读性。
对于那些好奇的人:是的,这是实现环绕。
答案 0 :(得分:6)
老实说,我认为第一个版本更具可读性。第二个版本在循环中批量填充然后...测试以查看它是哪个循环元素?闻起来像我for...case
反模式。
答案 1 :(得分:4)
我认为这是在尝试模数学,所以这就是你想要的
pos.X %= bounds.Width;
pos.Y %= bounds.Height;
它没有给出与上面代码完全相同的行为,但是如果你只是调整边界并在做模数之前对该点施加偏差就可以了。
或者如果您需要偏见
pos.X = ((pos.X - pixelRadius) % bounds.Width) + pixelRadius;
pos.Y = ((pos.Y - pixelRadius) % bounds.Height) + pixelRadius;
模数学是一种更好的环绕式方法。它更清晰,没有分支。
答案 2 :(得分:3)
即使你可以改变coord,因为它是一个浮点数,你实际上只是修改副本而不是pos中的值。最好的办法是创建一种新方法。
答案 3 :(得分:0)
我会把它留在原来的形式。当您处于上述循环中时,coord
是pos.X
或pos.Y
变量的 COPY ,因为它们是Value Types。这意味着即使你可以更新coord ......你也不会更新pos.X
或pos.Y
,而是更新它们本地的循环。
答案 4 :(得分:0)
循环是一个坏主意。
你现在拥有的代码看起来有些错误,但它的结构比一些不自然的循环使用更好。
如果我明白你要做什么,我想你应该有这样的事情
(我专注于坐标X.在坐标Y的情况下,它类似)
pos.X += pixelRadius;
if(pos.X < 0) {
pos.X += bounds.Width;
} else if (pos.X > bounds.Width) {
pos.X -= bounds.Width;
}
如果| pixelRadius |,这将有效&LT; bounds.With和我假设数字是浮点数,如带循环的例子所示。
模数运算符使事情变得更容易,尤其是| pixelRadius | &GT; bounds.With,但在负数的情况下要小心。您必须确切地知道您的语言实现将与他们做什么
使用模数运算符我会这样做
pos.X = (pos.X + pixelRadius) % bounds.Width;
if(pos.X < 0) pos.X += bounds.Width;