شما اینجا هستید

0.6 -- نویز پرلین (یک مسیر هموارتر)

پیغام خطا

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls در book_prev() (خط 775 در /home/molavy/public_html/modules/book/book.module).

یک تولید کننده عدد تصادفی خوب اعدادی را ایجاد می کند که وابستگی به هم ندارند و از هیچ الگویی تبعیت نمی کنند.

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

یک الگوریتم به نام نویز پرلین که به نام سازنده آن کن پرلین نامگذاری شده، این مفهوم را در نظر گرفته است. پرلین تایع نویز را در هنگام کار روی در اصل هنگام کار روی فیلم ترون (Tron) در دهه 1980 توسعه داد. او آنرا برای ایجاد یک بافت رویه ای پویا برای افکت های ساخته شده توسط رایانه توسعه داد. نویز در سال ۱۹۹۷ پرلین را برنده یک جایزه علمی برای این کار کرد. نویز پرلین می تواند برای تولید افکت های مختلفی با کیفیتی طبیعی استفاده شود. از آن جمله می توان به تولید ابرها، عوارض زمین، سطوح بافت دار مانند سطوح سنگی نام برد.

نویز پرلین ظاهری طبیعی دارد به دلیل اینکه یک سلسله از اعداد شبه تصادفی هموار و مرتب تولید می کند. نمودار اول نویز برلین را در زمان نشان می دهد که محور x زمان است. به هموار بودن منحنی دقت کنید. نمودار دوم اعداد تصادفی خالص را در گذر زمان نشان می دهد. 

تصویر ۰.۵ نویز 

تصویر ۰.۶ تصادفی

زبان برنامه نویسی Processing یک پیاده سازی درونی از الگوریتم نویز پرلین دارد: تابع noise.

تابع noise تعداد یک یا دو یا سه آرگومان می گیرد، به دلیل اینکه نویز می تواند در یک، دو یا سه بعد ایجاد شود. اجازه بدهید با نویز در یک بعد شروع کنیم.

اطلاعاتی درباره نویز

در مرجع processing برای noise نوشته شده است که بدست آوردن نویز با محاسبه چند باره سطح هاست.

فراخوانی تابع noiseDetail با تغییر عدد سطح ها و رابطه اصلی آن با دیگری به نوبه خود رفتار تابع نویز را تغییر می دهد.

سخنرانی خود کن پرلین به شما اجازه می دهد در مورد نحوه کار نویز پرلین بهتر یاد بگیرید

رسم یک دایره در صفحه processing روی محور x ها در نظر بگیرید.

float x = random(0,width);
ellipse(x,180,16,16);
حال، به جای موقعیت تصادفی رو محور X،ما نیاز به نویز پرلین رو محور X به صورتی که نرم تر باشد داریم. ممکن است کنید خوب به جای random میگذاریم noise، مثلا:
float x = noise(0,width);

اگرچه به صورت مفهومی این دقیقا همان کاری است که ما انجام می دهیم.--محاسبه مقدار Xبین محدوده صفر تا عرض صفحه به طبق نویز پرلین-- این روشی که فکر کردید، پیاده سازی صحیحی نیست. اگرچه آرگومان های تابع random یک مقدار حداقل و حداکثر را می گیرد.تابع noise اینگونه کار نمی کند. در عوض محدوده خروجی ثابت است – آن همیشه یک مقدار بین صفر تا یک بر می گرداند. ما می توانیم مقدار خروجی را با تابع map به محدوده مورد نظر برگردانیم . اما در ابتدا بگذارید ببینیم noise از ما چه آرگومان هایی را می خواهد. ما می توانیم به نویز پرلین یک بعدی به چشم رشته خطی از مقادیر در زمان نگاه کنیم . برای مثال:

زمان

مقدار نویز

0

0.365

1

0.363

2

0.363

3

0.364

4

0.366

حال، برای دسترسی به یک مقدار نویز خاص در processing، ما باید یک لحظه از زمان را به تابع noise بدهیم. برای مثال:

 float n = noise(3); 
بر طبق جدول فوق noise(3)I مقدار 0.364را برمی گرداند (برای زمان برابر ۳). ما می توانیم با استفاده از مقادیر برای زمان و در خواست noise برای ترسیم ادامه دار، کار را بهتر کنیم.
float t = 3;
void draw() {
  float n = noise(t);
  println(n);
} 

در کد بالا نتایج در زمان یکسان بارها و بارها چاپ شده است. این به دلیل این است که ما زمان ۳ را بارها و بارها از noise خواسته ایم اتفاق می افتدو اگر ما مقدار زمان را (متغییر t) را افزایش دهیم ما مقدار متفاوتی می گیریم.

float t = 0;
void draw() {
  float n = noise(t);
  println(n);
  t += 0.01;
} 

اینکه چقدر سریع ما مقدار t را افزایش می دهیم مقدار نرمی نویز را تحت تاثیر قرار می دهد. اگر ما یک پرش بزرگ در زمان انجام دهیم،فاصله ای در مقادیر ایجاد می شود و به تصادفی بودن شبیه تر می شود.

تصویر ۷-۰

چند بار کد را اجرا کنید، مقدار t را به ۰.۰۱ ، ۰.۰۲ ، ۰.۰۵ ، ۰.۱ ، ۰.۰۰۰۱ تغییر دهید. می بینید که نتایج متفاوت است.

 

دیدگاه جدیدی بگذارید