If you're seeing this message, it means we're having trouble loading external resources on our website.

Եթե գտնվում ես վեբ զտիչի հետևում, խնդրում ենք համոզվել, որ *.kastatic.org և *.kasandbox.org տիրույթները հանված են արգելափակումից։

Հիմնական նյութ

Պերլինի աղմուկ

Պատահական թվերի լավ գեներատորն այնպիսի թվեր է վերադարձնում, որոնք իրար հետ հարաբերություն չունեն և չեն հետևում որևէ օրինաչափության։ Ինչպես արդեն տեսանք, օրգանական, կյանքին մոտ պահվածք ծրագրավորելիս մի փոքր պատահականությունը բավական օգտակար է։ Այնուամենայնիվ, բնական է, որ պատահականությունը միակ առաջնորդող սկզբունքը չէ։
Գոյություն ունի ավելի բնական արդյունքների հանգեցնող ալգորիթմ, որը կոչվում է «Պերլինի աղմուկ»։ 1980-ակաների սկզբին՝ առաջին Tron կինոյի վրա աշխատելիս, Կեն Պերլինը զարգացրել է աղմուկի ֆունկցիան. այն օգտագործել է ընթացակարգային հյուսվածքներ ստեղծելու միջոցով համակարգչային էֆեկտներ ստանալու համար։ 1997 թ. Պերլինն իր տեխնիկական նվաճումների համար ակադեմիական մրցանակ է շահել։ Պերլինի աղմուկը կարող է բնական հատկություններ ունեցող բազմաթիվ էֆեկտներ ստեղծել, օրինակ՝ ամպեր, լանդշաֆտներ և ինչ-որ օրինաչափության հետևող հյուսվածք, օրինակ՝ մարմարաքար։
Պերլինի աղմուկն ավելի օրգանական տեսք ունի, քանի որ կեղծ պատահական թվերի բնական կարգավորվածություն ունեցող հաջորդականություն է ստեղծում։ Ստորև ներկայացված գրաֆիկում պատկերված է Պերլինի աղմուկի ֆունկցայի փոփոխությունը ժամանակի ընթացքում, որտեղ x առանցքը ժամանակն է։ Ուշադրություն դարձրու, որ կորը շատ սահուն է։
Կոդի բնույթի նկար
Պատկեր I,5. Աղմուկ
Դրան կարող ես հակադրել ստորև ներկայացված գրաֆիկը, որտեղ ներկայացված են ժամանակի ընթացքում ստացված լրիվ պատահական թվեր։
Կոդի բնույթի նկար
Պատկեր I,6. Պատահական
ProcessingJS-ում Պերլինի աղմուկի ալգորիթմը կիրառող պատրաստի ֆունկցիա կա՝ noise։ noise() ֆունկցիան ընդունում է մեկ, երկու կամ երեք արգումենտ, քանի որ աղմուկը հնարավոր է հաշվել միաչափ, երկչափ կամ եռաչափ տարածություններում։ Սկզբի համար դիտարկենք միաչափ աղմուկը։

Աղմուկի մանրամասներ

Ըստ աղմուկի հղման՝ աղմուկը բազմաթիվ «օկտավներում» է հաշվարկվում։ noiseDetail() ֆունկցիան կանչելիս կփոխվի և՛ օկտավների քանակը, և՛ դրանց համեմատական կարևորությունը։ Դա էլ իր հերթին կփոխի աղմուկի ֆունկցիայի պահվածքը։
Դիտարկիր ProcessingJS-ի պատուհանում պատահական x դիրքում շրջան նկարելը։
var x = random(0, width);
ellipse(x, 180, 16, 16);
Ենթադրենք՝ ուզում ենք x դիրքը ընտրել Պերլինի աղմուկով՝ ավելի «սահուն» դիրք ընտրելու համար։ Առաջին հայացքից կարծես պետք է ընդամենը random() ֆունկցիան փոխարինել noise()-ով, օրինակ՝
var x = noise(0, width);
ellipse(x, 180, 16, 16);
Չնայած նրան, որ սա հենց այն է, ինչ ցանկանում ենք անել՝ Պերլինի աղմուկով 0-ից լայնություն ընկած հատվածում x արժեք հաշվել, սա այդ մոտեցման ճիշտ կիրառումը չէ։ random() ֆունկցիայի արգումենտները վերադարձվող հնարավոր արժեքներից փոքրագույնն ու մեծագույնն են, սակայն noise()-ի դեպքում այդպես չէ։ noise() ֆունկցիան ակնկալում է, որ մեր փոխանցած արգումենտը «ժամանակի պահ» է, և միշտ 0-ից 1 արժեք է վերադարձնում։ Պերլինի աղմուկը կարելի է պատկերացնել որպես ժամանակի ընթացքում փոփոխվող արժեքների գծային հաջորդականություն։ Օրինակ՝ ստորև ներկայացված է փոխանցված ու վերադարձված արժեքների ցուցակ։
ԺամանակԱղմուկի արժեք
00,469
0,010,480
0,020,492
0,030,505
0,040,517
ProcessingJS-ում աղմուկի որևէ արժեք կիրառելու համար պետք է պարզապես noise() ֆունկցիային փոխանցել ժամանակի կոնկրետ պահը։ Օրինակ՝
var n = noise(0,03);
Ըստ ներկայացված աղյուսակի՝ այս դեպքում noise() ֆունկցիան 0,03 պահի համար կվերադարձնի 0,505 արժեքը։ Կարող ենք ժամանակի փոփոխական պահող ծրագիր գրել, որը draw() ֆունկցիայում անընդհատ այդ պահի աղմուկի արժեքն է պահանջում։
Վերոնշյալ կոդի արդյունքում անընդհատ նույն արժեքը կարտածվի։ Սրա պատճառն այն է, որ ժամանակի նույն պահի համար ենք noise() ֆունկցիայի արժեքը պահանջում։
Այնուամենայնիվ, ժամանակի փոփոխական t-ն մեծացնելու դեպքում այլ արդյունք կստանանք։
Աղմուկի սահունությունը կախված է t-ի աճման արագությունից։ Եթե այն արագ ենք մեծացնում, ապա շատ առաջ ենք «թռչում», ինչի արդյունքում ստացված արժեքներն ավելի պատահական կլինեն։
Ժամանակի ընթացքում աղմուկ
Պատկեր 1,7
Եթե վերոնշյալ կոդը մի քանի անգամ կատարես՝ ամեն անգամ փոխելով t-ի մեծացման գործակիցը (օրինակ՝ 0,01; 0,02; 0,05; 0,1; 0,0001), տարբեր արդյունքներ կստանաս։

Աղմուկի արտապատկերում

Հիմա արդեն պատրաստ ենք պատասխանելու այն հարցին, թե ինչ կարելի է անել աղմուկի արժեքով։ 0-ից 1 միջակայքում ընկած արժեք ստանալուց հետո կարող ենք այդ թիվը ցանկացած միջակայքում արտապատկերել։
Իհարկե, կարող ենք պարզապես միջակայքի մեծագույն արժեքով բազմապատկել, բայց սա ProcessingJS-ի map() ֆունկցիան ներկայացնելու լավ հնարավորություն է. այն հետագայում էլ մեզ շատ պետք կգա։ map() ֆունկցիան հինգ արգումենտ է ընդունում։ Առաջին արգումենտը այն թիվն է, որն ուզում ենք արտապատկերել. մեր դեպքում դա n-ն է։ Հետո պետք է դրան փոխանցել այդ արժեքի միջակայքը՝ փոքրագույն և մեծագույն արժեքները, և ցանկալի միջակայքը։
Կոդի բնույթի նկար
Պատկեր I,8
Մեր դեպքում աղմուկի միջակայքը 0-ից 1-ն է, սակայն ցանկանում ենք 0-ից այս պահի լայնություն ընկած լայնություն ունեցող ուղղանկյուն նկարել։
Նույն տրամաբանությունը կարող ենք պատահական քայլողի վրա կիրառել և դրա x և y արժեքները որոշել Պերլինի աղմուկով։
Ուշադրություն դարձրու, որ այս օրինակի համար մեզ երկու նոր փոփոխական էր պետք՝ tx և ty, որովհետև մեզ պետք էր ժամանակի երկու փոփոխական հաշվի առնել. մեկը Walker օբյեկտի x դիրքի համար, մյուսը՝ y։
Սակայն այս փոփոխականները մի փոքր տարօրինակ են. ինչո՞ւ է tx-ը 0-ից սկսվում, իսկ ty-ը՝ 10000-ից։ Չնայած նրան, որ այս երկու թվերը պատահական ընտրություններ են, պետք է հաշվի առնել, որ նպատակադրված ենք փոփոխականներին տարբեր սկզբնական արժեք տվել։ Պատճառն այն է, որ աղմուկի ֆունկցիան կանխորոշված է. կոնկրետ t պահի համար միշտ նույն արժեքն է վերադարձնում։ Այսինքն, եթե x-ի և y-ի արժեքները նույն t պահի աղմուկի ֆունկցիայի արժեքով ստանայինք, x-ն ու y-ը միշտ իրար հավասար կլինեին, և Walker օբյեկտը միայն անկյունագծով կշարժվեր։ Դրա փոխարեն մենք պարզապես աղմուկի տարածության երկու տարբեր հատվածներ ենք կիրառում, որպեսզի x-ն ու y-ն իրարից անկախ լինեն. x-ի համար սկսում ենք 0-ից, իսկ y-ի համար՝ 10000-ից։
Կոդի բնույթի նկար
Պատկեր I,9
Իրականում ժամանակի հասկացությունն այնքան էլ էական չէ։ Աղմուկի ֆունկցիայի աշխատանքը պատկերացնելու համար լավ փոխաբերություն է, սակայն իրականում մեր ունեցածն ավելի շատ տարածություն է, քան ժամանակ։ Վերոբերյալ գրաֆիկում ներկայացված է միաչափ տարածությունում աղմուկի արժեքների գծային հաջորդականություն, և կարող ենք ցանկացած x դիրքի համար արժեքը տեսնել։ Օրինակներում հաճախ xoff կոչվող փոփոխական կտեսնեք՝ t-ի փոխարեն, այն տրամաբանությամբ, որ փոփոխվում է ոչ թե ժամանակը, այլ գրաֆիկով տեղաշարժվում ենք x չափով, ինչպես նշված է դիագրամում։
Հաջորդ մարտահրավերի ընթացքում փորձելու ես Walker-ի հետ աղմուկը մի փոքր այլ կերպ կիրառել։ Քեզ ուրախ ժամանց։

«Բնական նմանակիչներ» դասընթացը ստեղծվել է Դանիել Շիֆմանի «Կոդի բնույթը» գրքի հիման վրա և կիրառվում է ըստ Creative Commons Attribution-NonCommercial 3,0 Unported License-ի։

Ուզո՞ւմ ես միանալ խոսակցությանը։

Առայժմ հրապարակումներ չկան։
Անգլերեն հասկանո՞ւմ ես: Սեղմիր այստեղ և ավելի շատ քննարկումներ կգտնես «Քան» ակադեմիայի անգլերեն կայքում: