انجمن سایت کلیدستان



رسم شکل سه بعدیزمان کنونی: ۱۳۹۵/۰۹/۱۳، ۱۲:۲۷ ق.ظ
کاربران در حال بازدید این موضوع: 1 مهمان
نویسنده: arman
آخرین ارسال: admin
پاسخ 9
بازدید 4801

رتبه موضوع:
  • 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
رسم شکل سه بعدی

رسم شکل سه بعدی

#1
سلام خسته نباشید
میخواستم بدونم چجوری میشه 1 حجم توی متلب رسم کرد(مثلا یه مکعب به اضلاع a,b,c)
دستوری که میشه اینکارو انجام داد چیه؟؟؟؟
در ضمن آیا متلب توانایی المان بندی شکل رو داره؟؟؟؟
من میخوام یه شکل مثلا مکعب رسم کنم و اون رو به المانهای مکعبی ریزتری تقسیم کنم ولی نمیدونم چجوری Huh
اگه میشه کمکم کنید Sad
پاسخ

رسم شکل سه بعدی

#2
سلام.
کدهای متلب زیر رو در یک سایت پیدا کردم :

کد:
%# these don't all have to be the same
x = -8:2:8; y = -8:2:8; z = -8:2:8;

[X1 Y1 Z1] = meshgrid(x([1 end]),y,z);
X1 = permute(X1,[2 1 3]); Y1 = permute(Y1,[2 1 3]); Z1 = permute(Z1,[2 1 3]);
X1(end+1,:,:) = NaN; Y1(end+1,:,:) = NaN; Z1(end+1,:,:) = NaN;
[X2 Y2 Z2] = meshgrid(x,y([1 end]),z);
X2(end+1,:,:) = NaN; Y2(end+1,:,:) = NaN; Z2(end+1,:,:) = NaN;
[X3 Y3 Z3] = meshgrid(x,y,z([1 end]));
X3 = permute(X3,[3 1 2]); Y3 = permute(Y3,[3 1 2]); Z3 = permute(Z3,[3 1 2]);
X3(end+1,:,:) = NaN; Y3(end+1,:,:) = NaN; Z3(end+1,:,:) = NaN;

%#figure('Renderer','opengl')
h = line([X1(:);X2(:);X3(:)], [Y1(:);Y2(:);Y3(:)], [Z1(:);Z2(:);Z3(:)]);
set(h, 'Color',[0.5 0.5 1], 'LineWidth',1, 'LineStyle','-')

%#set(gca, 'Box','on', 'LineWidth',2, 'XTick',x, 'YTick',y, 'ZTick',z, ...
%#  'XLim',[x(1) x(end)], 'YLim',[y(1) y(end)], 'ZLim',[z(1) z(end)])
%#xlabel x, ylabel y, zlabel z
axis off
view(3), axis vis3d
camproj perspective, rotate3d on

با اجرای این کدهای متلب، پنجره ای به شکل زیر باز می شود :

   

با موس می توانید این مکعب را از زاویه های مختلف، به صورت سه بعدی، ببینید.

منبع کدها :

http://stackoverflow.com/questions/73091...-in-matlab
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط arman

رسم شکل سه بعدی

#3
اینم کدهای متلب لازم برای رسم تعدادی جسم به صورت سه بعدی (کپی شده از یک سایت دیگر) :

کد:
% 3D Graphics: Cube
% Dr. P.Venkataraman
format compact
set(gcf,'Menubar','none','Name','Cube', ...
    'NumberTitle','off','Position',[10,350,300,200], ...
    'Color',[0.3 0.1 0.3]);
% the cube
h(1) = axes('Position',[0.2 0.2 0.6 0.6]);
vert = [1 1 1; 1 2 1; 2 2 1; 2 1 1 ; ...
        1 1 2;1 2 2; 2 2 2;2 1 2];
fac = [1 2 3 4; ...
    2 6 7 3; ...
    4 3 7 8; ...
    1 5 8 4; ...
    1 2 6 5; ...
    5 6 7 8];

patch('Faces',fac,'Vertices',vert,'FaceColor','r');  % patch function
light('Position',[1 3 2]);
light('Position',[-3 -1 3]);
material shiny;
alpha('color');
alphamap('rampdown');
camlight(45,45);
lighting phong
view(30,30);

% cylinder
h(2) = axes('Position',[0.1 0.1 0.5 0.5]);

[Xs Ys Zs]=cylinder([1 0.5 1],20);
hs2 = surf(Xs, Ys, Zs);
set(hs2,'EdgeColor',[0.5 0.5 0.5], ...
    'FaceColor','interp', ...
    'FaceAlpha','interp');
alpha('color');
alphamap('rampdown');
alpha(0.3);
camlight right;
lighting phong
hidden off
axis equal
rotate(hs2,[1 0 0],45);  % cylinder is rotated

% sphere
h(3)= axes('Position',[0.17 0.17 0.4 0.4]);

[Xs Ys Zs]=sphere(30);
hs3 = surf(Xs, Ys, Zs);
set(hs3,'EdgeColor','none', ...
    'FaceColor','y', ...
    'FaceLighting','phong', ...
    'AmbientStrength',0.3, ...
    'DiffuseStrength',0.8, ...
    'SpecularStrength',0.9, ...
    'SpecularExponent',25, ...
    'BackFaceLighting','lit');
camlight left;
hidden off

set(h,'Visible','off')
axis square

نتیجه اجرای کد متلب بالا :

   

منبع کدها :

http://people.rit.edu/pnveme/pigf/ThreeD..._cube.html
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط arman

رسم شکل سه بعدی

#4
ممنون admin جان
کد اولی که برام فرستادین و مکعب رو امان بندی کرده چجوری میشه وجه های المانهارو رنگی کرد میخوام المانها توپر بشن اینجوری مدل سیمی نباشن.
یه سوال دیگه هم داشتم این که حالا که مکعب المان بندی شده چجوری میشه بعضی از المانهاشو به صورت نامنظم حذف کرد؟؟؟؟؟
پاسخ

رسم شکل سه بعدی

#5
خواهش می کنم دوست عزیز Flower

این شکل از اتصال تعدادی نقطه تشکیل شده و شما با حذف نقاط، می توانید شکل دلخواه خود را بسازید.
به مثال زیر توجه کنید (مثالی بر اساس همان روش) :

کدهای متلب :

کد:
clear all
close all
clc

X=[1 5 2];
Y=[9 2 3];
Z=[3 12 6];
h=line(X,Y,Z);
set(h,'Color',[0.5 0.5 1],'LineWidth',1,'LineStyle','-')

axis off
view(3)
axis vis3d
camproj perspective
rotate3d on

به دستور line دقت کنید، با آن خطوط مربوط به سه نقطه را تعریف کرده ایم.

تصویر حاصل (قابل چرخش به صورت سه بعدی) :

   

بنابراین باید قبل از این دستور، مختصات نقاطی که نمی خواهیم را حذف کنیم.

در مورد رنگی بودن وجه ها، راه حل این است که به جای استفاده از دستور line ، از دستور fill3 استفاده کنید. یک مثال براتون می نویسم :

کدهای متلب :

کد:
clear all
close all
clc
  
X=[1 2 4 3];
Y=[7 4 1 3];
Z=[5 2 3 7];
fill3(X,Y,Z,'b');
axis([0 5 1 8 0 8])
xlabel('x')
ylabel('y')
zlabel('z')

view(3)
axis vis3d
camproj perspective
rotate3d on

تصویر نتیجه شده (قابل چرخش به صورت سه بعدی) :

   

بنابراین با کشیدن وجه های مورد نظرتان با دستور fill3 ، می توانید شکل مورد نظر خود را به صورت سه بعدی رسم کنید (مختصات وجه ها را باید تعریف کرده و به دستور fill3 بدهید).
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

رسم شکل سه بعدی

#6
ممنون از اینهمه کمک که در این زمینه به من کردین ولی هنوز مشکلم حل نشده Undecided
راستش من کدی نوشتم که یه سازه مثلا یه مکعب المان بندی شده به مکعب های ریزتر رو بهینه سازی میکنه و در نهایت بعضی از المان ها رو حذف میکنه که البته المان ها خیلی ریز هستن شاید 2000 المان باشه...
برای این کار یه ماتریس سه بعدی ساخته میشه که هر درایه از اون دقیقا متناظر با یکی از المان هاست و درایه های این ماتریس یا 1 هستن یا 2 .که باید المان هایی که مقدار 1 دارن از شکل حذف بشن حالا زاقعا نمیدونم جچوری این کارو بکنم !!! Huh
پاسخ

رسم شکل سه بعدی

#7
خوب بنابراین ما یک ماتریس داریم که هر عنصر آن ماتریس، مشخص می کند که یک المان (مکعب کوچک) ساخته شود یا خیر. مثلا اگر تمامی عناصر ماتریس برابر 2 باشن، با کنار هم قرار گیری تمام المان ها (مکعب های کوچک)، یک مکعب بزرگ و کامل خواهیم داشت (این توضیح رو نوشتم که ببینید مسئله رو درست متوجه شدم یا نه).
یک راه حل این است که شما یک تابع بنویسید که مختصات مرکز یک مکعب و یک عدد به عنوان طول هر ضلع را دریافت کند، سپس بر اساس آن، 8 وجه را با استفاده از دستور fill3 رسم نماید (یعنی برای رسم هر وجه، باید مختصات 4 نقطه آن را تعیین و به دستور fill3 بدهد).
وقتی این تابع را داشته باشید، می توانید بر اساس آن ماتریس که گفتید، یک سری مختصات برای مرکز المان ها (مکعب های کوچک) تعیین کنید و به این تابع ساخته شده بدهید تا تمامی مکعب ها رسم شود. شما تنها برای عناصر با مقدار 2 ، مختصات می سازید (شرط می گذارید که اگر برابر 2 است، مختصات مرکز آن به تابع داده شود).
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ

رسم شکل سه بعدی

#8
بله منظور منو درست متوجه شدین...
خب اینکه میگید نابعی بنویسم که مختصات مرکز المان و طول ضلع المان رو بگیره و المان رو بسازه یعنی بر اساس مختصات نقطه مرکز و طول ضلع المان ، مختصات 8 نقطه المان رو محاسبه کنه و با دستور fill3 المان ها رو تک تک بسازه ؟؟؟؟؟؟
خب حرف شما کاملا متین ولی خب چجوری این المان هارو به درایه متناظرش توی ماتریس آدرس دهی کنم؟؟؟؟
آخه همونظور که میدونید هر درایه توی ماتریس با 1 شماره (که این شماره از درایه لایه اول از ماتریس سه بعدی با شماره " 1 "شروع میشه و در امتداد ستونی ادامه پیدامیکنه تا درایه nام ماتریس) مشخص میشه ولی این المان ها توی شکل شماره گذاری خاصی ندارن!!!
به نظرم راه حل خوبی دادید فقط اگه میشه توضیح بیشتر بدید ممنون میشم اگه مثالی هم بزنید دیگه عالیه
تا همینجا هم خیلی کمکاتون مفید بوده Flower
پاسخ

رسم شکل سه بعدی

#9
کدهای متلب زیر رو ببینید :

کد:
clear all
close all
clc

length=1;
number=3;
M_0_or_1(:,:,1)=[0 0 1;0 1 1;1 0 1];
M_0_or_1(:,:,2)=[0 0 1;0 1 1;1 0 1];
M_0_or_1(:,:,3)=[0 0 1;0 1 1;1 0 1];
X=[length/2:length:number*length-(length/2)]
Y=X;
Z=X;
for nn=1:number
    for mm=1:number
        for kk=1:number
            if (M_0_or_1(nn,mm,kk)==1)
                x=X(nn);
                y=Y(mm);
                z=Z(kk);
                % refrence to function (determine 8 points and plot cube)
            end
        end
    end
end

length برابر طول هر مکعب کوچک، number برابر تعداد مکعب های کوچک (منظور در طول هر جهت است، ما در این کد متلب، 27 تا مکعب کوچک تعیین کردیم بنابراین طول هر جهت مکعب بزرگ برابر 3 مکعب کوچک است) و M_0_or_1 ماتریسی است که به ما می گوید که اگر عنصر 0 بود، مکعب کوچک ساخته نشه و اگر برابر 1 بود، ساخته بشه (ترتیب مکعب های کوچک رو مشخص میکنه، 27 مکعب در کل داریم).
X و Y و Z هم بردارهایی برای تعریف مختصات مرکز مکعب های کوچک است.
به جای قسمت refrence to function که به صورت توضیح نوشتم، باید به تابعی که گفتم باید کدهاش رو بنویسید، ارجاع بدهید.
bookbook 
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
پاسخ
 سپاس شده توسط arman


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان

آخرین کلیدهای غیررایگان

شما هم می توانید کلیدهای غیررایگان منتشر کنید (بیشتر بدانید)