2012-05-01 2 views
0

Я пытаюсь создать плотноупакованную слой, создавая свои центральные точки как поле, а затем разрежет точку для того, чтобы создать плотноупакованную слой кругов .. more info can be found hereMatlab: создать близко упакованный слой кругов

, но у меня возникают некоторые трудности .. Мой код до сих пор

%% Trying out the shear function 
rad=2; n=3; 
[X,Y] = meshgrid(0 : rad*2 : rad*(n-1)*2 , ... 
      0 : sqrt(2*(2*rad)^2)/2 : sqrt(2*(2*rad)^2)/2*(n-1)); 
xyBox = [reshape(X,1,numel(X)) ; reshape(Y,1,numel(Y))]; 
Sh = @(m) [1 m; 0 1];  % horizontal shear - slope is qual to 1/m 
slope = sqrt(3); 

shearedCoordinates = Sh(1/slope) * xyBox; 
figure; plot(xyBox(1,:),xyBox(2,:),'k.'); 
for i= 1:(numel(shearedCoordinates)/2) 
    hold on; 
    circle(shearedCoordinates(1,i),shearedCoordinates(2,i),rad) 
    plot(shearedCoordinates(1,i),shearedCoordinates(2,i),'bx') 
    hold off; 
end 
axis equal 

sorta packed circles

не понимаю математику позади Sh, но только можно увидеть, что он делает чертовски хорошую работу twisti ng (срезающие) точки. Я вычислил наклон квадратного корня 3 должны дать правильное место, но это выглядит Lige есть что-то не так с моими у расстояний ...

функция круга

function circle(x,y,r) 
    angle=0:0.01:2*pi; 
    xp=r*cos(angle); 
    yp=r*sin(angle); 
    plot(x+xp,y+yp,'r'); 
end 

* РЕШЕНИЕ *

%% Trying out the shear function 
rad=2; n=3; 
[X,Y] = meshgrid(0 : rad*2 : rad*(n-1)*2 , ... 
    0 : sqrt(3)*rad : sqrt(3)*rad*(n-1)); 
xyBox = [reshape(X,1,numel(X)) ; reshape(Y,1,numel(Y))]; 
Sh = @(m) [1 m; 0 1];  % horizontal shear - slope is qual to 1/m 
slope = sqrt(3); 

shearedCoordinates = Sh(1/slope) * xyBox; 
figure; plot(xyBox(1,:),xyBox(2,:),'k.'); 
for i= 1:(numel(shearedCoordinates)/2) 
    hold on; 
    circle(shearedCoordinates(1,i),shearedCoordinates(2,i),rad) 
    plot(shearedCoordinates(1,i),shearedCoordinates(2,i),'bx') 
    hold off; 
end 
axis equal 

(не забывайте голосовать, если вы нашли его полезным)

ответ

0

По моим подсчетам, ваша ошибка (или, возможно, только первая, что я вижу) находится в y-расстоянии линий центров окружности. У вас есть выражение

0 : sqrt(2*(2*rad)^2)/2 : sqrt(2*(2*rad)^2)/2*(n-1) 

для размещения круглых центров. Я думаю, что вертикальный шаг (или значение шага) должен быть rad*sqrt(3)/2, который даст вам:

0 : rad*sqrt(3)/2 : sqrt(2*(2*rad)^2)/2*(n-1) 

Если я не сделал ошибку (вполне возможна) высоту блока равностороннего треугольник sqrt(3)/2 и что должен быть вашим y-интервалом.

+0

Вы правы, что высота неправильная. Это должно было быть sqrt (3) * rad. Вчера смотрел слишком много цифр. – Norfeldt

+0

Просто добавлено окончательное решение – Norfeldt

+0

Я утверждаю, что высота равностороннего треугольника стороны 'a' есть' a * sqrt (3)/2' нет, как у вас в вашем комментарии, 'a * sqrt (3)' , –

0

Я не имел шанс пройти через код я n Matlab пока, но просто взглянув на фигуру, которую вы опубликовали, я согласен, что сдвиг работает. Однако эти круги будут перекрываться, даже если вы использовали центры предварительного сдвига. Это то, что вы имели ввиду?

+0

Срез работает отлично. Когда вы говорите pre/shear, я предполагаю, что вы имеете в виду черные центры. Если они будут построены из черных центров, тогда да, они будут перекрываться. – Norfeldt

+0

На самом деле, возможно, на втором взгляде мы ошибались в отношении сдвига. Если вы посмотрите на первую фигуру в ссылке, которую вы включили, и попытайтесь повернуть ее назад, чтобы отменить сдвиг или распаковать их, расстояние между центрами вдоль y должно увеличиться. Вместо этого в вашей диаграмме центры только что были переведены вдоль x. Я думаю, что даже если бы вы получили начальные расстояния прямо, а затем срезали таким образом, вы не достигли бы эффекта упаковки. – MyCarta

+0

Проверьте фигуру с красными шарами в проскальзывании через пункт перемещения дислокации здесь: http://www.doitpoms.ac.uk/tlplib/dislocations/printall.php – MyCarta