我打算写一个在特定图像中制作钻石的程序 我写了这段代码
Img=zeros(256,256);
for x=1:256
for y=1:256
if(y-x==128)||(y-x==-128)||(y+x==128)
Img(x,y)=1;
end
end
end
imshow(Img);
我可以画三面钻石。 我如何画出第四面?
答案 0 :(得分:3)
您缺少的条件是y+x==384
。因此,请将<{1}}行替换为
if
如果你的坐标以if (y-x==128)||(y-x==-128)||(y+x==128)||(y+x==384)
为中心,那么条件会更加对称,比如0
:
-128:128
如@kkuilla所述,这可以很容易地进行矢量化。请参阅@rayryeng's answer。
答案 1 :(得分:3)
Luis Mendo在你的循环的if
语句中指定最后一个条件以绘制最后一行。如果您想要for
循环解决方案,那么他的解决方案就是您正在寻找的。 p>
但是,如果你想要更多矢量化的东西,更有效的方法是使用meshgrid
定义一个坐标网格,然后简单地应用一系列logical
操作来获得你的钻石。换句话说:
[x,y] = meshgrid(1:256, 1:256);
Img = abs(x-y) == 128 | x+y == 384 | x+y == 128;
imshow(Img);
我们得到:
通常,对于正方形的给定尺寸图像,您可以通过以下方式将其调整为任何尺寸的图像:
N = 256; %// Change here - width/height of your image
[x,y] = meshgrid(1:N, 1:N);
Img = abs(x-y) == floor(N/2) | x+y == floor(3*N/2) | x+y == floor(N/2);
imshow(Img);
我已经放置了floor
操作,以防您想要指定不能被2整除的图像大小。但是,钻石的对称性可能看起来不正确,但代码无论如何都会起作用。