رسم صفحه در فضای سه بعدی با استفاده از فرمول دکارتی
اهمیت صفحه در فضاهای سه بعدی:
اگر شما سالیدورک کار کرده باشین، حتما متوجه شدین که مبنای رسم اشیای سه بعدی در سالیدورک، صفحه است، گاهی کل شی در یک صفحه قرار می گیرد، مثل یک نمودار فضایی و گاهی وقتها،یک شی نیاز داره که در روی چند صفحه قرار بگیرد، مثل یک حجم سه بعدی یا یک رویه(پوسته فضایی)، لذا ما لازم داریم که در مرحله اول فضای سه بعدی را خلق کنیم، به عبارتی برای ساختن هر شی لازم است که اول فضای فرضی آن را معین کنیم.
صفحه هم به مانند خط دارای چندین نوع نمایش میباشد، که دو نوع اصلی آن نمایش دکارتی( کارتزین، صریح و..) که به فرم
ax+by+cz+d=0 و نوع دوم به فرم پارامتریک(برداری و..) است، که به فرم زیر است:
دو روش بالا به راحتی به همدیگر قابل تبدیل هستند، که از این بخش می گذریم، براحتی می توانید با جستجوی «صفحه در فضا» توضیحات مفصلی دریافت کنید، اما هدف ما اینه که به یک روش ساده نمایش دکارتی صفحه را به نمایش پارامتریک آن تبدیل کنیم تا بتوانیم به سرعت صفحه مورد نظر خود را با کمترین زمان لازم، ایجاد کنیم و به اصطلاح خودمان! فضای لازم برای رسم نمودار فضایی را بسازیم.
در این تکنیک،
1- ضرایب فرمول دکارتی صفحه را پیدا می کنیم،
2-اگر ضریب z برابر صفر باشد، به سراغ ضریب yمیرویم، اگر ضریب آن صفر بود به سراغ ضریب x میرویم.
3-اولین متغیری که در پروسه 2 دارای ضریب غیر صفر بود را به عنوان تابع و بقیه متغیرها را به عنوان متغیر در نظر میگیریم، مثلا برای تابع داریم:
در مرحله بعد فرایند زیر را اجرا می کنیم:
سپس برای متغیرها بازه تعریف می کنیم، مثلا p=[-2:2], q=[-3:3] و سپسp را عمودی و q را افقی تکرار میکنیم که میتوان با استفاده از تابع meshgrid براحتی این کار را انجام داد، سپس از روی دو ماتریس ایجاد شده، میتوانیم y را بدست بیاوریم، حالا با استفاده از دستور surf در یک مرحله یا با استفاده از دستور plot3 در دو مرحله میتوانیم صفحه دلخواه خودمان را رسم کنیم.
نکته اول: مهم نیست ضریب متغیرها صفر باشد یا هر ضریب دیگر، فرایند بالا( دادن بازه برای متغیرها)، بی کم و کاست باید طی شود.
نکته دوم : برای تعیین یک صفحه و بدست آوردن ضرایب آن سه نقطه را روی فضای سه بعدی معین کنین و سپس بردارهای فضایی را بسازین و بعد با ضرب خارجی بردار نرمال آن را بدست بیاورین و بعد با ضرب داخلی بردار نرمال در یکی از بردارهای روی صفحه فرمول صفحه دلخواه خود را بدست بیاورین. برای کسب اطلاعات بیشتر می توانین به این صفحه مراجعه کنین.
حالا تمام توضیحات بالا به زبان برنامه نویسی در ادامه بازگو شده است، در کد زیر شما کافی است که فرمول دکارتی صفحه دلخواه خود را در سطر 20 کد وارد کنید.
کد اجرایی:
%% clear and close all child forms
delete(allchild(0));close all;
clear;
clc;
%% plot coordinates system in 3D area and labeling
plot3([-5;5],[-5;5]*0,[-5;5]*0,'k');hold on;
plot3([-5;5]*0,[-5;5],[-5;5]*0,'k');hold on
plot3([-5;5]*0,[-5;5]*0,[-5;5],'k');hold on
text([-6;6],[-6;6]*0,[-6;6]*0,{'-X','X'});hold on;
text([-6;6]*0,[-6;6],[-6;6]*0,{'-Y','Y'});hold on
text([-6;6]*0,[-6;6]*0,[-6;6],{'-Z','Z'});hold on
xlabel('X');
ylabel('Y');
zlabel('Z');
%% convert implicit plan formula as parametric form
syms x y z scalerVal;
plan='2*x+3*y+0*z+1';%% plan as inplicit form
pluIdex=strfind(plan,'+');%% find plus index in plan formula
scalerIndex=strsplit(plan,'+');
for s=1:length(scalerIndex)
scalerVal=str2num(scalerIndex{s});
if ~isempty(scalerVal)
break;
else
scalerVal=0;
end
end
%% extract z coff
zIndex=strfind(plan,'z');
if ~isempty(zIndex)
pluIZ=pluIdex(pluIdex<zIndex);
if ( pluIZ)
pluIZ=pluIZ(end);
cofZIndex=pluIZ+1:zIndex-2;
cofZ=str2double(plan(cofZIndex));
else
if (zIndex>1)
pluIZ=1;
cofZIndex=pluIZ:zIndex-2;
cofZ=str2double(plan(cofZIndex));
else
cofZ=1;
end
end
else
cofZ=0;
end
%% extract y coff
yIndex=strfind(plan,'y');
if ~isempty(yIndex)
pluIY=pluIdex(pluIdex<yIndex);
if ( pluIY)
pluIY=pluIY(end);
cofYIndex=pluIY+1:yIndex-2;
cofY=str2double(plan(cofYIndex));
else
if (yIndex>1)
pluIY=1;
cofYIndex=pluIY:yIndex-2;
cofY=str2double(plan(cofYIndex));
else
cofY=1;
end
end
else
cofY=0;
end
%% extract x coff
xIndex=strfind(plan,'x');
if ~isempty(xIndex)
pluIX=pluIdex(pluIdex<xIndex);
if ( pluIX)
pluIX=pluIX(end);
cofXIndex=pluIX+1:xIndex-2;
cofX=str2double(plan(cofXIndex));
else
if (xIndex>1)
pluIX=1;
cofXIndex=pluIX:xIndex-2;
cofX=str2double(plan(cofXIndex));
else
cofX=1;
end
end
else
cofX=0;
end
coff=[cofX,cofY,cofZ];
funcIndex=find(coff);funcIndex=funcIndex(end);
switch funcIndex
case 1
y=[-2:2];
z=[-2:2];
[y,z]=meshgrid(y,z);
x=-(coff(2)/coff(1))*y -(coff(3)/coff(1))*z-scalerVal/coff(1);
case 2
x=[-2:2];
z=[-2:2];
[x,z]=meshgrid(x,z);
y=(coff(1)/coff(2))*x +(coff(3)/coff(2))*z+scalerVal/coff(2);
case 3
x=[-2:2];
y=[-2:2];
[x,y]=meshgrid(x,y);
z=(coff(1)/coff(3))*x +(coff(2)/coff(3))*y+scalerVal/coff(3);
end
surf(x,y,z)
نمونه خروجی:
دانلود کد: