1

我正在尝试为凸包研究绘制二维六边形晶格点。但我只能得到矩形格子。这是代码:

在二维平面上映射六边形晶格

u = 0:1:100;
if mod(u,2) == 0;
  v = 0:2*sqrt(3):50*sqrt(3);
else 
  v = 1:2*sqrt(3):50*sqrt(3)    
end

定义应该构造凸包的区域。将所有数据点发送到 convhull 函数。

[u,v] = meshgrid(u,v);
idx = sqrt((u-25).^2+(v-25).^2) <= 25 ;
u = u(idx);
v = v(idx);
c = convhull(u,v);

绘制图像

plot(u(c),v(c),'r-',u,v,'b.');
hold off
4

1 回答 1

1

if语句在 MATLAB 中不是这样工作的。该程序将始终只遵循一条路径,而不是您似乎认为的每个向量元素的不同路径。

相反,使用逻辑索引:

u = 0:1:100;
index = mod(u,2) == 0;
v(index) = 0:2*sqrt(3):50*sqrt(3); 
v(~index) = 1:2*sqrt(3):50*sqrt(3);

(如果这里的向量大小不匹配,未测试可能会失败)。

但是,这仍然不会为您提供六边形网格,因为该meshgrid函数根据定义生成一个矩形网格。

六边形网格是两个相互交织的矩形网格。生成它的一种方法可能如下:

u = 0:1:100;
v = 0:2*sqrt(3):50*sqrt(3); 
[v,u] = meshgrid(v,u);
v(2:2:end,:) = v(2:2:end,:)+sqrt(3);

% and then the rest of your code:
idx = sqrt((u-25).^2+(v-25).^2) <= 25;
u = u(idx);
v = v(idx);
c = convhull(u,v);
plot(u(c),v(c),'r-',u,v,'b.');
axis equal

代码输出

于 2018-02-15T03:17:33.253 回答