Sitemap
Alen Abrahamyan

Alen Abrahamyan

Software Engineer

Մաթեմատիկա և JavaScript

6 min readJul 25, 2022

Ողջույն։

Այսօր պատմելու եմ այն մասին, թե որքան անհրաժեշտ է մաթեմատիկական գիտելիքները ծրագրավորման մեջ և ցույց եմ տալու JavaScript-ով օրինակներ, որոնց լուծումը տրված է մաթեմատիկայի միջոցով։ Այսօր JavaScript-ով բրաուզերի համար պատրաստում են բավականին բարդ ծրագրեր` գրաֆիկական խմբագրիչներ, վիդեո կամ անիմացիա պատրաստելու գործիքներ, խաղեր և այլն։ Ահա դրանցից մի քանիսը․

գրաֆիկական խմբագրիչներ՝

Press enter or click to view image in full size

վիդեո և անիմացիա պատրաստելու գործիքներ՝

Press enter or click to view image in full size
Press enter or click to view image in full size

խաղեր, սիմուլացիաներ և այլն՝

Press enter or click to view image in full size

Այսպիսի գրաֆիկական խնդիրներ լուծելու համար սկսում ենք հասկանալ մաթեմատիկական գիտելիքների՝ մասնավորապես անալիտիկ երկրաչափության կարևորությունը։ Անալիտիկ երկրաչափությունը երկրաչափության այն բաժինն է, որում երկրաչափական պատկերները և իրենց հատկությունները ուսումնասիրվում են հանրահաշվի կանոններով։ Սրա հիմքում ընկած է կոորդինատների մեթոդը։ Տվյալ դեպքում էկրանն է հանդիսանում մեր կոորդինատային առանցքը։ Այս խնդիրների շրջանակում կաշխատենք կետերի, ուղիղների, անկյունների, կորերի հետ, կօգտագործենք եռանկյունաչափություն և անալիտիկ երկրաչափություն։ Սրանք կիրառելի են ինչպես 2D-ում, այնպես էլ 3D-ում։
Այսօր կանդրադառնանք հետևյալ կետերին՝

  • հաշվել երկու կետերի հեռավորությունը,
  • ուղղանկյուն պրոյեկցիա,
  • պտույտներ,
  • interpolation,
  • 3D rendering:

Սրանք են այն հիմնարար գիտելիքները, որոնք անհրաժեշտ են նման գրաֆիկական խնդիրների հետ առնչվելիս։
Բոլոր օրինակների կոդերը JavaScript-ով տեղադրել եմ նաև իմ github-ում։
https://github.com/AlenAbrahamyan/analytic-geometry-javascript

Սկսենք ամենապարզից։

Հաշվել երկու կետերի հեռավորությունը

Տրված էլեմենտների միջև եղած հեռավորությունը հաշվել կարող ենք դրանց կոորդինատներով և ներքևի գծագրում եղած բանաձևով, որն էլ նման է Պյութագորասի թոերեմին։

Ուղղանկյուն պրոյեկցիա

Պրոյեկցիան որևէ պատկերի կամ առարկայի արտապատկերումն (պրոյեկտումն) է հարթության կամ այլ մակերևույթների վրա։
Ենթադրենք ունենք A կետ և պետք է այն պրոյեկտենք y=mx+b ուղղի վրա։
Գտնում ենք այն ուղղի բանաձևը, որը անցնում է A կետով և ուղղահայց է y=mx+b ուղղին, դա y=-1/m*x+b2 է։
Գտնում ենք ուղիղների հատման կետը, որը կհանդիսանա A կետի պրոյեկցիայի կոորդինատը y=mx+b ուղղի վրա։ Սրանով հնարավոր է լուծել բազաթիվ հետաքրքիր խնդիրներ․ ամենապարզ օրինակը՝ հաշվել տվյալ կետի և ուղղի միջև եղած հեռավորթյունը, կամ մինչև անգամ կառուցել 3D պատկերներ։

Press enter or click to view image in full size

Ուղղանկյուն պրոյեկտման միջոցով էկրանին կառուցվում են 3D պատկերներ։
Կետերը պրոյեկտվում են հարթության վրա և դրանցով կառուցվում է պատկերը։ Տվյալ դեպքում այդ հարթությունը կարող ենք համարել մեր էկրանը։

Պտույտներ

Հասկանալ, թե ինչպես են կատարվում տարբեր էլեմենտների պտույտները տարբեր առանցքների շուրջ, շատ կարևոր է։ Սա հանդիսանում է երկարչափական ալգորիթմների հիմնարար սկզբունքներից մեկը։
Պտույտները կապված են անկյունների և շրջանագծերի հետ, և եռանկյունաչափությունը պարզապես կենսական նշանակաություն ունի այս դեպքում։

Այս անիմացիաի մեջ շատ լավ պատկերված է, թե ինչպիսի կախվածության մեջ են իրարից անկյունները և եռանկյունաչափության տարրերը։

Այստեղ ունենք ընդամենը մեկ էլեմենտ, որը կատարում է պտույտը իր առանցքի շուրջ։ Սա իրականացնելու համար պետք է վերցնել մկնիկի կուրսորի և առանցքի կոորդինատները։ Այս կոորդինատների շնորհիվ կարող ենք կառուցել ուղղանկյուն եռանկյուն։ Դրա համար վերցնում ենք եռանկյան այն անկյունը, որը ստացվել է առանցքի կոորդինատով, և հաշվում ենք այդ անկյան arctan-ը։ Մեզ արդեն հայտնի է, թե քանի աստիճանով է պետք պտտել տվյալ էլեմենտը իր առանցքի շուրջ։ Սեփական առանցքի շուրջ պտույտը պատկերելու համար կօգտագործենք CSS: Եվ վուալա պատրաստ է։

Get Alen Abrahamyan’s stories in your inbox

Join Medium for free to get updates from this writer.

Այս օրինակի կոդը ես տեղադրել եմ իմ github-ում
https://github.com/AlenAbrahamyan/analytic-geometry-javascript/tree/main/rotation-own-axis

Հիմա դիտարկենք ավելի բարդ տարբերակը։ Հաճախ ձեզ պետք կգա դիտարկել մեկ կամ մի քանի էլեմենտների կամ կետերի պտույտ որևէ առանցքի շուրջ։ Նախորդ օրինակում բերված ձևով կհաշվենք, թե քանի աստիճանի պտույտ է կատարվել նշանակված առանցքի շուրջ, և կսկսենք հաշվել էլեմենտի նոր դիրքի կորդինատը։ Այո՛, ի տարբերություն նախորդ օրինակի այստեղ ոչ միայն փոխվում է էլեմենտի պտույտը իր առանցքի շուրջ, այլև ձեռք է բերում նոր կորդինատ և մեզ պետք է հաշվել դրանք։ Հենց նման դեպքերի մասին էի խոսում, երբ ասում էի, որ անալիտիկ երկրաչափությունում կարևորվում է մարմնի դիրքը կոորդինատական առանցքում։ Եթե մեզ բաժին հասած խնդիրը գծագրենք ավելի պարզ եղանակով կստանանք հետևյալ գծագիրը։

Press enter or click to view image in full size

Ունենք սկբնական կոորդինատը (initial coord), առանցքը(axis), պտտման անկյունը և մեզ հարկավոր է գտնել պտտման արդյունքում առաջացած էլեմենտի նոր կոորդինատները(rotated coord)։

Press enter or click to view image in full size

Այս բանձևերը դիտարկվում են այն դեպքում, երբ մեր առանցքը գտնվում է (0;0) կետում։ Դրա համար սկզբնական կետի կոորդինատից կհանենք մեր առանցքի կոորդինատները, կկատարենք մեզ անհրաժեշտ հաշվարկները և ստացված արդյունքին կգումարենք հետ մեր առանցքի կոորդինտները։ Եվ կստանանք մեր վերջնական արդյունքը։
1)Սկզբնական կոորդինատից հանել առանցքի կորդինատը
2)3-րդ բանաձևով կարող ենք հաշվել r-ը (շառավիղը)
3)cosA=x/r բանաձևով հասկանալ, թե ինչ անկյուն է կազմում սկզբնական կոորդինատը առանցքի նկատմամբ
4)սկզբնական կորդինատի կազմած անկյանը գումարում են մեր անկյունը
5)1-ին և 2-րդ բանաձևերով համապատասխանորեն (x;y) հաշվում ենք մեր նոր կոորդինատները
6)Չենք մոռանում ստացվածին գումարել առանցքի կոորդինատը, որը սկզբում հանել էինք։
Հետևյալ գործողությունը կատարում ենք մեզ հետաքրքրող բոլոր կետերի հետ։

Այս օրինակի կոդը ես տեղադրել եմ իմ github-ում
https://github.com/AlenAbrahamyan/analytic-geometry-javascript/tree/main/rotation-group-elements

Interpolation

Այս կոնցեպտը օգտագործում ենք, երբ ունենք 2 վիճակ և պետք է սահուն կերպով մեկից անցնենք մյուսին։ Այն շատ պարզ է, բայց կարելի է հետաքրքիր և օգտակար լուծումներ ստանալ այս կոնցեպտով։
Օրինակ՝

Press enter or click to view image in full size

Interpolation-ի միջոցով կարող ենք դիտարկել միջանցիկ վիճակներ և դրանց շնորհիվ կառուցել որևէ անիմացիա կամ լուծել այլ խնդիրներ։ Դիտարկենք մի պարզ օրինակ․ ունենք երկու կոորդինատ և պետք է մեկից մյուսը քայլող մարդուկի անիմացիա ստեղծել։

Ունենք 2 կոորդինատ և սրանց միջանկյալ կորդինատները ստանալու համար կօգտագործենք Interpolation-ի բանաձևը։

Ալֆա գործակցին տալիս ենք 0-ից 1 հատվածում ընկած արժեքներ, և այն որոշում է, թե որ հատվածում կլինի մեր միջանկյալ կետը։
Օրինակ ալֆաի 0 արժեքի դեպքում կվերադրձնի 1-ին կորդինատը,
1-ի դեպքում 2 կոորդինատը, 0,5 դեպքում կտա այդ երկուսի մեջտեղի կորդինատը։
Այսինքն՝ ալֆային կտանք մի քանի արժեք 0-1 հատվածում և կստանանք կորդինատներ, որոնցով կկառուցենք մեր անիմացիան, որքան փոքր հաճախություններով փոխենք ալֆա գործակցի արժեքը, այնքան սահուն կլինի մեր անիմացիան։
Այս մեթոդով ես պատրաստել եմ ներքևի տեսանյութում պատկերված օրինակը։

Օրինակի ֆայլերը տեղադրել եմ իմ github-ում
https://github.com/AlenAbrahamyan/analytic-geometry-javascript/tree/main/interpolation

Press enter or click to view image in full size

3D Rendering

Ինչպես նշեցի պրոյեկտման մեթոդով նաև կառուցում են 3D պատկերներ։

Մենք ունենք պատկերի կետերի կոորդինատները 3D (x, y, z) և դրանցից պետք է ստանանք 2D(x, y) կոորդինատներ, որպեսզի կարողանանք պատկերը կառուցել էկրանի վրա։ Այս ամենը լավ պատկերացնելու համար ես պատրաստել եմ ներքևում պատկերված օրինակը, որտեղ շատ լավ երևում է, թե ինչպես է կետերից կառուցվում պատկերը։

Օրինակի ֆայլերը տեղադրել եմ իմ github-ում։
https://github.com/AlenAbrahamyan/analytic-geometry-javascript/tree/main/3d-vanilla-js

Press enter or click to view image in full size

Այսպիսով քննարկեցինք գրաֆիկական խնդիրները և պահանջվող լուծումների մոտեցումները։
Եթե հետաքրքրեց կարող եք անցնել ներքևի հղումով, որտեղ կան բազմաթիվ ալգորիթմներ, որոնք օգնում են լուծել նման երկարաչափական խնդիրները։
https://www.geeksforgeeks.org/geometric-algorithms/

Շնորհակալություն ❤

--

--