为了推断,我们如何获得我们定义的2D矩阵的某些度数的一维数组,如image显示的总是在2D矩阵的中心有起点。 2D矩阵的长度始终相等。
答案 0 :(得分:0)
如果您知道中心,请说x_c, y_c
然后循环遍历所有像素(当前像素为x_p, y_p
)并使用angle = atan2(y_p-y_c, x_p-x_c)
计算角度。这将为您提供一个精确的角度,因此您需要使用floor(angle)
之类的方法对其进行舍入。然后,您可以检查所需子角度(例如30度)的模数是否为0,以查看角度是否良好。如果是,您可以使用数据执行所需操作。
x_c = picture_center_x;
y_c = picture_center_x;
angleMod = 30;
for x_p = 1:pixels
for y_p = 1:pixels
angle = floor(atan2(y_p-y_c, x_p-x_c))*180/pi;
if (mod(angle, angleMod) == 0)
%push back pixel data
end
end
end
非常简单的算法,希望它可以为你工作。
答案 1 :(得分:-1)
以下是您的问题的解决方案:
center = [26,26]; %position of your center
size= 51; %size of the matrix
matrix=bsxfun(@plus, ([(center(1)-size):1:0, 1:1:(size-center(1))].^2)',[(center(2)-size):1:0, 1:1:(size-center(2))].^2); %my generated matrix to test the solution
angle= [0,30,60,90,120,150,180,210,240,270,300,330]; %array of angles
angle=angle*pi/180; % changing angles into rad (from degree)
sine_angle=sin(angle); %computing sine of those angles
cos_angle=cos(angle); %computing cosine of those angles
cos_max = abs(size-center(2))*cos_angle.^(-1); %computing the maximum distance in left right direction of each angle
sine_max = abs(size-center(1))*sine_angle.^(-1); %computing the max. distance in up/down direction of each angle
sine_cos_max = min(abs(cos_max), abs(sine_max)); %checking which boarder is reached first
angle_array = cell(1,numel(angle));
k=0;
while k<=max(sine_cos_max)
for m=1:1:numel(angle)
if k <= sine_cos_max(m)
helper = angle_array{1,m};
helper2 = [helper, matrix(center(1)+floor(sine_angle(m)*k),center(2)+floor(cos_angle(m)*k))];
angle_array(1,m) = {helper2};
end
end
k=k+1;
end
你必须使用地板,因为在使用过的例子中,否则你会尝试将矩阵外的元素加到30度和60度。或者,您可以在if情况下使用另一个参数来检查它是否仍然可能。