Azzera filtri
Azzera filtri

Rotational symmetries of cubic crystal structures

4 visualizzazioni (ultimi 30 giorni)
Hey everyone,
For my senior project, I need to first plot the various crystal structures (simple cubic, body-centered, hexagonal) and then study their symmetries. I have been able to create the structures as below. I will only give the simplest so that people who are not interested in physical chemistry can easily understand aswell.
xcord=[0 1 0 0 1 1 0 1];
ycord=[0 0 1 0 1 0 1 1];
zcord=[0 0 0 1 0 1 1 1];
figure(1)
unitcell = scatter3(xcord(:), ycord(:), zcord(:),100,'fill','b');
axis([-1 1 -1 1 -1 1])
xlabel('x')
ylabel('y')
zlabel('z')
I have also rotated this cubic structure along X, Y and Z axises by products of 90 degrees as given below (only written X axis to keep it short);
xcord=[0 1 0 0 1 1 0 1];
ycord=[0 0 1 0 1 0 1 1];
zcord=[0 0 0 1 0 1 1 1];
figure(1)
unitcell = scatter3(xcord(:), ycord(:), zcord(:),100,'fill','b');
axis([-1 1 -1 1 -1 1])
xlabel('x')
ylabel('y')
zlabel('z')
%Rotate along x axis
for i = 90:90:270
if i == 90;
X = xcord;
Y = -ycord;
Z = zcord;
figure(2)
scatter3(X,Y,Z,100,'fill','b');
axis([-1 1 -1 1 -1 1])
title('Rotation along x axis for 90 degrees')
xlabel('x')
ylabel('y')
zlabel('z')
elseif i == 180;
X = xcord;
Y = -ycord;
Z = -zcord;
figure(3)
scatter3(X,Y,Z,100,'fill','b');
axis([-1 1 -1 1 -1 1])
title('Rotation along x axis for 180 degrees')
xlabel('x')
ylabel('y')
zlabel('z')
else
X = xcord;
Y = ycord;
Z = -zcord;
figure(4)
scatter3(X,Y,Z,100,'fill','b');
axis([-1 1 -1 1 -1 1])
title('Rotation along x axis for 270 degrees')
xlabel('x')
ylabel('y')
zlabel('z')
end
end
My problem starts here. Yes I can hardcode the coordinates but I need to show that there will be no symmetry for, for example 120 degrees of rotation. Is there any way I can make it simpler and plot for various angles other than products of 90? I have tried the 'rotate' function but haven't been able to make it work.
Also, my other question is; how can I rotate this along an axis passing through (0,0,0) and (1,1,1) or other arbitrary axises other than X, Y and Z. Your help will be much appriciated.
Thanks and have a nice year!

Risposta accettata

Michael Madelaire
Michael Madelaire il 2 Gen 2019
I have made with without the use of build-in functions: I believe it is important for you to know how to rotate around an axis and not just use a function.
Take a look at Rotation matrix, specifically in the section "Basic rotations".
I have implemented the R_x matrix from the above link.
xcord=[0 1 0 0 1 1 0 1];
ycord=[0 0 1 0 1 0 1 1];
zcord=[0 0 0 1 0 1 1 1];
figure;
unitcell = scatter3(xcord(:), ycord(:), zcord(:),100,'fill','b');
plotLinesTheStupidWay(xcord, ycord, zcord);
axis([-1 1 -1 1 -1 1]*1.5)
xlabel('x')
ylabel('y')
zlabel('z')
angleStepSize = 1;
pos = [xcord; ycord; zcord];
for i = 0:angleStepSize:360
theta = i;
rotX = [1, 0, 0; 0, cosd(theta), -sind(theta); 0, sind(theta), cosd(theta)];
for j = 1:length(xcord)
foo = rotX*pos(:,j);
xcord(j) = foo(1);
ycord(j) = foo(2);
zcord(j) = foo(3);
end
unitcell = scatter3(xcord(:), ycord(:), zcord(:),100,'fill','b');
plotLinesTheStupidWay(xcord, ycord, zcord)
axis([-1 1 -1 1 -1 1]*1.5)
pause(0.1);
end
function plotLinesTheStupidWay(xcord, ycord, zcord)
hold on;
plot3([xcord(1), xcord(2)], [ycord(1), ycord(2)], [zcord(1), zcord(2)], '-r');
plot3([xcord(1), xcord(3)], [ycord(1), ycord(3)], [zcord(1), zcord(3)], '-r');
plot3([xcord(1), xcord(4)], [ycord(1), ycord(4)], [zcord(1), zcord(4)], '-r');
plot3([xcord(2), xcord(5)], [ycord(2), ycord(5)], [zcord(2), zcord(5)], '-r');
plot3([xcord(2), xcord(6)], [ycord(2), ycord(6)], [zcord(2), zcord(6)], '-r');
plot3([xcord(3), xcord(7)], [ycord(3), ycord(7)], [zcord(3), zcord(7)], '-r');
plot3([xcord(3), xcord(5)], [ycord(3), ycord(5)], [zcord(3), zcord(5)], '-r');
plot3([xcord(5), xcord(8)], [ycord(5), ycord(8)], [zcord(5), zcord(8)], '-r');
plot3([xcord(8), xcord(6)], [ycord(8), ycord(6)], [zcord(8), zcord(6)], '-r');
plot3([xcord(8), xcord(7)], [ycord(8), ycord(7)], [zcord(8), zcord(7)], '-r');
plot3([xcord(4), xcord(6)], [ycord(4), ycord(6)], [zcord(4), zcord(6)], '-r');
plot3([xcord(4), xcord(6)], [ycord(4), ycord(6)], [zcord(4), zcord(6)], '-r');
plot3([xcord(4), xcord(7)], [ycord(4), ycord(7)], [zcord(4), zcord(7)], '-r');
hold off
end

Più risposte (1)

Bruno Luong
Bruno Luong il 2 Gen 2019
xcord=[0 1 0 0 1 1 0 1];
ycord=[0 0 1 0 1 0 1 1];
zcord=[0 0 0 1 0 1 1 1];
xyz = [xcord; ycord; zcord];
theta = pi/3;
M = makehgtform('xrotate',theta);
R = M(1:3,1:3);
xyzr = R*xyz;
X = xyzr(1,:);
Y = xyzr(2,:);
Z = xyzr(3,:);
scatter3(X,Y,Z,100,'fill','b');
axis([-1 1 -1 1 -1 1])
title(sprintf('Rotation along x axis for %g degrees',theta*180/pi))
xlabel('x')
ylabel('y')
zlabel('z')
  1 Commento
Ozan Terzioglu
Ozan Terzioglu il 2 Gen 2019
Thanks a lot for your answer,
This one somehow deforms the structure. I could not figure it out

Accedi per commentare.

Categorie

Scopri di più su Vector Fields in Help Center e File Exchange

Tag

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by