2017-02-01 3 views
1

Im пытается создать метлы, как фигура в среде MATLAB, как illusrated здесь:Plotting источник метла/свет

Broom plot

Моя идея была начать с горизонтальной линией, а затем, используя матрицу вращения в пределах петля создает другие. Однако мой код, похоже, играет на меня.

В двух словах я хочу создать линии, распространяющиеся из определенной точки с одинаковым углом между каждой линией.

Это мой код.

th = pi/12; % 15 degrees between every line 
pointA = [20 50]; %The starting point of every line 
pointB = [90 50]; %The ending point of the center line 
v = [pointA(1) pointB(1); pointA(2) pointB(2)]; 
% 
R [email protected](x)[cos(x) -sin(x); sin(x) cos(x)]; % Rotation matrix function 
% 
for i = -4:4 
    c = R(i*th)*v; 
    line([pointA(1) c(1,2)],[pointA(2) c(2,2)]); 
    hold on 
end 

Любые идеи, почему углы на линиях (кроме центральной линии) отключены?

ответ

2

Проблема в том, что матрица вращения всегда вращается вокруг начала координат ([0,0]), но вы хотите, чтобы она вращалась вокруг pointA. Раствор либо

  1. генерировать линии с нужным углом и длины, и смещают их pointA или
  2. сдвига 2d пространство таким образом, что pointA становится происхождение, делают поворот и сдвиг точки обратно ,

Я хотел бы найти последний подход простого, так как ваши предварительного вращение конечных точек естественным образом определяются:

th = pi/12; % 15 degrees between every line 
% pointA and pointB must be column vectors for matrix multiplication later 
pointA = [20; 50]; %The starting point of every line 
pointB = [90; 50]; %The ending point of the center line 
% 
R = @(x)[cos(x) -sin(x); sin(x) cos(x)]; % Rotation matrix function 
% 
hold on; % Hold on and off around loop to plot all lines on same fig 
for i = -4:4 
    % line is initially pointA -> pointB 
    % shift the world by -point A 
    % line is now [0,0] -> pointB-pointA 
    % rotate the world around the origin 
    % line is now [0,0] -> R*(pointB-pointA) 
    % shift the world back 
    % line is now pointA -> R*(pointB-pointA) + pointA 
    c = R(i*th)*(pointB-pointA) + pointA; 
    % note that c is now a single 2d vector: image of pointB 
    line([pointA(1) c(1)],[pointA(2) c(2)]); 
end 
hold off; 
+0

Спасибо, @Wolfie! –