基於Matlab的六邊形細胞自動機

2021-10-06 17:22:26 字數 3629 閱讀 9288

目前大多數細胞自動機都是矩形的,這個是六邊形的。

生存規則在倒數13 - 倒數18行。

下面是兩種不同規則的動畫。

% 列數設定

n_row = round(n_col/0.433*1.5/1.2);

cell = zeros(n_row,n_col, 14,2);

% cell - [細胞狀態 細胞中點座標 六個邊點座標 六個鄰近圖形序號]

% 細胞狀態(1)- [當前狀態 下一步狀態]; 0- 死亡 ,1- 存活。

% 中方點座標(2)- [x, y]

% 六個邊點座標(3~8)- [x,y]。

% 六個鄰近圖形行、列號(9~14)- [行號,列號]。

% 生成六邊形中點座標 %

y_point= 0;

for i_row =1:1:n_row

if(mod(i_row,2)==1)

x_point = 0.5;

else

x_point = 1.25;

endy_point= y_point+ 0.433;

for i_col = 1:1:n_col

x_point = x_point+ 1.5;

cell(i_row, i_col,2,:)= [x_point,y_point];

endend% 生成六邊形角點座標 %

cell(:,:,3,1)= cell(:,: ,2,1)-0.5;

cell(:,:,[4,8],1)= repmat(cell(:,: ,2,1)-0.25,1,1,2);

cell(:,:,[5,7],1)= repmat(cell(:,: ,2,1)+0.25,1,1,2);

cell(:,:,6,1)= cell(:,: ,2,1)+0.5;

cell(:,:,[3,6],2)= repmat(cell(:,: ,2,2),1,1,2);

cell(:,:,[4,5],2)= repmat(cell(:,: ,2,2)+0.433,1,1,2);

cell(:,:,[7,8],2)= repmat(cell(:,: ,2,2)-0.433,1,1,2);

% 繪製中點 %

plot(cell(:, :,2,1),cell(:, :,2,2),'linestyle','none','marker','.','color','b' );hold on;

if(cell(n_row,n_col,2,1)>1.2*cell(n_row,n_col,2,2))

xlim([0, cell(n_row,n_col,2,1)]+1.5);ylim([0, cell(n_row,n_col,2,1)]./1.2);

else

xlim([0, cell(n_row,n_col,2,2).*1.2+1]);ylim([0, cell(n_row,n_col,2,2)]);

end% 繪製六邊形 %

pic= cell(n_row,n_col);

for i=1:1:n_row

for j=1:1:n_col

pic= patch(reshape(cell(i,j,3:8,1),[1,6]),reshape(cell(i,j,3:8,2),[1,6]),'w');

endend% 尋找鄰近圖形的行、列號(沒有細胞的位置為[-1,-1])

for i_center=1:1:n_row

for j_center=1:1:n_col

for i=1:1:6

found = 0;

% 在目標細胞附近 士2 格的範圍內尋找,減少運算量

for i_find= max(1, i_center-2):min(n_row, i_center+2)

for j_find= max(1, j_center-2):min(n_col, j_center+2)

distance = sqrt((cell(i_center, j_center,2,1)- cell(i_find, j_find,2,1))^2 ...

+ (cell(i_center, j_center,2,2)- cell(i_find, j_find,2,2))^2);

% 初步根據距離判斷

if distance> 0.85 && distance< 0.9

x_range = [1,1].* cos(1.0472* (i-1)-0.5236)* distance+ [-0.1 0.1]+ cell(i_center, j_center,2,1);

y_range = [1,1].* sin(1.0472* (i-1)-0.5236)* distance+ [-0.1 0.1]+ cell(i_center, j_center,2,2);

% 再根據夾角判斷

if cell(i_find, j_find,2,1)> x_range(1) && cell(i_find, j_find,2,1)< x_range(2) ...

&& cell(i_find, j_find,2,2)> y_range(1) && cell(i_find, j_find,2,2)< y_range(2)

cell(i_center, j_center,i+8,:) = [i_find, j_find];

found= 1;

endend

endend

if found ==0

cell(i_center, j_center,i+8,:)= -1;

endend

endend% 賦予細胞隨機初試狀態

cell( :, :, 1, 1)=round(rand(n_row, n_col));

% 開始迭代

while 2>1

for i=1:1:n_row

for j=1:1:n_col

% 計算細胞周圍存活細胞數量

n_live = 0;

for k=1:1:6

if cell( i, j, k+8, 1)~= -1 && cell( i, j, k+8, 2)~= -1

n_live = n_live+ cell(cell( i, j, k+8, 1), cell( i, j, k+8, 2), 1, 1);

endend

% 判斷生死

if n_live>4 || n_live<3

cell( i, j, 1, 2)= 0;

else

cell( i, j, 1, 2)= 1;

end% 更新顯示狀態

if cell( i, j, 1, 1) >0.5

set(pic,'facecolor',[0.5 1 0.5]);

else

set(pic,'facecolor',[1 1 1]);

endend

enddrawnow;

% 更新生死狀態

cell( :, :, 1, 1)= cell( :, :, 1, 2);

end

六邊形平面

現在有乙個n n的六邊形網格平面 這種平面類似蜂窩形狀 下圖是n 1,2,3,4條件下的具體形狀,根據它們可以依次類推n 5,6,現在你需要對n n網格中一些格仔進行上色,在給定的輸入中這些格仔被標記上字元 x 而不用上色的網格被標記為 上色時需要注意,如果兩個被上色的格仔有公共邊,那麼這兩個格仔需...

2701 六邊形點陣

題目描述 description 輸入六邊形的邊長n,請你畫出這個六邊形點陣。輸入描述 input description 僅一行,乙個整數n 輸出描述 output description 六邊形點陣 有兩條邊水平 樣例輸入 sample input 6 樣例輸出 sample output 資料...

未知 六邊形 題解

接上題,反正是一起做的那麼故事情節也接上吧嘻嘻嘻 正好,帶我去一趟天線崖。你確定?你都說了都要暴雨了,前幾天的暴雨 是啊,你還抱怨整天悶在家裡啥事也沒幹呢,結果就剩下我在刷題而你整天再睡覺。因為山脈的阻隔,所以他們只能乘坐小船到達那裡。而給他們租小船的人,開出了很高的價錢,但是。你們幫我解決乙個問題...