Два вопроса, связанных с Matlab Coding - PullRequest
0 голосов
/ 16 ноября 2018
  1. Как я могу создать код в Matlab, который подсчитывает, сколько ливневых дорожек проходит линию, или сколько не пройдено, или сколько перекрывается друг с другом (ливневая дорожка и линия)?
  2. Как создать код в Matlab, который рассчитывает угол между ливневой дорожкой и линиями, которые перекрываются? Я уже пробовал, но это не работает.

    N = 50; % Number of events  
    X = 50; Y = 50; 
    
    P1x = rand(N,1) * X;
    P1y = rand(N,1) * Y ; % initial point
    
    L = lognrnd(2,0.7,[N,1]); % Sample track length 
    Theta = mod(normrnd(90,15,[N,1]),360);
    
    dx = L.*cos(deg2rad(Theta - 90)); 
    dy = L.*sin(deg2rad(Theta - 270));
    
    P2x = P1x + dx; P2y = P1y + dy; % Final point
    
    plot([0 X X 0 0],[0 0 Y Y 0]); hold on
    
    for j = 1:N
        plot(P1x(j),P1y(j),'ro')
        plot([P1x(j) P2x(j)],[P1y(j) P2y(j)],'-') 
    end
    
    k=line([(X+Y)/2.25, (X+Y)/3, (X+Y)/3, (X+Y)/4] , [0, (X+Y)/10, (X+Y)/2.5, (X+Y)/2]);
    
    xlabel('X [km]'); ylabel('Y [km]');
    xlim([-X/4 1.25*X]); ylim([-Y/4 1.25*Y])
    

plot screenshot

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018
N = 50; % Number of events
X = 50; Y = 50;
P1x = rand(N,1) * X; P1y = rand(N,1) * Y ; % initial point
L = lognrnd(2,0.7,[N,1]); % Sample track length
Theta = mod(normrnd(90,15,[N,1]),360); % Storm track bearing direction
dx = L.*cos(deg2rad(Theta - 90)); dy = L.*sin(deg2rad(Theta - 270));
P2x = P1x + dx; P2y = P1y + dy; % Final point
plot([0 X X 0 0],[0 0 Y Y 0]); hold on
plot(P1x,P1y,'ro');
plot([P1x P2x]',[P1y P2y]','-')
xlabel('X [km]'); ylabel('Y [km]');
xlim([-X/4 1.25*X]); ylim([-Y/4 1.25*Y])
%% Draw rectangles
Vx = [P1x P2x]' ;
Vy = [P1y P2y]' ;
t = 1./2 ;
% Loop to get normals
for i = 1:size(Vx,2)
    N=LineNormals2D([Vx(:,i) Vy(:,i)]') ;

    C = [[Vx(:,i) Vy(:,i)]+t*N ;
        [Vx(:,i) Vy(:,i)]-t*N] ;
    idx = boundary(C(:,1),C(:,2)) ;
    plot(C(idx,1),C(idx,2),'b')
end

Отключение функции LineNormals2D по ссылке: https://in.mathworks.com/matlabcentral/fileexchange/32696-2d-line-curvature-and-normals

0 голосов
/ 16 ноября 2018

Вы можете использовать функцию InterX , чтобы получить точку пересечения между синей линией и линией шторма.Проверьте код ниже.Я сделал несколько изменений в сюжете линии шторма, вам не нужно использовать там петлю.Получив точку пересечения, вы можете получить требуемый угол, используя точечное произведение или формула наклона .

N = 50; % Number of events
X = 50; Y = 50;

P1x = rand(N,1) * X;
P1y = rand(N,1) * Y ; % initial point

L = lognrnd(2,0.7,[N,1]); % Sample track length
Theta = mod(normrnd(90,15,[N,1]),360);

dx = L.*cos(deg2rad(Theta - 90));
dy = L.*sin(deg2rad(Theta - 270));

P2x = P1x + dx; P2y = P1y + dy; % Final point

plot([0 X X 0 0],[0 0 Y Y 0]); hold on
% GEt the line 
lx = [(X+Y)/2.25, (X+Y)/3, (X+Y)/3, (X+Y)/4] ;
ly = [0, (X+Y)/10, (X+Y)/2.5, (X+Y)/2];
plot(lx,ly,'b')

plot(P1x,P1y,'ro')
plot([P1x P2x]',[P1y P2y]','-')

% Get intersections 
iwant = zeros(N,1) ;  % this gives whether point intersects or not 
for i = 1:N
    L1 = [lx ; ly] ;
    L2 = [P1x(i) P2x(i) ;P1y(i) P2y(i)] ;
    P = InterX(L1,L2) ;
    if ~isempty(P)
        plot(P(1),P(2),'*r')
        iwant(i) = 1 ;
    end
end

xlabel('X [km]'); ylabel('Y [km]');
xlim([-X/4 1.25*X]); ylim([-Y/4 1.25*Y])

Проверьте число / результат, полученный из приведенного выше кода.Помеченные красным цветом точки - это точки пересечения.

enter image description here

...