در پست های قبلی، نحوه رسم چند ضلعی یا نقطه یا نمودار روی صفحه فضایی را تشریح کردیم، اما سوال اینجاست که مبداء این صفحات فضایی کجاست؟
جواب: مبداء صفحات فضایی در صورتی که ثابت d در معادله صفحه ax+by+cz+d=0 برابر صفر باشد، همان (0،0،0)
خواهد بود، اما در صورتی این ثابت برابر صفر نباشد مبداء آن برابر با( 0,0,-d)
خواهد بود. یعنی اگر بخواهیم نمودار یا نقطه ای را رسم کنیم، نسبت به مبداء صفحه فضایی رسم میشود.
سوال بعدی که ممکن است پیش بیاید این است که، اگر بخواهیم نقاطی را در زوایای مختلف این صفحه فضایی رسم کنیم چکار باید بکنیم؟
جواب این است که همانطور که می توانیم یک چند ضلعی را در روی صفحه فضایی رسم کنیم، می توانیم زوایای آن را نیز مشخص کنیم.
برای این کار کافی است مختصات مورد نظر خودمان را تعیین کنیم، مثلا p1=cos(0) , q1=sin(0) و تابع ft این نقطه را محاسبه کنیم( که در کد زیر روش آن نشان داده شده است)، حالا اگر هدف ما این باشد که در زاویه صفر درجه صفحه عمود بر صفحه مرجع را پیدا کرده و شکل دلخواه خود را روی آن رسم کنیم، در آنصورت کافی است که با بدست اوردن دو نقطه و بردار نرمال صفحه مرجع، که نقطه اول آن مبداء صفحه فضایی و نقطه دوم مقدار p, q و بردار نرمال صفحه مرجع صفحه عمود را در زوایه مد نظر رسم کنیم و سپس شکل دلخواه خود را روی صفحه عمود در زاویه مدنظر رسم کنیم.
این تکنیک به ما اجازه می ده که تسلط کاملی به فضای سه بعدی داشته باشیم، بدون اینکه نیازی باشد از دستگاههای مختصات کروی و... استفاده کنیم.
البته نحوه بدست آوردن صفحات عمود در پستهای بعدی به شکل مفصل تشریح خواهد شد، در این پست صرفا هدف ما تعیین زوایای مرجع(0، 90، 180 و270) بود.
کد شناسای زوایای مرجع در صفحه فضایی
%% display angle point on plan
p1=cos(0);
q1=sin(0);
ft1=-(coff(1)/coff(3))*p1 -(coff(2)/coff(3))*q1-((scalerVal)/coff(3)) ;
text(p1 ,q1 ,ft1,'0 deg'); hold on
plot3(p1 ,q1 ,ft1,'*r'); hold on
p2=cos(pi/2);
q2=sin(pi/2);
ft2=-(coff(1)/coff(3))*p2 -(coff(2)/coff(3))*q2-((scalerVal)/coff(3)) ;
text(p2 ,q2 ,ft2,' 90 deg'); hold on
plot3(p2 ,q2,ft2,'*r'); hold on
p3=cos(pi);
q3=sin(pi);
ft3=-(coff(1)/coff(3))*p3 -(coff(2)/coff(3))*q3-((scalerVal)/coff(3)) ;
text(p3 ,q3 ,ft3,' 180 deg'); hold on
plot3(p3 ,q3 ,ft3,'*r'); hold on
p4=cos(3*pi/2);
q4=sin(3*pi/2);
ft4=-(coff(1)/coff(3))*p4 -(coff(2)/coff(3))*q4-((scalerVal)/coff(3)) ;
text(p4 ,q4 ,ft4,' 270 deg'); hold on
plot3(p4 ,q4 ,ft4,'*r'); hold on
کد بالا بخشی از کد اصلی میباشد، شما در کد زیر میتوانید با تغییر تابع صفحه که به فرم plan='1x+1y+0z+3'
در سطر 30 آورده شده موقعیت زوایای مرجع را روی آن مشاهده کنید.
کد اجرایی:
%%%%%%%%%%%%%%%%%%%%%%%%%%-----------software details-----------%%%%%%%%%%%%%%%%%%%%%%
%devloped in Iran(ardebil) %
%Copyright (C) 2022(1401) by moussa hasanzadeh as the head devloper %%
%All rights reserved. %
%programed in mathlab 2016
%gmail:mo30no@gmail.com
%phone 09147082079
%% 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 t;
plan='1x+1y+0z+3';%% plan as inplicit form '2x+3y+1z+3'= pishfarz
% plan='-6x+5y-3z+0';%% plan perpendicular to '2x+3y+1z+0' pass from (-1 0 2) and (1 0 -2)
x=[-3:3];
y=[-3:3];
z=[-3:3];
%function to draw on the plan
side=50;
t=linspace(0,2*pi,side+1);
p=cos(t) ;%x coordinate
q=sin(t) ;% y coordinate
pluIdex1=strfind(plan,'+');%% find plus index in plan formula
minIdex2=strfind(plan,'-');
pluIdex=sort([pluIdex1,minIdex2]);
xIndex=strfind(plan, 'x' );
if isempty(xIndex)
xIndex=1;
end
yIndex=strfind(plan, 'y' );
if isempty(yIndex)
yIndex=2;
end
zIndex=strfind(plan, 'z' );
if isempty(zIndex)
zIndex=3;
end
[~,indexVar]=sort([xIndex,yIndex,zIndex]);
cellCof=strsplit(plan,{'x','y','z','*'});
try
cofX=str2double(cellCof{indexVar==1});
catch
cofX=0;
end
try
cofY=str2double(cellCof{indexVar==2});
catch
cofY=0;
end
try
cofZ=str2double(cellCof{indexVar==3});
catch
cofZ=0;
end
scalerPlusIndex=strsplit(plan,'+');
isit=0;
%% extracting positive scaler
for s=1:length(scalerPlusIndex)
scalerVal=str2num(scalerPlusIndex{s});
if ~isempty(scalerVal)
isit=1;
break;
else
scalerVal=0;
end
end
%% extracting negative scaler
if isit==0
scalerMinusIndex=strsplit(plan,'-');
for s=1:length(scalerMinusIndex)
scalerVal=str2num(scalerMinusIndex{s});
if ~isempty(scalerVal)
scalerVal=-scalerVal;
break;
else
scalerVal=0;
end
end
end
coff=[cofX,cofY,cofZ];
funcIndex=find(coff);funcIndex=funcIndex(end);
switch funcIndex
case 1
[y,z]=meshgrid(y,z);
x=-(coff(2)/coff(1))*y -(coff(3)/coff(1))*z-scalerVal/coff(1);
ft=-(coff(2)/coff(1))*p -(coff(3)/coff(1))*q-scalerVal/coff(1);
plot3(ft,p,q);hold on
%% display angle point on plan p1=cos(0);
p1=cos(0);
q1=sin(0);
ft1=-(coff(2)/coff(1))*p1 -(coff(3)/coff(1))*q1-scalerVal/coff(1);
text(ft1,p1 ,q1 ,'0 deg'); hold on
plot3(ft1,p1 ,q1 ,'*r'); hold on
p2=cos(pi/2);
q2=sin(pi/2);
ft2=-(coff(2)/coff(1))*p2 -(coff(3)/coff(1))*q2-scalerVal/coff(1);
text(ft2,p2 ,q2 ,' 90 deg'); hold on
plot3(ft2,p2 ,q2,'*r'); hold on
p3=cos(pi);
q3=sin(pi);
ft3=-(coff(2)/coff(1))*p3 -(coff(3)/coff(1))*q3-scalerVal/coff(1) ;
text(ft3,p3 ,q3 ,' 180 deg'); hold on
plot3(ft3,p3 ,q3 ,'*r'); hold on
p4=cos(3*pi/2);
q4=sin(3*pi/2);
ft4=-(coff(2)/coff(1))*p4 -(coff(3)/coff(1))*q4-scalerVal/coff(1);
text(ft4,p4 ,q4 ,' 270 deg'); hold on
plot3(ft4,p4 ,q4 ,'*r'); hold on
case 2
[x,z]=meshgrid(x,z);
y=-(coff(1)/coff(2))*x -(coff(3)/coff(2))*z-scalerVal/coff(2);
ft=-(coff(1)/coff(2))*p -(coff(3)/coff(2))*q-scalerVal/coff(2);
plot3(p,ft,q);hold on
%% display angle point on plan p1=cos(0);
p1=cos(0);
q1=sin(0);
ft1=-(coff(1)/coff(2))*p1 -(coff(3)/coff(2))*q1-scalerVal/coff(2) ;
text(p1 ,ft1,q1 ,'0 deg'); hold on
plot3(p1 ,ft1,q1 ,'*r'); hold on
p2=cos(pi/2);
q2=sin(pi/2);
ft2=-(coff(1)/coff(2))*p2 -(coff(3)/coff(2))*q2-scalerVal/coff(2);
text(p2 ,ft2,q2 ,' 90 deg'); hold on
plot3(p2 ,ft2,q2,'*r'); hold on
p3=cos(pi);
q3=sin(pi);
ft3=-(coff(1)/coff(2))*p3 -(coff(3)/coff(2))*q3-scalerVal/coff(2) ;
text(p3 ,ft3,q3 ,' 180 deg'); hold on
plot3(p3 ,ft3,q3 ,'*r'); hold on
p4=cos(3*pi/2);
q4=sin(3*pi/2);
ft4=-(coff(1)/coff(2))*p4 -(coff(3)/coff(2))*q4-scalerVal/coff(2) ;
text(p4 ,ft4,q4 ,' 270 deg'); hold on
plot3(p4 ,ft4,q4 ,'*r'); hold on
case 3
[x,y]=meshgrid(x,y);
z=-(coff(1)/coff(3))*x -(coff(2)/coff(3))*y-scalerVal/coff(3);
ft=-(coff(1)/coff(3))*p -(coff(2)/coff(3))*q-((scalerVal)/coff(3)) ;
plot3(p ,q ,ft,'k-'); hold on
%% display angle point on plan
p1=cos(0);
q1=sin(0);
ft1=-(coff(1)/coff(3))*p1 -(coff(2)/coff(3))*q1-((scalerVal)/coff(3)) ;
text(p1 ,q1 ,ft1,'0 deg'); hold on
plot3(p1 ,q1 ,ft1,'*r'); hold on
p2=cos(pi/2);
q2=sin(pi/2);
ft2=-(coff(1)/coff(3))*p2 -(coff(2)/coff(3))*q2-((scalerVal)/coff(3)) ;
text(p2 ,q2 ,ft2,' 90 deg'); hold on
plot3(p2 ,q2,ft2,'*r'); hold on
p3=cos(pi);
q3=sin(pi);
ft3=-(coff(1)/coff(3))*p3 -(coff(2)/coff(3))*q3-((scalerVal)/coff(3)) ;
text(p3 ,q3 ,ft3,' 180 deg'); hold on
plot3(p3 ,q3 ,ft3,'*r'); hold on
p4=cos(3*pi/2);
q4=sin(3*pi/2);
ft4=-(coff(1)/coff(3))*p4 -(coff(2)/coff(3))*q4-((scalerVal)/coff(3)) ;
text(p4 ,q4 ,ft4,' 270 deg'); hold on
plot3(p4 ,q4 ,ft4,'*r'); hold on
end
surf(x ,y ,z ,'FaceColor','g');hold on
%%
axis equal
disp('');
%%%%%%%%%%%%%%%%%%%%%%%%%%-----------software details-----------%%%%%%%%%%%%%%%%%%%%%%
%devloped in Iran(ardebil) %
%Copyright (C) 2022(1401) by moussa hasanzadeh as the head devloper %%
%All rights reserved. %
%programed in mathlab 2016
%gmail:mo30no@gmail.com
%phone 09147082079
نمونه خروجی:
دانلود کد: