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

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

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

Ալիքներ

Եթե այս ամենը քեզ դուր է գալիս, բայց իրականում ուզում ես էկրանի վրա ալիք նկարել, ապա եկել է դրա ժամանակը։ Համարյա պատրաստ ենք դա անել։ Սինուս ֆունկցիայի միջոցով շրջանը վերև-ներքև տատանելը համարժեք է ալիքի միայն մեկ մասնիկի x առանցքը դիտարկելուն։ Մի փոքր աշխատանքի ու for ցիկլի արդյունքում կարող ենք իրար կողք շարել այդպիսի շրջաններ։
Այս ալիքը կարելի է կիրառել որևէ փափուկ մակերես, օրինակ՝ ջուր, էակի մարմին կամ վերջույթներ ստեղծելու համար։
Այստեղ էլ ենք առնչվելու լայնույթի՝ օրինաչափության երկարության, և պարբերության հետ։ Այնուամենայնիվ, քանի որ մի ամբողջական ալիք ենք քննարկում, պարբերությունը կորոշենք ոչ թե ըստ անցած ժամանակի, այլ ըստ ալիքի մի ամբողջ ցիկլի լայնության՝ պիքսելներով հաշված։ Այս դեպքում էլ ալիքը կարող ենք հաշվել ճշգրիտ պարբերության կամ անկյունային արագության միջոցով։
Ընտրենք ավելի պարզ մոտեցումը՝ անկյունային արագությունը։ Գիտենք, որ սկզբում պետք է ունենանք անկյուն, անկյունային արագություն և լայնույթ.
var angle = 0;
var angleVel = 0{,}2;
var amplitude = 100;
Դրանից հետո անցնելու ենք բոլոր այն x արժեքների վրայով, որտեղ ցանկանում ենք ալիքի որևէ կետը նկարել։ Սկզբի համար ենթադրենք, որ մեզ պետք է 24 պիքսել։ Ցիկլում պետք է հետևյալ երեք գործողությունները կատարել.
  1. Ըստ լայնույթի ու անկյան սինուսի հաշվել y կոորդինատը։
  2. (x,y) կետում շրջան նկարել։
  3. Ըստ անկյունային արագության անկյունը մեծացնել։
for (var x = 0; x <= width; x += 24) {
    // Ըստ լայնույթի ու անկյան սինուսի՝ հաշվել y կոորդինատը
    var y = amplitude * sin(angle);
    // x, y կետում շրջան նկարել
    ellipse(x, y+height/2, 48, 48);
    // Ըստ անկյունային արագության՝ անկյունը մեծացնել
    angle += angleVel;
}
Դիտարկենք արդյունքները՝ angleVel փոփոխականի տարբեր արժեքների դեպքում.
Ուշադրություն դարձրու, որ չնայած նրան, որ պարբերությունը որպես այդպիսին չենք հաշվում, անկյունային արագությունն ինչքան մեծ է, այնքան փոքր է պարբերությունը։ Կարևոր է նաև նկատել, որ ինչքան փոքրանում է պարբերությունը, այնքան ավելի հեռու են դառնում կետերը, որի պատճառով ավելի դժվար է դառնում ալիքը տեսնելը։ Կարելի է կետերն իրար միացնել՝ beginShape() և endShape() ֆունկցիաների միջոցով։
Վերևի օրինակը ստատիկ է։ Ալիքը երբեք չի փոխվում, չի ալեկոծվում, իսկ մեր ուզածը հենց դա էր։ Ալիքն անիմացնելու այս վերջին քայլը մի փոքր բարդ է։ Միգուցե մտածես, որ կարելի է պարզապես անկյունը դարձնել ընդհանրական փոփոխական և յուրաքանչյուր draw() ցիկլում այն մեծացնել։
Չնայած նրան, որ լավ միտք է, չի աշխատի։ Եթե դիտարկես նկարվող ալիքը, կնկատես, որ ալիքի աջ վերջնակետը ձախ սկզբնակետին չի համապատասխանում. հնարավոր չէ հաջորդ ալիքը սկսել այնտեղ, որտեղ նախորդն ավարտվել է draw() ցիկլում։ Դրա փոխարեն նպատակահարմար է ունենալ փոփոխական, որը հետևում է անկյան այն արժեքին, որով պետք է ալիքը սկսվի։ Այս անկյունը, որն իր սեփական անկյունային արագությամբ է մեծանում, կոչվում է startAngle։
Ահա ծրագիրը՝ սկզբի անկյունը ներառյալ։ Փորձիր թվերը փոփոխել՝ տատանվող ալիքի հետ կատարվող փոփոխությունները տեսնելու համար։

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

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

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