پیداکردن نقاط تصادفی در یک شکل نامنظم

melimo

عضو جدید
سلام
من یه شکل نامنظم دارم که میخوام تعدادی نقاط تصادفی درداخل آن پیداکنم که البته فرمول مرز این شکل رو دارم که به این صورته:
x=pcos(t
y=psin(t
که خود t هم یه فرمول برای محاسبه برحسب یه متغیر دیگه داره
حالا این نقاط رو چه جوری باید ازتوی این شکل دربیارم؟بیشترین و کمترین x وy روهم گرفتم و بینشونرو عدد تصادفی انتخاب کردم ولی چون شکلم منظم نیست بعضی از نقاط بیرون میفتن
خواهشا کمکم کنید
ممنون
 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
سلام
من یه شکل نامنظم دارم که میخوام تعدادی نقاط تصادفی درداخل آن پیداکنم که البته فرمول مرز این شکل رو دارم که به این صورته:
x=pcos(t
y=psin(t
که خود t هم یه فرمول برای محاسبه برحسب یه متغیر دیگه داره
حالا این نقاط رو چه جوری باید ازتوی این شکل دربیارم؟بیشترین و کمترین x وy روهم گرفتم و بینشونرو عدد تصادفی انتخاب کردم ولی چون شکلم منظم نیست بعضی از نقاط بیرون میفتن
خواهشا کمکم کنید
ممنون

از دستور rand استفاده کن؛ با توجه به اینکه مجموع نماهای دوم تصاویر هر نقطه،
در میاد، کافیه که یه نگاشت خطی از
به
در نظر بگیری. نتیجه اینطور می شه:
کد:
…
xr = p*rand*cos(t);
yr = p*rand*sin(t);
…
[code]
[/LEFT]
 
آخرین ویرایش:

melimo

عضو جدید
از دستور rand استفاده کن؛ با توجه به اینکه مجموع نماهای دوم تصاویر هر نقطه،
در میاد، کافیه که یه نگاشت خطی از
به
در نظر بگیری. نتیجه اینطور می شه:
کد:
…
xr = p*rand*cos(t);
yr = p*rand*sin(t);
…
[code]
[/LEFT]
[/QUOTE]
خیلی ممنون از پاسختون
فقط یه چیزی! اولا خیلی بالای دیپلم جواب داده بودید :))  مثلا من نفهمیدم منظورتون از مجموع نماهای دوم تصاویر هر نقطه p^2 درمیاد یعنی چی؟ درثانی من این کاری که شما گفتید روکردم یعنی اول  به همون تعداد نقطه ای که میخواستم tهای تصادفی انتخاب کردم و بعد توی این tها p ها رو هم حساب کردم بعدش هم این کدی که شما نوشته بودید رو برای xوy نوشتم ولی توی بعضی وقتا بعضی نقاط بیرون میفتاد. کجا رو اشتباه کردم؟؟؟؟
 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
خیلی ممنون از پاسختون
فقط یه چیزی! اولا خیلی بالای دیپلم جواب داده بودید :)) مثلا من نفهمیدم منظورتون از مجموع نماهای دوم تصاویر هر نقطه p^2 درمیاد یعنی چی؟ درثانی من این کاری که شما گفتید روکردم یعنی اول به همون تعداد نقطه ای که میخواستم tهای تصادفی انتخاب کردم و بعد توی این tها p ها رو هم حساب کردم بعدش هم این کدی که شما نوشته بودید رو برای xوy نوشتم ولی توی بعضی وقتا بعضی نقاط بیرون میفتاد. کجا رو اشتباه کردم؟؟؟؟
برنامه رو بذار اینجا ببینم چیکار کردی
 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
این هم یه نمونه
کد:
t=linspace(0,2*pi,200);
p=1-sin(7*t).^2+sin(t/2)+5*sin(4*t);
x=p.*cos(t); y=p.*sin(t);
r=p.*rand(size(p));
xr=r.*cos(t); yr=r.*sin(t);
plot(x,y,xr,yr,'.')
axis('square')

این هم خروجیش​




راستی اون اصطلاح هم در حد دوم دبیرستان بود؛ کتاب جبر و هندسه
 

melimo

عضو جدید
این هم یه نمونه
کد:
t=linspace(0,2*pi,200);
p=1-sin(7*t).^2+sin(t/2)+5*sin(4*t);
x=p.*cos(t); y=p.*sin(t);
r=p.*rand(size(p));
xr=r.*cos(t); yr=r.*sin(t);
plot(x,y,xr,yr,'.')
axis('square')

این هم خروجیش​




راستی اون اصطلاح هم در حد دوم دبیرستان بود؛ کتاب جبر و هندسه

دستتون درد نکنه مهندس من کدتون رو زدم و اجرا گرفتم خیلی هم خوب و دقیق بود فقط اینکه توی مسئله من تعداد نقاط مرزی و درونی یکی نیست مثلا شما اینجا 200 گرفتین ولی من nb تعداد نقط مرزی و niبرای درونی ها دارم برای همین برنامه زیر رو نوشتم که اینم جواب میده فقط توی بعضی نقاطش plot که میکنم بیرون ازشکل نمیفته ولی احساس میکنم دقیقا روی خط مرز میفته که البته نباید اینطور باشه میشه شما هم چکش کنید؟ ممنون :redface:

ti = 360/nb
t = 0:ti:360

for
i=1:nb
p(i) = (cos(3*t(i))+sqrt(2-(sin(3*t(i)))^2))^(1/3);
end
for
i=1:nb
xb(i) = p(i)*cos(t(i
yb(i) = p(i)*sin(t(i

end
a1 = 0;
b1 = 360;
t1=a1+(b1-a1)*rand(1,ni);
for i=1:ni
p1(i) = (cos(3*t1(i))+sqrt(2-(sin(3*t1(i)))^2))^(1/3);
end
for
i=1:ni
a11=0;
b11=p1(i);
p2(i)=a11+(b11-a11)*rand;
xi(i) = p2(i)*cos(t1(i));
yi(i) = p2(i)*sin(t1(i));
end

plot(xi,yi,'.r',xb,yb,'.b')
 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز

دستتون درد نکنه مهندس من کدتون رو زدم و اجرا گرفتم خیلی هم خوب و دقیق بود فقط اینکه توی مسئله من تعداد نقاط مرزی و درونی یکی نیست مثلا شما اینجا 200 گرفتین ولی من nb تعداد نقط مرزی و niبرای درونی ها دارم برای همین برنامه زیر رو نوشتم که اینم جواب میده فقط توی بعضی نقاطش plot که میکنم بیرون ازشکل نمیفته ولی احساس میکنم دقیقا روی خط مرز میفته که البته نباید اینطور باشه میشه شما هم چکش کنید؟ ممنون :redface:

ti = 360/nb
t = 0:ti:360

for
i=1:nb
p(i) = (cos(3*t(i))+sqrt(2-(sin(3*t(i)))^2))^(1/3);
end
for
i=1:nb
xb(i) = p(i)*cos(t(i
yb(i) = p(i)*sin(t(i

end
a1 = 0;
b1 = 360;
t1=a1+(b1-a1)*rand(1,ni);
for i=1:ni
p1(i) = (cos(3*t1(i))+sqrt(2-(sin(3*t1(i)))^2))^(1/3);
end
for
i=1:ni
a11=0;
b11=p1(i);
p2(i)=a11+(b11-a11)*rand;
xi(i) = p2(i)*cos(t1(i));
yi(i) = p2(i)*sin(t1(i));
end

plot(xi,yi,'.r',xb,yb,'.b')
از اون نظری که شما سؤال کردید، فکر نکنم مشکلی وجود داشته باشه. اما از نظرات دیگه، برنامه شما چند تا ایراد داره

  1. تعداد نقاطی که انتخاب کردی با تعداد پارامترها (همون t) یه دونه اختلاف داره.
  2. زاویه ها رو به درجه انتخاب کردی، اما از تابعهای مثلثاتی که ورودی رو به رادیان می گیرن استفاده کردید، واسه همین نقاط متوالی مرزی رو با پاره خط به هم وصل نکردید تا بیننده متوجه مشکل برنامه نشه؛ یا باید هر دو رو به درجه بگیرید یا هر دو رو به رادیان.
  3. منطق برنامه به نظر درست نمیاد (این رو الآن وقت ندارم توضیح بدم چون زیاد زمان می بره؛ اگه به نظر خودت درسته بهش فکر نکن).
  4. برنامه تون مثل برنامه های متلب نیست، چون از امکانات ابتدایی متلب استفاده نکردید؛ من قبلاً اسم "فرترن وار" رو برای این نوع برنامه ها به کار بردم (این مورد آخر فقط ایراد برنامه نویسی هست و می تونید بهش فکر نکنید. لینک برای مطالعه بیشتر در این زمینه).
 

melimo

عضو جدید
از اون نظری که شما سؤال کردید، فکر نکنم مشکلی وجود داشته باشه. اما از نظرات دیگه، برنامه شما چند تا ایراد داره

  1. تعداد نقاطی که انتخاب کردی با تعداد پارامترها (همون t) یه دونه اختلاف داره.
  2. زاویه ها رو به درجه انتخاب کردی، اما از تابعهای مثلثاتی که ورودی رو به رادیان می گیرن استفاده کردید، واسه همین نقاط متوالی مرزی رو با پاره خط به هم وصل نکردید تا بیننده متوجه مشکل برنامه نشه؛ یا باید هر دو رو به درجه بگیرید یا هر دو رو به رادیان.
  3. منطق برنامه به نظر درست نمیاد (این رو الآن وقت ندارم توضیح بدم چون زیاد زمان می بره؛ اگه به نظر خودت درسته بهش فکر نکن).
  4. برنامه تون مثل برنامه های متلب نیست، چون از امکانات ابتدایی متلب استفاده نکردید؛ من قبلاً اسم "فرترن وار" رو برای این نوع برنامه ها به کار بردم (این مورد آخر فقط ایراد برنامه نویسی هست و می تونید بهش فکر نکنید. لینک برای مطالعه بیشتر در این زمینه).

آقا دست شما واقعا درد نکنه که اینقدر پیگیرید.خیلی خیلی ممنون.
من اون درجه و رادیان رو که گفتید رو حل کردم یعنی sind وcosd نوشتم که آره دیگه درست شد چون قبلا به قول شما نمیشد این نقاط رو بهم وصل کرد یه شکل خط خطی میشد ولی الان دیگه میشه بعدشم اون tرو که گفتید اومدم خط دوم برنامه رو نوشتم t=ti:ti:360 که اینجوری تعداد پارامترها و نقاط مرزی م درست شد فقط الان هنوز دوتا مشکل دارم یکی اینکه شکلم بسته نمیشه یعنی دوتا از نقطه ها که فکر کنم نقطه اولی و آخری باشن بهم وصل نمیشن و یه گوشه ازشکلم سرش بازه دومی هم اینکه: الان که نقاط رو بهم وصل کردم کاملا مشخصه که بعضی از نقاط روی مرز میفتن که این خیلی بده البته مثلا یک یا بعضی اوقات فقط دونقطه رو مرز میفتن .
من از برنامه شما خیل خوشم اومد روش هم کار کردم که برای مرزی ها و درونی ها جداش کنم چون توی برنامه شما اصلا درونی ها روی مرزی ها نمیفتن ولی نتونستم .حالا میشه یا بگید برنامه خودمو چیکار کنم که این دوتا مشکلش حل شه یا برنامه خودتون رو چیکارش باید کرد که برای مسئله منم جواب بده؟ چون مسئله من براین پایه است که تعداد نقط درونی و مرزی رو بگیره و ادامه ماجرا....
بازم خیلی خیلی ممنون که جواب میدید .مرسی
 

meytim

متخصص محاسبات عددی و MATLAB
کاربر ممتاز
آقا دست شما واقعا درد نکنه که اینقدر پیگیرید.خیلی خیلی ممنون.
من اون درجه و رادیان رو که گفتید رو حل کردم یعنی sind وcosd نوشتم که آره دیگه درست شد چون قبلا به قول شما نمیشد این نقاط رو بهم وصل کرد یه شکل خط خطی میشد ولی الان دیگه میشه بعدشم اون tرو که گفتید اومدم خط دوم برنامه رو نوشتم t=ti:ti:360 که اینجوری تعداد پارامترها و نقاط مرزی م درست شد فقط الان هنوز دوتا مشکل دارم یکی اینکه شکلم بسته نمیشه یعنی دوتا از نقطه ها که فکر کنم نقطه اولی و آخری باشن بهم وصل نمیشن و یه گوشه ازشکلم سرش بازه دومی هم اینکه: الان که نقاط رو بهم وصل کردم کاملا مشخصه که بعضی از نقاط روی مرز میفتن که این خیلی بده البته مثلا یک یا بعضی اوقات فقط دونقطه رو مرز میفتن .
من از برنامه شما خیل خوشم اومد روش هم کار کردم که برای مرزی ها و درونی ها جداش کنم چون توی برنامه شما اصلا درونی ها روی مرزی ها نمیفتن ولی نتونستم .حالا میشه یا بگید برنامه خودمو چیکار کنم که این دوتا مشکلش حل شه یا برنامه خودتون رو چیکارش باید کرد که برای مسئله منم جواب بده؟ چون مسئله من براین پایه است که تعداد نقط درونی و مرزی رو بگیره و ادامه ماجرا....
بازم خیلی خیلی ممنون که جواب میدید .مرسی

یک حلقه گذاشتم که چک کنه هر کدوم از زوایای بختی بین کدوم دو زاویه مرزی قرار داره و بیشینه نرم برای اون زاویه رو حساب کنه، طوری که از مرز خارج نشه. به بیان دیگه برای هر زاویه بختی، محل برخورد پرتو گذرنده از مبدأ مختصات با اون زاویه و مرز رو پیدا کرده و طول اون نقطه تا مبدأ مختصات رو حساب کردم. بقیه اش دیگه واضحه. خیالت هم راحت دیگه غیر ممکنه که نقطه ای از این نقاط بختی از مرز شکل بیرون بیفته.
کد:
nb=15
ni=10+9+2012

t = linspace(0,2*pi,nb);
p = (cos(3*t)+sqrt(2-(sin(3*t)).^2)).^(1/3);
xb = p.*cos(t); yb = p.*sin(t);

tr=2*pi*rand(1,ni); pmax=zeros(1,ni);
for k=1:ni
    tall=[t,tr(k)]; tall=sort(tall);
    indk=find(tall==tr(k)); t_temp=tall(indk-1:2:indk+1);
    i1=find(t==t_temp(1)); i2=find(t==t_temp(2)); ind_temp=[i1,i2];
    x_temp=xb(ind_temp); y_temp=yb(ind_temp);
    pb_temp=polyfit(x_temp,y_temp,1); 
    A=[pb_temp(1),-1;tan(tr(k)),-1]; b=[pb_temp(2);0]; xy_intersect=A\b;
    pmax(k)=norm(xy_intersect);
end

pr=pmax.*rand(1,ni);
xi = pr.*cos(tr);
yi = pr.*sin(tr);
plot(xi,yi,'.r',xb,yb,'b')


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

melimo

عضو جدید
یک حلقه گذاشتم که چک کنه هر کدوم از زوایای بختی بین کدوم دو زاویه مرزی قرار داره و بیشینه نرم برای اون زاویه رو حساب کنه، طوری که از مرز خارج نشه. به بیان دیگه برای هر زاویه بختی، محل برخورد پرتو گذرنده از مبدأ مختصات با اون زاویه و مرز رو پیدا کرده و طول اون نقطه تا مبدأ مختصات رو حساب کردم. بقیه اش دیگه واضحه. خیالت هم راحت دیگه غیر ممکنه که نقطه ای از این نقاط بختی از مرز شکل بیرون بیفته.
کد:
nb=15
ni=10+9+2012

t = linspace(0,2*pi,nb);
p = (cos(3*t)+sqrt(2-(sin(3*t)).^2)).^(1/3);
xb = p.*cos(t); yb = p.*sin(t);

tr=2*pi*rand(1,ni); pmax=zeros(1,ni);
for k=1:ni
    tall=[t,tr(k)]; tall=sort(tall);
    indk=find(tall==tr(k)); t_temp=tall(indk-1:2:indk+1);
    i1=find(t==t_temp(1)); i2=find(t==t_temp(2)); ind_temp=[i1,i2];
    x_temp=xb(ind_temp); y_temp=yb(ind_temp);
    pb_temp=polyfit(x_temp,y_temp,1); 
    A=[pb_temp(1),-1;tan(tr(k)),-1]; b=[pb_temp(2);0]; xy_intersect=A\b;
    pmax(k)=norm(xy_intersect);
end

pr=pmax.*rand(1,ni);
xi = pr.*cos(tr);
yi = pr.*sin(tr);
plot(xi,yi,'.r',xb,yb,'b')


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

آقای مهندس خیلی خیلی ممنون
دستتون درد نکنه
 

Similar threads

بالا