簡體   English   中英

Matlab - 如何填充 3D 空間中的區域?

[英]Matlab - How to to fill an area in 3D space?

我想使用某些條件填充 3D 空間中的一個區域。

假設有這樣一個向量:

x1 = 100;
y1 = 102;
z1 = 103;
P1 = [x1, y1, z1];

現在我想指出P2 = [x2, y2, z2]; 如:

x2 < x1;
y2 < y1;
z2 < z1;
x1 - x2 < y1 - y2;
y1 - y2 < z1 - z2;
|angle between P1 and P2| < pi/20

我不認為fill3 function 會起作用。

我嘗試繪制所有可能的點,但速度很慢:

r1 = 100;
g1 = 102;
b1 = 103;

P1 = [r1, g1, b1];

for r2 = 0:0.1:r1
    for g2 = 0:0.1:g1
        for b2=0:0.1:b1

            % calculate angle between two vectors
            P2 = [r2, g2, b2];
            a = abs(atan2(norm(cross(P1,P2)),dot(P1,P2)));
            
            % draw point if conditions are true
            if ((b1 - b2) < (g1 - g2)) && ((g1 - g2) <= (r1 - r2)) && (a < (pi/20)) 
                scatter3(r2,g2,b2,5,'g');
                hold on;
            end
            
        end
    end
end

如何應用這些條件並為P2的所有可能值填充 3D 空間中的區域?

您正在通過單獨調用scatter3來繪制每個點。 相反,您應該首先執行計算並找到點,然后 plot 一次全部找到它們:

r1 = 100; g1 = 102; b1 = 103;
P1 = [r1, g1, b1];
step = .5;
r = 0:step:r1;
g = 0:step:g1;
b = 0:step:b1;
[R, G, B] = meshgrid(r, g, b);
n = numel(R);
inside = false(size(R));
for ii= 1:n
    r2 = R(ii);
    g2 = G(ii);
    b2 = B(ii);
    
    % calculate angle between two vectors
    P2 = [r2, g2, b2];
    a = abs(atan2(norm(cross(P1,P2)),dot(P1,P2)));
    
    % draw point if conditions are true
    if ((b1 - b2) < (g1 - g2)) && ((g1 - g2) <= (r1 - r2)) && (a < (pi/20))
        inside(ii) = true;
    end
end
scatter3(R(inside), G(inside), B(inside), 5, 'g');

另外,如果你有興趣說明體積,你可以調用convhull來找到找到點的凸廳:

k = convhull(R(inside), G(inside), B(inside));
trisurf(k,R(inside), G(inside), B(inside), 'facecolor', 'g', 'edgealpha', .1)

您甚至可以簡化凸包:

k = convhull(R(inside), G(inside), B(inside),'Simplify',true);

在此處輸入圖像描述

編輯:添加透明度

您可以通過設置其'MarkerEdgeAlpha'屬性使您的分散 plot 透明。 但是,它可能不會對結果有太大的改變,除了體積的邊緣。 那是因為有太多的標記相互覆蓋:

subplot 131
scatter3(R(inside), G(inside), B(inside), 5, 'r');
axis equal, title('solid')

subplot 132
scatter3(R(inside), G(inside), B(inside), 5, 'r', ...
    'markeredgealpha', 0.1);
axis equal, title('transparent')

subplot 133
scatter3(R(inside), G(inside), B(inside), 5, 'r', ...
    'markeredgealpha', 0.1);
axis equal, title('zoomed'), zoom(4)

在此處輸入圖像描述

您還可以使 surf object 透明:

subplot 121
trisurf(k,R(inside), G(inside), B(inside), 'facecolor', 'g', ...
    'edgealpha', 0.1)
axis equal, title('solid')

subplot 122
trisurf(k,R(inside), G(inside), B(inside), 'facecolor', 'g', ...
    'facealpha', 0.3, 'edgealpha', .1)
axis equal, title('transparent')

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM