سؤال

لدي نقاط في الفضاء ثلاثي الأبعاد ونقاط الصورة ثنائية الأبعاد المقابلة. كيف يمكنني صنع شبكة من النقاط ثلاثية الأبعاد ، ثم الملمس الذي يواجهه المثلث الذي يتكون من الشبكة؟

هل كانت مفيدة؟

المحلول

لاحظ أن الوظيفة trisurf أنك كنت تحاول في الأصل استخدام إرجاع مقبض إلى أ تصحيح هدف. إذا نظرت إلى 'FaceColor' خاصية لكائنات التصحيح, ، يمكنك أن ترى أنه لا يوجد 'texturemap' اختيار. هذا الخيار صالح فقط ل 'FaceColor' ممتلكات السطحية أشياء. لذلك سيتعين عليك إيجاد طريقة لرسم سطح المثلث الخاص بك كملف السطحية الكائن بدلاً من أ تصحيح هدف. فيما يلي طريقتان للتعامل مع هذا:

إذا كانت بياناتك في شبكة موحدة ...

إذا كانت إحداثيات بيانات السطح الخاصة بك تمثل شبكة موحدة مثل z هي مجموعة مستطيلة من النقاط التي تمتد من xmin ل xmax في المحور X و ymin ل ymax في المحور ص ، يمكنك رسمه باستخدام surf بدلاً من trisurf:

Z = ...  % N-by-M matrix of data
x = linspace(xmin, xmax, size(Z, 2));  % x-coordinates for columns of Z
y = linspace(ymin, ymax, size(Z, 1));  % y-coordinates for rows of Z
[X, Y] = meshgrid(x, y);               % Create meshes for x and y
C = imread('image1.jpg');              % Load RGB image
h = surf(X, Y, Z, flipdim(C, 1), ...   % Plot surface (flips rows of C, if needed)
         'FaceColor', 'texturemap', ...
         'EdgeColor', 'none');
axis equal

من أجل توضيح نتائج الكود أعلاه ، قمت بتهيئة البيانات كـ Z = peaks;, ، استخدم صورة العينة المدمجة 'peppers.png', ، وضبط x و y قيم تمتد من 1 إلى 16. أدى ذلك إلى سطح الملمس التالي:

enter image description here

إذا كانت بياناتك غير متباعدة بشكل غير موحد ...

إذا لم تكن بياناتك متباعدة بانتظام ، فيمكنك إنشاء مجموعة من المسافات بانتظام X و Y الإحداثيات (كما فعلت أعلاه باستخدام meshgrid) ثم استخدم إحدى الوظائف griddata أو TriScatteredInterp لاستيفاء شبكة منتظمة من Z القيم من مجموعة غير النظامية الخاصة بك z القيم. أناقش كيفية استخدام هاتين وظيفتين في إجابتي على سؤال آخر. إليك نسخة دقة من الرمز الذي نشرته باستخدام TriScatteredInterp (ملاحظة: اعتبارًا من R2013A scatteredInterpolant هو البديل الموصى به):

x = ...  % Scattered x data
y = ...  % Scattered y data
z = ...  % Scattered z data
xmin = min(x);
xmax = max(x);
ymin = min(y);
ymax = max(y);
F = TriScatteredInterp(x(:), y(:), z(:));  % Create interpolant
N = 50;  % Number of y values in uniform grid
M = 50;  % Number of x values in uniform grid
xu = linspace(xmin, xmax, M);         % Uniform x-coordinates
yu = linspace(ymin, ymax, N);         % Uniform y-coordinates
[X, Y] = meshgrid(xu, yu);            % Create meshes for xu and yu
Z = F(X, Y);                          % Evaluate interpolant (N-by-M matrix)
C = imread('image1.jpg');             % Load RGB image
h = surf(X, Y, Z, flipdim(C, 1), ...  % Plot surface
         'FaceColor', 'texturemap', ...
         'EdgeColor', 'none');
axis equal

في هذه الحالة ، عليك أن أول اختر قيم N و M لحجم المصفوفة الخاص بك Z. من أجل توضيح نتائج الكود أعلاه ، قمت بتهيئة البيانات لـ x, y, ، و z على النحو التالي واستخدم صورة العينة المدمجة 'peppers.png':

x = rand(1, 100)-0.5;  % 100 random values in the range -0.5 to 0.5
y = rand(1, 100)-0.5;  % 100 random values in the range -0.5 to 0.5
z = exp(-(x.^2+y.^2)./0.125);  % Values from a 2-D Gaussian distribution

أدى هذا إلى السطح التالي المسموح بالملمس:

enter image description here

لاحظ أن هناك حواف خشنة بالقرب من زوايا السطح. هذه أماكن كانت هناك نقاط قليلة جدًا لها TriScatteredInterp لتناسب بشكل كاف سطح محرف. ال Z القيم في هذه النقاط لذلك nan, ، مما أدى إلى عدم رسم نقطة السطح.

نصائح أخرى

إذا كان نسيجك بالفعل في الهندسة المناسبة ، فيمكنك فقط استخدام رسم خرائط للملمس القديم العادي.

رابط وثائق MathWorks لرسم خرائط الملمس:http://www.mathworks.com/access/helpdesk/help/techdoc/visualize/f0-18164.html#f0-9250

إعادة تحرير: تحديث الكود قليلاً:

جرب هذا النهج (لقد حصلت عليه للتو).

 a=imread('image.jpg');
 b=double(a)/255;

 [x,y,z]=peaks(30);  %# This is a surface maker that you do have
                     %# The matrix [x,y,z] is the representation of the surface.

 surf(x,y,z,b,'FaceColor','texturemap')  %# Try this with any image and you 
                                         %# should see a pretty explanatory 
                                         %# result. (Just copy and paste) ;)

لذلك [x ، y ، z] هو "السطح" أو بالأحرى مصفوفة تحتوي على عدد من النقاط في النموذج (x ، y ، z) الموجودة على السطح. لاحظ أن الصورة ممتدة لتناسب السطح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top