[英]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.