شبیه‌سازی شبکه‌های بی سیم و کامپیوتری
شبیه سازی تخصصی شبکه‌های بی سیم و کامپیوتری مقاطع کارشناسی تا دکترا
  • شبیه سازی تخصصی شبکه‌های بی سیم و کامپیوتری مقاطع کارشناسی تا دکترا

مشخصات بلاگ
شبیه‌سازی شبکه‌های بی سیم و کامپیوتری

امکان سفارش، شبیه سازی مقاله و پایان نامه وجود دارد،
مطالب، با ذکر منبع قابل انتشار در سایت ها و وبلاگ ها و.. می باشد.
جهت دریافت مشاوره رایگان تماس بگیرید:

شماره تماس: 09147082079-0098
آیدی تلگرامی:https://t.me/MuosSA_NbO
جی میل :mo30no@gmail.com

تمامی کدهای این وبلاگ در حال حاضر به زبان متلب می باشد

«آنچه می‌دانیم ناچیز و آنچه نمی‌دانیم عظیم و وسیع است»
$$پیر سیمون لاپلاس$$

سه شنبه, ۲۱ تیر ۱۴۰۱، ۰۸:۳۹ ب.ظ

حرکت انمیشن وار چند ضلعی روی یک صفحه دلخواه.

در این پست یک صفحه که فرمول آن در سطر 30 قرار دارد(و شما می توانید فرمول آن را تغییر دهید، فقط ضریب z غیر صفر باشد)، و یک چند ضلعی (دایره) روی آن به شکل تصادفی گردش می‌کند، به عبارتی هدف ما این بود که بتوانیم چند ضلعی یا هر تابع دیگری را روی صفحه به سمت راست یا چپ نسبی یا بالا و پایین نسبی صفحه گردش بدهیم.

 

کد اجرایی:

%%%%%%%%%%%%%%%%%%%%%%%%%%-----------software details-----------%%%%%%%%%%%%%%%%%%%%%%

%devloped in Iran(ardebil)                                       %
%Copyright (C) 2017(1396) 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='20*x+3*y+2*z+1';%% plan as inplicit form
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

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,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)

    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)
    case 3

        [x,y]=meshgrid(x,y);
        z=(coff(1)/coff(3))*x +(coff(2)/coff(3))*y+scalerVal/coff(3);
        for s=1:50
            p=cos(t)+cos(rand*2-1)  ;%x coordinate
            q=sin(t)+sin(rand*2-1) ;% y coordinate
            ft=(coff(1)/coff(3))*p +(coff(2)/coff(3))*q+scalerVal/coff(3);
            surf(x,y,z,'FaceColor','g')



            h=plot3(p ,q ,ft,'k');
            pause(.5)
            delete(h);
        end
end








%%%%%%%%%%%%%%%%%%%%%%%%%%-----------software details-----------%%%%%%%%%%%%%%%%%%%%%%

%devloped in Iran(ardebil)                                       %
%Copyright (C) 2017(1396) by moussa hasanzadeh as the head devloper %%
%All rights reserved.                                             %
%programed in mathlab 2016
%gmail:mo30no@gmail.com
%phone 09147082079

نمونه ویدئوی خروجی:

 

دانلود کد 

 

۰ نظر موافقین ۰ مخالفین ۰ ۲۱ تیر ۰۱ ، ۲۰:۳۹
موسی حسن زاده

در این پست برخلاف پست های قبلی که رسم نمودار نیاز به کمی مهارت داشت، می توانید بدون نیاز به تلاش بیشتر، با تغییر p به عنوان مختصه نسبی x و q به عنوان مختصه نسبی y، نمودار یا چند ضلعی دلخواه خود را روی صفحه دلخواه( با تغییر فرمول صفحه) رسم کنید.

البته توصیه می شود که کد را آنالیز کنید و هر جا مشکل داشتید می توانید در بخش نظرات پرسش خود را مطرح کنید،

تذکر به نظران خصوصی پاسخ داده نمی شود.

کد اجرایی:

%%%%%%%%%%%%%%%%%%%%%%%%%%-----------software details-----------%%%%%%%%%%%%%%%%%%%%%%

%devloped in Iran(ardebil)                                       %
%Copyright (C) 2017(1396) 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='0*x+3*y+2*z+3';%% plan as inplicit form

%function to draw on the plan
t=-3.14:.2:3.14;
p=sin(t);%x coordinate
q=cos(t);% y coordinate

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);
        t=[-2:2];
        
        
    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);

        ft=(coff(1)/coff(3))*p +(coff(2)/coff(3))*q+scalerVal/coff(3);
end


 
surf(x,y,z)
plot3(p,q,ft)


 

نمونه خروجی:

 

 

دانلود کد:

۰ نظر موافقین ۰ مخالفین ۰ ۲۱ تیر ۰۱ ، ۰۹:۴۹
موسی حسن زاده

اهمیت صفحه در فضاهای سه بعدی:

اگر شما سالیدورک کار کرده باشین، حتما متوجه شدین که مبنای رسم اشیای سه بعدی در سالیدورک، صفحه است، گاهی کل شی در یک صفحه قرار می گیرد، مثل یک نمودار فضایی و گاهی وقت‌ها،یک شی نیاز داره که در روی چند صفحه قرار بگیرد، مثل یک حجم سه بعدی یا یک رویه(پوسته فضایی)، لذا ما لازم داریم که در مرحله اول فضای سه بعدی را خلق کنیم، به عبارتی برای ساختن هر شی لازم است که اول فضای فرضی آن را معین کنیم.

صفحه هم به مانند خط دارای چندین نوع نمایش می‌باشد، که دو نوع اصلی آن نمایش دکارتی( کارتزین، صریح و..) که به فرم

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)


نمونه خروجی:

دانلود کد:

 

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ تیر ۰۱ ، ۱۹:۵۸
موسی حسن زاده
دوشنبه, ۲۰ تیر ۱۴۰۱، ۱۲:۲۱ ب.ظ

نحوه رسم یک نمودار در روی یک صفحه دلخواه

در این پست، کدی را قرار دادیم که در آن یک  نمودار دلخواه را در روی یک صفحه چاپ کنید، البته این یک کد مقدماتی می باشد و در پست های بعدی آموزش ایجاد یک صفحه دلخواه و چاپ یک نمودار دلخواه روی این صفحه را مفصل شرح خواهیم داد و در نهایت رشد چند ضلعلی دلخواه در راستای نمودار، حول مختصات دلخواه را عملیاتی خواهیم کرد،

این پست در حقیقت مقدمه ای هست برای توزیع نودها در فضاهای سه بعدی در درون اشیای سه بعدی .

شما می توانید تابع z را بر مبنای پارامتر t تغییر دهید مثلا z=t^2 +1 و... تا چاپ آن را روی صفحه فرضی را مشاهده کنین.

 کد  اجرایی: 

 

%% clear commands
 
delete(allchild(0));close all;
clear;
clc;


plot3([-10;10],[-10;10]*0,[-10;10]*0,'k');hold on;
plot3([-10;10]*0,[-10;10],[-10;10]*0,'k');hold on
plot3([-10;10]*0,[-10;10]*0,[-10;10],'k');hold on
text([-10;10],[-10;10]*0,[-10;10]*0,'X');hold on;
text([-10;10]*0,[-10;10],[-10;10]*0,'Y');hold on
text([-10;10]*0,[-10;10]*0,[-10;10],'Z');hold on
xlabel('X');
ylabel('Y');
zlabel('Z');
t=[-3.14:.2:3.14];
x=t;
y=-t+2;
z=sin(t );
plot3(t,-t+2,t.^2);hold on

[u,v]=meshgrid(-2:2,-2:2);
surf(u,-u+2,v)


 نمونه خروجی:

دانلود کد:

 

 

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ تیر ۰۱ ، ۱۲:۲۱
موسی حسن زاده