euclidean vektorer i flash

, euclidean vektorer i flash,,,,, 1,,,,,,,,,,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss. denne post er en del af en serie, ringede du? lege med elastisk collisionsgravity i aktion, to gange om måneden, kan vi se på nogle af vores læsere favorit stillinger fra activetuts + historie.i denne uge er retro aktive forelæsning, offentliggjort i april, er en vejledning til euclidean vektorer: det, de er, hvorfor du ville bruge dem, og til at gennemføre dem i flash med as3.,, euclidean vektorer indgår i geometri, med visse egenskaber, som er meget nyttige for udviklingen af spil.de kan betragtes som punkter, men de har også en størrelsesorden og retning.de er repræsenteret som pile fra det første til det sidste punkt, og det er, hvordan vi vil trække dem i denne artikel,.,,, euclidean vektorer er almindeligt anvendt i matematik og fysik for en masse ting. de kan repræsentere hastighed, acceleration og styrker i fysik eller bevise en masse vigtige theorems i matematik.i denne forelæsning, du vil lære om euclidean vektorer og opbygge en klasse, som du kan bruge i deres egen flash projekter. bemærk, at euclidean vektorer, er anderledes end actionscript er vektor klasse, og også anderledes end vektor tegning., vektorer kan anvendes i flash miljø for at hjælpe dem med at opnå komplekse opgaver, som ellers ville kræver en stor indsats, hvis det gøres uden dem.i denne artikel, vil du lære at bruge dem i glimt, som lærer en masse sejt tricks med vektorer.,, trin 1: kartesiske koordinater, og flash er koordinater, før et spring ind i vektorer, lad os indføre flash er koordinatsystem.du er sikkert bekendt med de kartesiansk koordinatsystem (selv om du ikke ved det, ved navn):,, flash - systemet er meget ens.den eneste forskel er, at y - aksen er på hovedet:,, når vi begynder at arbejde med vektorer i flash, er vi nødt til at huske på det.men gode nyheder: det andet system gør ikke meget forskel.arbejde med vektorer i, vil det være som at arbejde med vektorer i kartesiansk system.,, trin 2: definition af en vektor, i forbindelse med denne forelæsning, vi vil definere og arbejde med alle vektorer indledende punkter som registrering af scenen, ligesom de er almindeligt anvendt i matematik.en vektor, så vil blive defineret som en fælles holdning, men det må omfanget og vinkel egenskaber.tag et kig på nogle eksempel vektorer defineret i den fase, som du kan se, en vektor er repræsenteret af en pil, og hver vector har en vis længde (eller omfang) og punkter langs en bestemt vinkel.halen af hver vektor er ved registrering, (0, 0),. vil vi skabe en enkel euclideanvector klasse for denne forelæsning, ved anvendelse af punkt klasse at holde vektoren er koordinater.lad os skabe grundlæggende vektor klasse:, pakke (import flash.geom.point; offentlige klasse euclideanvector {offentlige var holdning: punkt; offentlige var størrelse: antal; offentlige var vinkel: antal; offentlig funktion euclideanvector (endpoint - punkt) {holdning = endepunkt;}}}, i denne forelæsning, vi vil tale om det. forstand, og den retning, en vektor.bemærker, at den retning, kun definerer en linje, som "indeholder" vektoren.den følelse, der definerer, hvor vektoren punkter langs denne linje.,, trin 3: omvendt en vektor, i denne forelæsning vil vi bruge udtrykket "omvendt en vektor".det modsatte af en vektor er en vektor med samme størrelsesorden og retning, men af en anden mening.det betyder en vektor, med det modsatte signal for den første vektor er koordinater.så en vektor med et endepunkt (x, y) ville have en omvendt vektor med et endepunkt (- x - y). lad os tilføje en funktion til vores euclideanvector klasse til at vende den inverse vektorer: offentlig funktion inverse(): euclideanvector {tilbage nye euclideanvector (det nye punkt (x - holdning. - holdning. y)}, trin 4: grundlæggende operationer over, nu hvor vi har lært at definere en vektor, lad os lære at tilføje to vektorer: det er så enkelt som at lægge deres koordinater separat.se på dette billede:,, hvis du bemærker i det billede, som følge af tilføjelse af to vektorer, er en vektor, og du kan se, at dets koordinater er summen af koordinaterne for de to andre vektorer.i kode, ville det se sådan ud: offentlige funktion beløb (othervector: euclideanvector): euclideanvector {holdning. x + = othervector. holdning. x. y + = othervector. holdning. y. tilbage.}, så vi kan sige, at: vecr = = vec1. beløb (vec2),,, løntrin 5: grundlæggende operationer subtraktion, subtraktion arbejder næsten det samme som tilføjelse, men i stedet vil vi tilføje det, omvendt, i den anden vektor for den første vektor. det er allerede kendt, at summen af to vektorer, så her er koden til fratrækning: offentlige funktion træk (othervector: euclideanvector): euclideanvector {holdning. x - = othervector. holdning. x; position. - = othervector. holdning. y. tilbage.}, koden er særdeles nyttigt at få en vektor, som går fra po -int af vektorer til punkt i en anden.se på billedet og du vil se, at det er sandt.det vil blive anvendt en masse i de senere eksempler.,, trin 6: grundlæggende operationer multiplikation med en række, multiplikation mellem en vektor, og en række (regelmæssige numre er kendt som "skalaer," i vektor matematik) resulterer i en vektor, som har haft størrelse ganget med det antal, men peger i samme retning, og det er "sig", hvis denne er større end 1 og mast, hvis scalar er på mellem 0 og 1.betydningen af den nye vektor vil være den samme som den oprindelige kurs, hvis denne er positiv, eller omvendt, hvis negative.i dette nummer "vægt" vektoren.se på billedet:,, i kodeksen, vi mangedoble vektor er koordinater, med det antal, som så vil omfang vektoren: offentlige funktion sig (nr.: nummer): euclideanvector {holdning. x * = nummer og position. y * = antal; tilbage.}, trin 7: få en vektor er størrelse, for at få en vektor er størrelse, vil vi bruge pythagoras teorem.hvis du har glemt, hvad er det, her er en hurtigt igen:,, (mere info.), koden er meget enkel: offentlig funktion magnitude(): antal (tilbagevenden matematik. sqrt ((position. x * holdning. x) + (position. y * holdning. y)}, - vil også fjerne den linje, offentlige var størrelse: antal, som det er, hvad vi vil bruge fremover. størrelsen af en vektor, vil altid være positiv, da det er kvadratroden af summen af to positive tal.,, trin 8: den vinkel af vektorer, vinkel en vektor er vinklen mellem x - aksen og vektoren er retning.vinklen er, målt fra x - aksen og dreje mod uret, indtil den retning i de kartesiansk system:,, men i glimt er koordinatsystem, da y - aksen er vendt på hovedet, denne vinkel vil blive målt roterende uret:,, det kan let beregnes ved anvendelse af følgende kode.vinklen skal returneres i radianer, i en afstand fra 0 til 2pi.hvis du ikke ved, hvad radianer er, eller hvordan du bruger dem, denne forelæsning af michael james williams vil hjælpe dig meget. offentlige funktion angle(): antal (var - vinkel: antal = matematik. atan2 (position. y. x); hvis (vinkel < 0) (+ = math.pi vinkel * 2} tilbage vinkel.}, trin 9: dot produkt, dot vare mellem to vektorer, er et nummer med nogen betydning, men det har to nyttige anvendelser.lad os tage et kig på, hvordan dot produkt kan beregnes:,, men det kan også opnås ved hver vektor er koordinater:,, dot produkt kan fortælle os mere om den vinkel mellem vektorer: hvis den er positiv, da den vinkel, varierer fra 0 til 90 grader.hvis den er negativ, vinklen varierer fra 90 til 180 grader.hvis det er nul, er 90 graders vinkel.det sker, fordi der i den første formulering kun cosinus har til opgave at dot produkt "signal": de størrelser er altid positiv.men vi ved, at en positiv cosinus, betyder, at den vinkel, varierer fra 0 til 90 grader og så videre til negative cosines og nul., dot produkt kan også anvendes til at repræsentere længden af vektoren i retning af den anden vektor.tænk på det som en projektion.dette viser, extremelly nyttige ting som adskillelse af akse læresætning (sad), og dens gennemførelse i as3 for kollision afsløring og imødegåelse på spil. her er den konkrete kode have dot vare mellem to vektorer: offentlige funktion dot (othervector: euclideanvector): antal (afkast (position. x * othervector. holdning. x) + (position. y * othervector. holdning. y)}, gå 10: mindste vinkel mellem vektorer, vinklen mellem vektorer, som set i trin 9, kan gives af den prik produkt.her er, hvordan man beregner det, offentligheden anglebetween (othervector: euclideanvector): antal (tilbagevenden matematik. acos (dot (othervector) /(magnitude() * othervector. magnitude())}, trin 11: varierede vinkel mellem vektorer, er der også en anden metode til at beregne den vinkel, der giver resultater mellem - pi og pi 'er og altid beregner den vinkel, der går fra den første vektor til anden vektor; denne er nyttig, når man vil let integrere med et display objekt er rotation (som varierer fra - 180 og 180). metoden virker ved at få den vinkel for både vektorer, så at de vinkler, og arbejder på det resultat.,, kode: offentlig funktion rangedanglebetween (othervector: euclideanvector): antal (var - firstangle: nummer var 2.- nummer var vinkel: antal; firstangle = matematik. atan2 (othervector. holdning. y, othervector. holdning. x); secondangle = matematik. atan2 (position. y. x); vinkel = secondangle - firstangle; mens (vinkel > matematik. pi) vinkel - = math.pi * 2, mens (vinkel < - matematik. pi) vinkel + = math.pi * 2 tilbage vinkel.}, opmærksom på, at denne vinkel afkast positivt, hvis secondangle, er højere end firstangle, så den rækkefølge, i hvilken de får varierede vinkel vil påvirke resultatet.,, trin 12: normalisering af vektorer, normalisering af en vektor, betyder, at dens omfang er lig med 1, samtidig med at bevare den retning og følelse af vektoren.for at gøre det, vi mangedobler vektoren ved 1 /omfang.på den måde, dets størrelse, vil være reduceret eller forøget, til 1. offentlige funktion normalize(): euclideanvector {var m: antal = magnitude(); position. x /= m. y /= m tilbage.}, trin 13: den normale for en vektor, normale, en vektor er en vektor, som gør en 90 graders vinkel til det første.den kan beregnes ved følgende formler:, metoder, påberåbe sig, at, da de normalt altid er vinkelret på en vektor, vi behøver kun at ændre rækkefølgen af x - og y - koordinater og beregnet som en af dem med henblik på at få en normal.følgende billede viser proces:, i det billede, som vec, er den oprindelige vektor, vec2, er den vektor, vec, er nye koordinater, og vec3, er en vektor, vec2, er negative og koordinere.jo, og ang2, er variabel, men vinklen mellem vec, og vec3, altid er 90 grader, og reglerne er enkle, offentlig funktion normalright(): euclideanvector {tilbage nye euclideanvector (det nye punkt (- holdning. y. x)} offentlig funktion normalleft(): euclideanvector {tilbage til new euclideanvector (det nye punkt (position. y - holdning. x)), punkt 14: roterende en vektor, for at skifte en vektor, går vi ud fra den (0, 0) position (det oprindelige punkt) vil blive rotation center.de havde, er givet ved formlen:, denne løsning opnås ved at anvende en rotation matrix til vektor.vi ville være at gå ud over anvendelsesområdet for denne forelæsning, hvis vi gik ind i matrix, og hvordan det fungerer, så jeg vil bare lade formlen. kodeksen er stort set den samme: offentlige funktion roter (angleinradians: nummer): euclideanvector {var newposx: antal = (position. x * fordi matematik. (angleinradians)) - (position. y * matematik. synd (angleinradians) var newposy: antal = (position. x * matematik. synd (angleinradians) + (position. y * matematik. - (angleinradians). x = newposx; position. y = newposy; tilbage.}, dette er slutningen på vores grundlæggende vektor operationer.hvad vil du se næste er måder at anvende denne klasse til at gøre noget.her er vores klasse så vidt:, pakke (import flash.geom.point; offentlige klasse euclideanvector {offentlige var holdning: punkt; offentlige var vinkel: antal; offentlig funktion euclideanvector (endpoint - punkt) {holdning = endepunkt;} offentlig funktion inverse(): euclideanvector {tilbage nye euclideanvector (det nye punkt (- holdning. x - holdning. y)} offentlige funktion beløb (othervector: euclideanvector): euclideanvector {holdning. x + = othervector. holdning. x. y + = othervector. holdning. y. tilbage.} offentlige funktion træk (othervector: euclideanvector): euclideanvector {holdning. x - = othervector. holdning. x; position. - = othervector. holdning. y. tilbage.denne;} offentligheden sig (nr.: nummer): euclideanvector {holdning. x * = nummer og position. y * = antal; tilbage.} offentlig funktion magnitude(): antal (tilbagevenden matematik. sqrt ((position. x * holdning. x) + (position. y * holdning. y));} offentlig funktion angle(): antal (var - vinkel: antal = matematik. atan2 (position. y. x); hvis (vinkel < 0) (vinkel + = math.pi * 2} tilbage vinkel;} offentlige funktion dot (othervector: euclideanvector): antal (afkast (x * othervector holdning. holdning. x) + (position. y * othervector. holdning. y)} offentlig funktion anglebetween (othervector: euclideanvector): antal (tilbagevenden matematik. acos (dot (othervector) /(magnitude() * othervector. magnitude())} offentlig funktion rangedanglebetween (othervector: euclideanvector): antal (var - firstangle: nummer var secondangle: nummer var vinkel: antal; firstangle = matematik. atan2 (othervector. holdning. y, othervector. holdning. x); secondangle = matematik. atan2 (position. y. x); vinkel = secondangle - firstangle; mens (vinkel > matematik. pi) vinkel - = math.pi * 2. mens (vinkel < - matematik. pi) vinkel + = math.pi * 2 tilbage vinkel;} offentlig funktion normalize(): euclideanvector {holdning. x /= magnitude(); position. y /= magnitude(); tilbage.} offentlig funktion normalright(): euclideanvect, eller {tilbage nye euclideanvector (det nye punkt (- holdning. y. x)} offentlig funktion normalleft(): euclideanvector {tilbage nye euclideanvector (det nye punkt (position. y - holdning. x)} offentlige funktion roter (angleinradians: nummer): euclideanvector {var newposx: antal = (position. x * matematik. - (angleinradians)) - (position. y * matematik. synd (angleinradians) var newposy: antal = (position. x * matematik. synd (angleinradians) + (position. y * matematik. - (angleinradians). x = newposx; position. = newposy; tilbage.}}}, okay, vi har omfattet bygning vektoren klasse, lad os tage et tog til at udnytte det, gå 15: at afgøre, om et punkt er inde i en polygon, action begynder her.afgørelsen af, om et punkt ligger inde i en polygon, eller ikke, er et meget interessant emne, og der findes mange metoder til at nå det.i denne artikel, vil jeg fremlægge tre metoder, der generelt anvendes:,,, passage af antallet eller endog en regel algoritme, der afgør, om et punkt, er inde i en polygon fra mange kanter, som en "ray" kastet fra punkt til det uendelige kors.,, snoede nummer algoritme,,, som giver svaret på grundlag af summen af alle vinkler, dannet mellem på hinanden følgende toppunkter i en polygon, og det punkt check.,, konvekse polygon algoritme, der, som navnet siger, kun arbejder for konvekse polygoner, og som er baseret på, hvorvidt et punkt på en vis "side" for hver del af den polygon,.,, alle disse algoritmer skal stole på, at du ved, hvor den toppunkter (hjørner) at definere polygon. trin 16: passageantal eller endog en regel algoritme, denne algoritme kan anvendes i enhver form.det er, hvad du har læst: enhver form, har det huller eller ej, det være sig konvekse eller ej.det er baseret på den kendsgerning, at ray stemmer fra det punkt, du vil se, at det vil krydse et lige antal kanter, hvis de er uden for den form, eller ulige antal kanter, hvis formålet er, i den form.dette kan bevises ved jordan kurve læresætning, der indebærer, at de skal passere en grænse mellem en region og andre regioner, hvis du ønsker at flytte fra det ene til andre.In our case, our regions are "inside the shape" and "outside the shape"., , ,The code for this algorithm is the following:, public function isPointInsideShape1(point:EuclideanVector, shapeVertices:Vector.<EuclideanVector>):Boolean { \tvar numberOfSides:int = shapeVertices.length; \t \tvar i:int = 0; \tvar j:int = numberOfSides - 1; \t \tvar oddNodes:Boolean = false; \t \twhile (i < numberOfSides) \t{ \t\tif ((shapeVertices[i].position.y < point.position.y && shapeVertices[j].position.y >= point.position.y)



Previous:
Next Page: