کلیدستان

نسخه‌ی کامل: حرکت رندم و تصادفی در ماتریس، در متلب
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام.سوالی از خدمتتون داشتم اینکه:
من میخوام یه برنامه بنویسم با متلب که یه ماتریس تولید کنه- نقطه ی وسط این ماتریس رو پیدا کنه -و از اون نقطه به شکل رندم و تصادفی بره به سمت  کناره های ماتریس به صورت غیر خطی و تصادفی( نه فقط یک بار چندین بار در جهت های مختلف این خطوط رسم بشن در واقع مثل یه نقطه ی نورانی که به چند جهت انتشار پیدا میکنه باشه )خیلی احتیاج دارم لطف می کنید اگر کمکم کنید
سلام.
با توجه به اهمیت این مدل مقداردهی ماتریس ها، من کل برنامه را نوشتم.
در نوشتن برنامه متلب مورد نظر، تعداد پرتوهایی که گفتید را با متغیر number_of_beams تعیین می کنید و ماتریس اولیه را هم به صورت ماتریسی با عناصر صفر تعریف می کنیم (با نام A و اندازه دلخواه) که بعدا ماتریسی با نام B از روی آن ساخته می شود که در آن، عناصر مربوط به پرتوها، دارای مقدار 1 می باشند. برای هر پرتو، ابتدا یک زاویه تصادفی بین 1 تا 360 درجه تولید می شود و سپس از مفهوم سینوس (sin) و کسینوس (cos) استفاده می کنیم تا متوجه شویم که کدام عناصر در آن پرتو قرار می گیرند.
کدهای متلب :

کد پی‌اچ‌پی:
clear all
close all
clc

A
=zeros(40,60);
number_of_beams=20;

A_size=size(A);
B=A;

for 
mm=1:number_of_beams
    x
=round(A_size(1)/2)
    
y=round(A_size(2)/2)
    
B(x,y)=1;

    
random_jahat_degree=randi(360)
    
random_jahat_radian=(random_jahat_degree/180)*pi
    jahat_sin
=sin(random_jahat_radian)
    
jahat_cos=cos(random_jahat_radian)

    
continue_while=1;
    while(
continue_while)
        
x=x+jahat_cos;
        
y=y+jahat_sin;
        
x_integer=round(x);
        
y_integer=round(y);
        if(
random_jahat_degree>=&& random_jahat_degree<=90)
            if(
x_integer<=A_size(1) && y_integer<=A_size(2))
                
B(x_integer,y_integer)=1;
            else
                
continue_while=0;
            
end
        
elseif(random_jahat_degree>=90 && random_jahat_degree<=180)
            if(
x_integer>=&& y_integer<=A_size(2))
                
B(x_integer,y_integer)=1;
            else
                
continue_while=0;
            
end
        
elseif(random_jahat_degree>=180 && random_jahat_degree<=270)
            if(
x_integer>=&& y_integer>=1)
                
B(x_integer,y_integer)=1;
            else
                
continue_while=0;
            
end
        
elseif(random_jahat_degree>=270 && random_jahat_degree<=360)
            if(
x_integer<=A_size(1) && y_integer>=1)
                
B(x_integer,y_integer)=1;
            else
                
continue_while=0;
            
end
        end
    end
end


imagesc
(B)
random_jahat_degree 

نتیجه دو بار اجرای کدهای متلب فوق :


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

کد پی‌اچ‌پی:
clear all
close all
clc

A
=zeros(40,60);
number_of_beams=5;

A_size=size(A);
B=A;

for 
mm=1:number_of_beams
    x
=round(A_size(1)/2)
    
y=round(A_size(2)/2)
    
B(x,y)=1;

    
random_jahat_degree=randi(360)
    
random_jahat_radian=(random_jahat_degree/180)*pi
    jahat_sin
=sin(random_jahat_radian)
    
jahat_cos=cos(random_jahat_radian)

    
continue_while=1;
    while(
continue_while)
        
x=x+jahat_cos;
        
y=y+jahat_sin;
        
x_integer=round(x);
        
y_integer=round(y);
        if(
random_jahat_degree>=&& random_jahat_degree<=90)
                
imagesc(B)
                
pause(0.01)
            if(
x_integer<=A_size(1) && y_integer<=A_size(2))
                
B(x_integer,y_integer)=1;
            else
                
continue_while=0;
            
end
        
elseif(random_jahat_degree>=90 && random_jahat_degree<=180)
            if(
x_integer>=&& y_integer<=A_size(2))
                
B(x_integer,y_integer)=1;
            else
                
continue_while=0;
            
end
        
elseif(random_jahat_degree>=180 && random_jahat_degree<=270)
            if(
x_integer>=&& y_integer>=1)
                
B(x_integer,y_integer)=1;
            else
                
continue_while=0;
            
end
        
elseif(random_jahat_degree>=270 && random_jahat_degree<=360)
            if(
x_integer<=A_size(1) && y_integer>=1)
                
B(x_integer,y_integer)=1;
            else
                
continue_while=0;
            
end
        end
    end
end


imagesc
(B)
random_jahat_degree 

حالا سوال اینه که اگر بازه رو به )400,600( تبدیل کنیم اون خط خیلی باریک میشه و هیچ شکستی توو فاصله ها وجود نداره یعنی به صورت یه خط راست دیده میشه .من میخوام توو این بازه هم همون زیکزاکی و شکست دیده بشه .خواهش میکنم اگر میتونید راهنماییم کنید .ممنونم  
چون تعداد نقاط ماتریس زیاد شده است، بنابراین وقتی آنها را در یک شکل نمایش می دهید، نقاط کوچکتر خواهند بود و در کل، نزدیک به هم بوده و بدون شکست به نظر می آیند (ولی شکست ها وجود دارد). شما با بزرگ کردن شکل (zoom) می توانید شکست ها را ببینید.
اگر قصد دارید که با این تعداد نقاط، خط هایی به همان ضخامت داشته باشید، باید روی کدهای برنامه کار کنید و آن را تغییر بدهید. این مورد به عهده خودتان است، فقط راهنمایی می کنم که در کدهای قبلی، در هر مرحله تنها یک نقطه را تغییر می دادیم، اما این بار می توانید چندین نقطه را تغییر بدهید (مثلا یک بلوک 9 تایی یا ... در اطراف نقطه تعیین شده در هر مرحله)، باید کدها را بنویسید و ببینید که برای آن تعداد مورد نظرتان، چه حالتی مناسب است.

خیلی سپاسگزارم .  
سلام - در مورد این برنامه سوالی خدمتتون داشتم .اگر بخوام این پرتوهایی که هر کدوم از وسط ماتریس انشعاب گرفتن طوری به دیواره ها برسن که  توو مسیرشون هر کدوم تقریبا به  سه یا چهار شاخه  تبدیل بشن  امکان پذیره ! یعنی مثلا پرتویی که به سمت پایین میاد بعد از طی مسافتی ( این مسافت در هر پرتو متغییر باشه ) باز بشه به دو یا سه یا چهار شاخه و مثلا یکی از اون ها زودتر به مقصد برسه ( این زود رسیدن رندوم باشه ) و در هر بار ران کردن فقط یک پرتو موفق بشه .
یه موضوع دیگه اینکه میشه طوری  برنامه  ی بعضی از این پرتوهایه فرعی رو نوشت که قایبلین برگشتن داشته باشه یعنی یه مسافتی رو بیان و بعد یا محو بشن یا برگردن؟؟؟؟/
خواهش میکنم اگر اطلاعاتی دارید راهنمایی م کنید این موضوع خیلی وقته به عنوان یه پروژه بهم داده شده که نتونستم درست تکمیلش کنم هنوز!
ممنونم از شما.   
سلام - یه برنامه ای رو لطف کردید نوشتید که ضمیمه ی فایل برنامه رو خدمتتون میفرستم...سوالم این هست که .اگر بخوام این پرتوهایی که هر کدوم از وسط ماتریس انشعاب گرفتن طوری به دیواره ها برسن که  توو مسیرشون هر کدوم تقریبا به  سه یا چهار شاخه  تبدیل بشن  امکان پذیره ! یعنی مثلا پرتویی که به سمت پایین میاد بعد از طی مسافتی ( این مسافت در هر پرتو متغییر باشه ) باز بشه به دو یا سه یا چهار شاخه و مثلا یکی از اون ها زودتر به مقصد برسه ( این زود رسیدن رندوم باشه ) و در هر بار ران کردن فقط یک پرتو موفق بشه  به دیواره برسه.
یه موضوع دیگه اینکه میشه طوری  برنامه  ی بعضی از این پرتوهایه فرعی رو نوشت که قابلیت  برگشتن داشته باشه یعنی یه مسافتی رو بیان و بعد یا محو بشن یا برگردن؟؟؟؟/
خواهش میکنم اگر اطلاعاتی دارید راهنمایی م کنید این موضوع خیلی وقته به عنوان یه پروژه بهم داده شده که نتونستم درست تکمیلش کنم هنوز!
اگر فکر می کنید وقت گیر هست یا فرصتش رو ندارید هزینه ای رو در نظر بگیرید که در ازایه این وقت گذاشتن خدمتتون پرداخت کنم - باور کنید اگر راه حلی پیدا میکردم برای حل برنامه مدام مزاحم شما نمیشدم....به بزرگواری تون ببخشید
ممنونم از شما.   
سلام - خواهش میکنم در رابطه با مشکل م اگر کسی وقت داره کمک کنه - خیلی نیازم فوری هست و خیلی وقته گیر کردم توو این زمینه .