پنجشنبه, ۱۶ تیر ۱۴۰۱، ۰۱:۴۹ ب.ظ
رشد دادن یک چند ضلعی در یک مسیر سینوسی روی صفحه xy
در این پست نحوه ایجاد یک شلنگ سینوسی از طریق رشد دادن چند ضلعی، در راستای یک مسیر سینوسی روی صفحه xy آورده شده است،
توضیح مختصر: به ازای زوایای مثبت، چرخش در خلاف عقربه های ساعت و به ازای زوایای منفی، چرخش در جهت عقربه های ساعت صورت گرفته است. از دو تابع rotateParameter برای چرخش و angl= anglOnePolToTwoPol(angl,type) برای تغییر زوایای دوقطبی به تک قطبی استفاده شده، مثلا 270 را به -90 درجه تبدیل می کنه( در حالی که نوع 2 باشه) و در نوع 1( رادیان)، مثلا (pi/2) *3 را به -pi/2 تبدیل می کنه.
کد اجرایی:
%% clear commands function xx delete(allchild(0));close all; clear; clc; %% path commands file=matlab.desktop.editor.getActive; try fileDetail=dir(file.Filename); folderName=fileDetail.folder; catch index=strfind( file.Filename,'\'); folderName=file.Filename(1:index(end)-1); end paths=genpath(folderName); addpath(paths); cd(folderName); side=20; t=linspace(0,2*pi ,side+1); side1=50; t1=linspace(0, 2*pi ,side1+1); ph=0; path.x= t1 ; path.y= sin(t1+ph) *5 ; plot([t1;path.x ] ,[path.y*0 ;path.y] ,'r' );hold on plot3([-7:7]',[-7:7]'*0,[-7:7]'*0);hold on plot3([-7:7]'*0,[-7:7]' ,[-7:7]'*0 );hold on plot3([-7:7]'*0,[-7:7]'*0,[-7:7]' );hold on text(7,0,0,'x');hold on text(0,7,0,'y');hold on text(0,0,7,'z');hold on % [path.x,path.y]=divider(path.x,path.y,2); % [~,t1]=divider(t1,t1,2); fig.x= cos(t )/2 ; fig.y= 0*(0:side); fig.z= sin(t )/2 ; fig1=fig; % plot(t1,tan(t1)) for in=1:length(path.x)-1 plot3(fig.x+path.x(in),fig.y+path.y(in) ,fig.z ,'b-');hold on if (anglOnePolToTwoPol(t1(in),1)>0) [ fig.x, fig.y, fig.z]=rotateParameter(fig1,[0,0,1], -rad2deg(t1(in)) ); elseif (anglOnePolToTwoPol(t1(in),1)<0) [ fig.x, fig.y, fig.z]=rotateParameter(fig1,[0,0,1], rad2deg(t1(in)) ); end surf([fig.x+path.x(in);fig.x+path.x(in+1) ],[fig.y+path.y(in);fig.y+path.y(in+1) ],[fig.z;fig.z],'facecolor','k');hold on; alpha(0.2) view(3); axis('equal') end end function [ newx, newy, newz]=rotateParameter(matrixObj,azel,alpha) u = azel(:)/norm(azel); alph = alpha*pi/180; cosa = cos(alph); sina = sin(alph); vera = 1 - cosa; x = u(1); y = u(2); z = u(3); rot = [cosa+x^2*vera x*y*vera-z*sina x*z*vera+y*sina; ... x*y*vera+z*sina cosa+y^2*vera y*z*vera-x*sina; ... x*z*vera-y*sina y*z*vera+x*sina cosa+z^2*vera]'; x = matrixObj.x; y = matrixObj.y; z = matrixObj.z; [m,n] = size(z); if numel(x) < m*n [x,y] = meshgrid(x,y); end [m,n] = size(x); newxyz = [x(:) , y(:) , z(:) ]; newxyz = newxyz*rot; newx = reshape(newxyz(:,1),m,n); newy = reshape(newxyz(:,2),m,n); newz = reshape(newxyz(:,3),m,n); end function angl= anglOnePolToTwoPol(angl,type) if nargin==1 type=1; end switch type case 1% radian type angl=mod(angl,2*pi); miInd=angl<0; angl(miInd)=(2*pi)+angl(miInd); case 2 angl=mod(angl,360); miInd=angl<0; angl(miInd)=(360)+angl(miInd); end end
نمونه خروجی:
دانلود کد
۰۱/۰۴/۱۶