Как я могу нарисовать эту сеть трубок в Matlab? - PullRequest
2 голосов
/ 16 декабря 2011

enter image description here

У меня есть распределение радиуса трубки r, и я хотел бы построить трубки для всех отобранных r на одном рисунке, как показано на рисунке выше. Трубы имеют следующие характеристики:

  • Длина всех труб постоянна, но радиус варьируется.

  • Самая узкая труба будет полностью заполнена со светло-серым цветом.

  • Длина светло-серого цвета снизу во всех остальных трубах обратно пропорциональна радиусу трубки, т.е.

    length of light grey color from bottom = constant/r

  • Оставшаяся длина трубки будет заполнена темно-серым цветом.

  • Величины r и общая длина каждой трубы составляют порядка 1e-005 м и 1e-002 м соответственно, поэтому их необходимо стандартизировать по сравнению с единицами осей X и Y.

  • Белые промежутки - это просто пробелы, а не трубы.

ОБНОВЛЕНИЕ (на основании ответа Бориса)

Это код от Бориса, в котором я внес определенные изменения, основываясь на характеристиках труб, которые я описал выше. У меня проблемы с масштабированием, поскольку я не могу визуализировать свою сеть трубок так четко, как это видно на рисунке выше.

function drawGrayTube (x, r, sigma_wn, theta, del_rho, rmin, rmax,L)
% sigma_wn is in N/m (=Kg/s^2), theta is in degrees, del_rho is in Kg/m^3
% and L is in m
h=((2*sigma_wn*cos((pi/180)*theta))./(del_rho*9.81.*r));
hmin=((2*sigma_wn*cos((pi/180)*theta))./(del_rho*9.81.*rmax));
hmax=((2*sigma_wn*cos((pi/180)*theta))./(del_rho*9.81.*rmin));

rectangle ('Position',[x,0,r/rmax,h], 'FaceColor',[0.7,0.7,0.7]);
ylim([0 1]);

if L>h
    rectangle ('Position',[x,L,r/rmax,L-h], 'FaceColor',[0.3,0.3,0.3]);
    ylim([0 1]);
else
    rectangle ('Position',[x,L,r/rmax,L], 'FaceColor',[0.3,0.3,0.3]);
    ylim([0 1]);
end

end

Ответы [ 2 ]

6 голосов
/ 16 декабря 2011

Простая функция для рисования серых трубок может быть, например,

function drawGrayTube (x, w, h)
    rectangle ('Position',[x,0,w,h], 'FaceColor',[0.7,0.7,0.7]);
    rectangle ('Position',[x,h,w,100-h], 'FaceColor',[0.3,0.3,0.3]);
end

При этом x обозначает положение трубки x, w обозначает ширину, а h между 0 и 100 высотой светло-серой части трубки.

Теперь вы можете использовать его в своем примере, позвонив

drawGrayTube (x, r, 100*constant/r)

где вы должны адаптировать константу так, чтобы constant/r было не более 1.

Вы можете написать аналогичную функцию для белых промежутков.

Предположим, что вы задали вектор радиусов (уже масштабированный таким образом, что значения находятся в диапазоне от 0 до 1), например, r=[0.5, 0.7, 0.9, 0.1, 0.5, 0.01], тогда при возможности рисования трубок

interspace = 0.5;
for i=1:length(r)
    drawGrayTube(sum(r(1:i-1))+i*interspace, 100*r(i)+1e-10, r(i)+1e-10); 
end
0 голосов
/ 16 декабря 2011

Вы должны использовать функцию rectangle

...