ارسالها: 9
موضوعها: 3
تاریخ عضویت: مرداد ۱۳۹۲
اعتبار:
0
سپاس ها 6
سپاس شده 0 بار در 0 ارسال
حالت من: هیچ کدام
سلام خسته نباشید
میخواستم بدونم چجوری میشه 1 حجم توی متلب رسم کرد(مثلا یه مکعب به اضلاع a,b,c)
دستوری که میشه اینکارو انجام داد چیه؟؟؟؟
در ضمن آیا متلب توانایی المان بندی شکل رو داره؟؟؟؟
من میخوام یه شکل مثلا مکعب رسم کنم و اون رو به المانهای مکعبی ریزتری تقسیم کنم ولی نمیدونم چجوری
اگه میشه کمکم کنید
سپاس شده توسط | |
|
ارسالها: 2,933
موضوعها: 191
تاریخ عضویت: تير ۱۳۹۱
اعتبار:
126
سپاس ها 1688
سپاس شده 3507 بار در 2023 ارسال
حالت من:
۱۳۹۲/۰۵/۰۸, ۱۲:۴۱ ق.ظ
(آخرین تغییر در ارسال: ۱۳۹۲/۰۵/۰۸, ۱۲:۵۱ ق.ظ توسط admin.)
سلام.
کدهای متلب زیر رو در یک سایت پیدا کردم :
کد: %# 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
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
ارسالها: 2,933
موضوعها: 191
تاریخ عضویت: تير ۱۳۹۱
اعتبار:
126
سپاس ها 1688
سپاس شده 3507 بار در 2023 ارسال
حالت من:
۱۳۹۲/۰۵/۰۸, ۱۲:۴۹ ق.ظ
(آخرین تغییر در ارسال: ۱۳۹۲/۰۵/۰۸, ۱۲:۵۱ ق.ظ توسط admin.)
اینم کدهای متلب لازم برای رسم تعدادی جسم به صورت سه بعدی (کپی شده از یک سایت دیگر) :
کد: % 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
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
ارسالها: 9
موضوعها: 3
تاریخ عضویت: مرداد ۱۳۹۲
اعتبار:
0
سپاس ها 6
سپاس شده 0 بار در 0 ارسال
حالت من: هیچ کدام
ممنون admin جان
کد اولی که برام فرستادین و مکعب رو امان بندی کرده چجوری میشه وجه های المانهارو رنگی کرد میخوام المانها توپر بشن اینجوری مدل سیمی نباشن.
یه سوال دیگه هم داشتم این که حالا که مکعب المان بندی شده چجوری میشه بعضی از المانهاشو به صورت نامنظم حذف کرد؟؟؟؟؟
سپاس شده توسط | |
|
ارسالها: 2,933
موضوعها: 191
تاریخ عضویت: تير ۱۳۹۱
اعتبار:
126
سپاس ها 1688
سپاس شده 3507 بار در 2023 ارسال
حالت من:
۱۳۹۲/۰۵/۰۸, ۱۲:۵۶ ب.ظ
(آخرین تغییر در ارسال: ۱۳۹۲/۰۵/۰۸, ۱۲:۵۸ ب.ظ توسط admin.)
خواهش می کنم دوست عزیز
این شکل از اتصال تعدادی نقطه تشکیل شده و شما با حذف نقاط، می توانید شکل دلخواه خود را بسازید.
به مثال زیر توجه کنید (مثالی بر اساس همان روش) :
کدهای متلب :
کد: 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 بدهید).
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
سپاس شده توسط | |
|
ارسالها: 9
موضوعها: 3
تاریخ عضویت: مرداد ۱۳۹۲
اعتبار:
0
سپاس ها 6
سپاس شده 0 بار در 0 ارسال
حالت من: هیچ کدام
ممنون از اینهمه کمک که در این زمینه به من کردین ولی هنوز مشکلم حل نشده
راستش من کدی نوشتم که یه سازه مثلا یه مکعب المان بندی شده به مکعب های ریزتر رو بهینه سازی میکنه و در نهایت بعضی از المان ها رو حذف میکنه که البته المان ها خیلی ریز هستن شاید 2000 المان باشه...
برای این کار یه ماتریس سه بعدی ساخته میشه که هر درایه از اون دقیقا متناظر با یکی از المان هاست و درایه های این ماتریس یا 1 هستن یا 2 .که باید المان هایی که مقدار 1 دارن از شکل حذف بشن حالا زاقعا نمیدونم جچوری این کارو بکنم !!!
سپاس شده توسط | |
|
ارسالها: 2,933
موضوعها: 191
تاریخ عضویت: تير ۱۳۹۱
اعتبار:
126
سپاس ها 1688
سپاس شده 3507 بار در 2023 ارسال
حالت من:
خوب بنابراین ما یک ماتریس داریم که هر عنصر آن ماتریس، مشخص می کند که یک المان (مکعب کوچک) ساخته شود یا خیر. مثلا اگر تمامی عناصر ماتریس برابر 2 باشن، با کنار هم قرار گیری تمام المان ها (مکعب های کوچک)، یک مکعب بزرگ و کامل خواهیم داشت (این توضیح رو نوشتم که ببینید مسئله رو درست متوجه شدم یا نه).
یک راه حل این است که شما یک تابع بنویسید که مختصات مرکز یک مکعب و یک عدد به عنوان طول هر ضلع را دریافت کند، سپس بر اساس آن، 8 وجه را با استفاده از دستور fill3 رسم نماید (یعنی برای رسم هر وجه، باید مختصات 4 نقطه آن را تعیین و به دستور fill3 بدهد).
وقتی این تابع را داشته باشید، می توانید بر اساس آن ماتریس که گفتید، یک سری مختصات برای مرکز المان ها (مکعب های کوچک) تعیین کنید و به این تابع ساخته شده بدهید تا تمامی مکعب ها رسم شود. شما تنها برای عناصر با مقدار 2 ، مختصات می سازید (شرط می گذارید که اگر برابر 2 است، مختصات مرکز آن به تابع داده شود).
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
سپاس شده توسط | |
|
ارسالها: 9
موضوعها: 3
تاریخ عضویت: مرداد ۱۳۹۲
اعتبار:
0
سپاس ها 6
سپاس شده 0 بار در 0 ارسال
حالت من: هیچ کدام
بله منظور منو درست متوجه شدین...
خب اینکه میگید نابعی بنویسم که مختصات مرکز المان و طول ضلع المان رو بگیره و المان رو بسازه یعنی بر اساس مختصات نقطه مرکز و طول ضلع المان ، مختصات 8 نقطه المان رو محاسبه کنه و با دستور fill3 المان ها رو تک تک بسازه ؟؟؟؟؟؟
خب حرف شما کاملا متین ولی خب چجوری این المان هارو به درایه متناظرش توی ماتریس آدرس دهی کنم؟؟؟؟
آخه همونظور که میدونید هر درایه توی ماتریس با 1 شماره (که این شماره از درایه لایه اول از ماتریس سه بعدی با شماره " 1 "شروع میشه و در امتداد ستونی ادامه پیدامیکنه تا درایه nام ماتریس) مشخص میشه ولی این المان ها توی شکل شماره گذاری خاصی ندارن!!!
به نظرم راه حل خوبی دادید فقط اگه میشه توضیح بیشتر بدید ممنون میشم اگه مثالی هم بزنید دیگه عالیه
تا همینجا هم خیلی کمکاتون مفید بوده
سپاس شده توسط | |
|
ارسالها: 2,933
موضوعها: 191
تاریخ عضویت: تير ۱۳۹۱
اعتبار:
126
سپاس ها 1688
سپاس شده 3507 بار در 2023 ارسال
حالت من:
۱۳۹۲/۰۵/۱۰, ۰۶:۵۴ ق.ظ
(آخرین تغییر در ارسال: ۱۳۹۲/۰۵/۱۰, ۰۶:۵۸ ق.ظ توسط admin.)
کدهای متلب زیر رو ببینید :
کد: 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 که به صورت توضیح نوشتم، باید به تابعی که گفتم باید کدهاش رو بنویسید، ارجاع بدهید.
لطفا برای درج کد، از دکمه مخصوص درج کد در ادیتور انجمن استفاده کنید.
در مورد برنامه نویسی، مدیران تنها راهنمایی می کنند و نوشتن برنامه نهایی، به عهده کاربران می باشد (اینجا محلی برای یادگیری است، نه سفارش کدنویسی).
کاربران باید ابتدا خود به خطایابی برنامه بپردازند، نه اینکه به محض دیدن خطا، کدها را در انجمن، copy و paste کرده و از مدیران انتظار بررسی داشته باشند.
|