2012-09-13 11 views
5

मैं 3 डी सतह का एक साजिश बनाना चाहता हूं जो [X,Y,Z] बिंदु क्लाउड से सभी बिंदुओं पर फैला हुआ है।प्वाइंट क्लाउड के मैटलैब डेलयूने त्रिभुज - रंग मैट्रिक्स

scatter3(X,Y,Z,5,C)

Scatter plot

आप प्रत्येक डेटा बिंदु एक तीव्रता मूल्य C है देख सकते हैं: उदाहरण के लिए इस मेरी बात बादल के बिखराव की साजिश है।

मैं अब ट्राईऐन्ग्युलेशंस

dt  = DelaunayTri(X,Y,Z); 
[tri Xb]= freeBoundary(dt); 

बाहर ले जाने और मैं triangulated सतह प्राप्त

figure 
trisurf(tri,Xb(:,1),Xb(:,2),Xb(:,3), 'FaceColor', 'cyan', 'faceAlpha', 0.8); 

Surface

हालांकि, जब मैं

का उपयोग कर सतह का रंग सेट करने का प्रयास
trisurf(tri,Xb(:,1),Xb(:,2),Xb(:,3),C,'EdgeAlpha',0,'FaceColor','interp') 

मुझे त्रुटि संदेश मिलता है: "चेतावनी: रंग डेटा इंटरपोलेटेड छायांकन के लिए सेट नहीं है", जो इस तथ्य के कारण है कि C का आकार Xb या tri से मेल नहीं खाता है।

मैं कैसे सुनिश्चित कर सकता हूं कि मुझे सही इंटरपोलेटेड सतह रंग मिल जाए?

उत्तर

4

आपने फ्रीबॉन्डरी को कॉल करके प्लॉट किए गए त्रिभुज में अंक की संख्या बदल दी है: केवल सतह बिंदु शेष हैं, आंतरिक बिंदु सतह से संबंधित नहीं हैं। इसलिए, आपको उन बिंदुओं के अनुरूप सी मान निकालना होगा। आप मूल बिंदु सेट XYZ पर सतह बिंदु Xb को मैप करने के लिए 'intersect (...,' पंक्तियां ') का उपयोग कर सकते हैं। इस मानचित्र के आधार पर आप सी से आवश्यक मान निकालते हैं। नीचे दिया गया कोड यह करता है।

clear all; 

XYZ = rand(100,3); 
X=XYZ(:,1); 
Y=XYZ(:,2); 
Z=XYZ(:,3); 
C=rand(size(X)); 

scatter3(X, Y, Z, 5,C); 

dt = DelaunayTri(X, Y, Z); 
[tri Xb]=freeBoundary(dt); 

% map Xb onto XYZ 
[~,IA,IB]=intersect(XYZ, Xb, 'rows'); 

% extract the needed colors using the IA map 
Cn  = C(IA); 

% permute the surface triangulation points using IB map 
Xbn  = Xb(IB,:); 

% map the point numbers used in triangle definitions 
% NOTE: for that you need inverse map 
iIB(IB) = 1:length(IB); 
trin = iIB(tri); 

trisurf(trin,Xbn(:,1),Xbn(:,2),Xbn(:,3),Cn,'EdgeAlpha',0,'FaceColor','interp'); 
+0

शानदार, आपके उत्तर के लिए बहुत बहुत धन्यवाद। यह खूबसूरती से काम करता है! –

+0

क्षमा करें, मुझे इसके बारे में पता नहीं था –

संबंधित मुद्दे