پنجشنبه, ۱۶ تیر ۱۴۰۱، ۰۱:۴۹ ب.ظ
رشد دادن یک چند ضلعی در یک مسیر سینوسی روی صفحه 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
نمونه خروجی:

دانلود کد
۰۱/۰۴/۱۶