- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发这个 iso 网格游戏(更准确地说:二轴投影,在典型的菱形布局中进行索引)并且想要实现圆形画笔来在我的 map 上绘制瓷砖,就像在任何图像编辑软件中一样。我从 Midpoint Circle Algorithm 开始,但立即注意到,结果看起来不像我想要的 1 到 7 之间的小画笔大小。
我宁愿有这样的东西:
忽略,第一个圆圈没有填充,那当然很容易。是否有适合在 iso 网格上生成形状的算法?我可能甚至不想要圆形,而是交替使用四边形和十字形/x 形。
这是从维基百科获取的第一个图像样本的代码:
static List GetBrushCircleCoords(int x0, int y0, int radius)
{
List coords = new List();
int x = radius;
int y = 0;
int err = 0;
while (x >= y)
{
coords.Add(new IntVector2(x0 + x, y0 + y));
coords.Add(new IntVector2(x0 + y, y0 + x));
coords.Add(new IntVector2(x0 - y, y0 + x));
coords.Add(new IntVector2(x0 - x, y0 + y));
coords.Add(new IntVector2(x0 - x, y0 - y));
coords.Add(new IntVector2(x0 - y, y0 - x));
coords.Add(new IntVector2(x0 + y, y0 - x));
coords.Add(new IntVector2(x0 + x, y0 - y));
y += 1;
err += 1 + 2 * y;
if (2 * (err - x) + 1 > 0)
{
x -= 1;
err += 1 - 2 * x;
}
}
return coords;
}
1 Câu trả lời
您没有指定等距网格的布局。我假设是钻石,因为在那里更容易实现。然而,在整数算术中很难实现半径的半单元分辨率。对于全细胞分辨率半径圆盘填充,使用简单的 2 个嵌套 vì
和内圆测试。结果如下所示:
只需忽略我的等距编辑器的树和图 block 列表叠加层。这里是 C++ 的源代码:
void isometric::brush_circle(int x0,int y0,int z0,int r)
{
r--; if (r<0) return;
int tp=16; // filling tile
int x,y,rx,ry,rxx,ryy,rr=(r+1)*(r+1)-(r>>1);
if ((z0>=0)&&(z0<>
for (rx=-r,x=x0+rx,rxx=rx*rx;rx<=r;rx++,x++,rxx=rx*rx)
for (ry=-r,y=y0+ry,ryy=ry*ry;ry<=r;ry++,y++,ryy=ry*ry)
if (rxx+ryy<>
if ((x>=0)&&(x=0)&&(y<>
map[z0][y][x]=tp;
_redraw=true;
}
它使用圆盘/圆方程:
(x-x0)^2+(y-y0)^2<=r^2
通过一些整数舍入调整以获得更好看的结果。代码基于我的这个等距引擎:
应用边缘平滑后的结果是这样的:
如果你想实现半单元半径分辨率,你有更多的选择,例如:
diameter
作为调用操作数而不是 bán kính
所以你只需相应地更新等式(避免舍入)我选择#2,所以使用:
(x-x0)^2+(y-y0)^2<=(d^2)/4
我得到的最接近的是这个(d=2
的特殊情况):
void isometric::brush_circle(int x0,int y0,int z0,int d)
{
if ((z0<0)||(z0>=gzs)) return;
int tp=16; // filling tile
int x,y,rx,ry,rxx,ryy,r=(d>>1)+1,rr=((d*d)-(d>>1))>>2;
if (d==2)
{
x=x0; y=y0; if ((x>=0)&&(x=0)&&(y
x++; if ((x>=0)&&(x=0)&&(y
y++; if ((x>=0)&&(x=0)&&(y
x--; if ((x>=0)&&(x=0)&&(y
}
khác
for (rx=-r,x=x0+rx,rxx=rx*rx;rx<=r;rx++,x++,rxx=rx*rx)
for (ry=-r,y=y0+ry,ryy=ry*ry;ry<=r;ry++,y++,ryy=ry*ry)
if (rxx+ryy<=rr)
if ((x>=0)&&(x=0)&&(y<>
map[z0][y][x]=tp;
_redraw=true;
}
看起来它需要添加至少一种特殊情况和/或稍微调整 rr
常量。
[Edit1] 午饭后还有更多的教学......
从整数的角度来看,更好的等式是:
4*( (x-x0)^2 + (y-y0)^2 ) <= (d^2)
void isometric::brush_circle(int x0,int y0,int z0,int d)
{
if ((z0<0)||(z0>=gzs)) return;
int tp=16; // filling tile
int x,y,rx,ry,rxx,ryy,r=(d>>1)+1,dd=(d*d)+d;
if (d==2)
{
x=x0; y=y0; if ((x>=0)&&(x=0)&&(y
x++; if ((x>=0)&&(x=0)&&(y
y++; if ((x>=0)&&(x=0)&&(y
x--; if ((x>=0)&&(x=0)&&(y
}
khác
for (rx=-r,x=x0+rx,rxx=rx*rx;rx<=r;rx++,x++,rxx=rx*rx)
for (ry=-r,y=y0+ry,ryy=ry*ry;ry<=r;ry++,y++,ryy=ry*ry)
if ((rxx+ryy)<<2<>
if ((x>=0)&&(x=0)&&(y<>
map[z0][y][x]=tp;
_redraw=true;
}
关于c# - 对于 iso 网格上的瓦片 map 画笔,算法比中点圆更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38362751/
我需要你的帮助!我在它们之间放置了随机数量的 div。 Item description Item description Item description Item
我有两个 NSDates,时间格式为“h:mm a”(即 6:00 AM 和 8:00 PM)。 我试图找出这两个时间之间的中点是什么时间。 对于上面的示例,早上 6:00 和晚上 8:00 之间的中
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
我正在寻找一种有效的算法来检查一个点是否在 3D 中的另一个点附近。 sqrt((x2-x1)^2 + (y2-y1)^2 + (z2-z1)^2) < radius 这似乎并不太快,实际上我不需要这
我可以让 pandas cut/qcut 函数返回 bin 端点或 bin 中点而不是一串 bin 标签吗? 目前 pd.cut(pd.Series(np.arange(11)), bins = 5)
Tôi là một lập trình viên xuất sắc, rất giỏi!