مختصات صفحه فضایی و نحوه درجه بندی آن
در پست های قبلی، نحوه رسم چند ضلعی یا نقطه یا نمودار روی صفحه فضایی را تشریح کردیم، اما سوال اینجاست که مبداء این صفحات فضایی کجاست؟
جواب: مبداء صفحات فضایی در صورتی که ثابت 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
نمونه خروجی: