0

我在 3D 矩形中有一个目标坐标 (xyz)。假设 3D 矩形位于具有 x,y,z 的平面中,则设置目标坐标。目标坐标设置在矩形的一端,'y' 分量设置为距离 3D 正方形顶部的 -2(请参阅图像)。然而,实际上 3D 矩形不在具有 x、y、z 轴的平面中,它是倾斜的。我们通过测量矩形顶面上的两个参考点来计算偏斜,现在要重新计算目标坐标。我不知道如何确保我正确计算倾斜或(更重要的是)绘制旧的与新的 3D 矩形和目标坐标。下面是在所述矩阵中生成矩阵和目标的代码。

对于用于计算 3D 矩形偏斜的两个参考点,我们将其命名为一个“bregma”和一个“lamda”。

%% CONVENTIONS: 
%1) numbers get lower when 
%   1) going to left on x axis 
%   2) going down y axis
%   3) going posterior (or towards you) on z axis,
% opposite of convention

%2) coordinate order is AP (anterior posterior), ML 
%(medial lateral), DV
%(dorsal ventral)


%Bregma is the anterior reference point and 
%Lambda is posterior reference point . The goal variables
%are the point in space I want to reach. I'm hoping the code creates new
%points for me as caused by a change in elevation between point "c" and "f"

%Note, for AP/ML/DV absolute values, the actual integers %are merely
%reference points in space. It is the delta between AP %and AP or ML and ML
%that is meaningful

%values a-f would be acquired from the stereotaxic frame
a= 43; %AP at bregma
b= 20; %ML at bregma 
c= 22; %DV at bregma 
d= 38.8; %AP at lambda 
e= 20; %ML at Lambda 
f= 21.5;  %DV at lamda This variable causes the change %in which I want the rotation to correct
%Bregma =[b a c];

%Following three points are given relative to bregma, this is convention. So mathematically 'Bregma=[0 0 0];' 
%These are also the coordinates I want altered from the rotation matrix
MLgoal=0; %ML to injection  
APgoal=0; %AP to injection
DVgoal=-2.0; %DV to injection
DVgoal_zaxis_signconvention_correction = -DVgoal; %we want sign convention flipped for z axis[![enter image description here][1]][1]

A= a-d;
M= b-e;
D= c-f;
%Bregma =[0 0 0];

v = [A M D];
mv = norm(v);
u=[A 0 0]; %theoretical vector [ML,AP,DV] bregma to %lambda 
mu = norm(u);

%angle in radians
X=acos(dot(u,v)/(mu*mv));

cu=cross(u,v);
w=cu/norm(cu); %unit vector


%rotate about this unit vector by angle X
wx=w(1);
wy=w(2);
wz=w(3);

%sustitute variables into general rotation for more %readable code
vx = 1-cos(X);
cx = cos(X);
sx = sin(X);

%rotation matrix about arbitrary unit vector [wx; wy; %wz] by angle X
r=[vx*wx*wx + cx, vx*wx*wy - wz*sx, vx*wx*wz + wy*sx;
    vx*wx*wy + wz*sx, vx*wy*wy + cx, vx*wy*wz - wx*sx;
    vx*wx*wz - wy*sx, vx*wy*wz + wx*sx, vx*wz*wz + cx];

%Newcoordinate output should tell you the change in %targeting coordinate
%after correcting for the output of rotational matrix. %The value for DV
%seems too large based on the subtle increase elevation %of reference point
%Bregma to reference point Lambda
Newcoordinates=r* [APgoal;MLgoal;DVgoal_zaxis_signconvention_correction];  %should give you the new coordinates for the injection %site 

4

0 回答 0