LaskuKaavoja

Oletko tehnyt jotain, mistä muut voisivat hyötyä. Postita vinkit tänne.
MaGetzUb
Guru
Posts: 1715
Joined: Sun Sep 09, 2007 12:35 pm
Location: Alavus

LaskuKaavoja

Post by MaGetzUb »

Ajattelin pistää tälle foorumeille sellaisen topicin, jolle voisi kaikki tuoda omia lasku kaavoja... Jos tästä on liiaksi vaivaa foorumien ylläpitäjille, niin aiheen voi lukita.

Tarkemmin selitettynä tänne voi tuoda omia laskukaavoija, mitä on keksinyt. Ajattelin että niitä mitä kaavoja tänne on lähetetty niitä voisi soveltaa omiin projuihin. Enimmäkseen fysiikkaan minulla olisi tarvetta. :roll:

Itselläni nyt ei ole mitään mutta ajattelin, että täälä foorumeilla on niitä matikka neroja...
Ei muutakun postailemaan.
PS. ajattelin että näistä voisi olla jollekkin hyötyä, myös itselleni. :D
EDIT:

Siis tänne voi postata koodin, tai pelkän kaavan.

Solar Eclipse
Meneillä olevat Projektit:
We're in a simulation, and God is trying to debug us.
User avatar
Jare
Devoted Member
Posts: 877
Joined: Mon Aug 27, 2007 10:18 pm
Location: Pori
Contact:

Re: LaskuKaavoja

Post by Jare »

Lähdetään liikkeelle vaikka tällaisesta maailman yksinkertaisimmasta kaavasta, jonka muistelen kuitenkin joskus tuottaneen itselleni paljon harmaita hiuksia. Eli kaava, joka peilaa kulman (saa esim. kappaleen kimpoamaan).

angle1# on siis peilattava kulma ja angle2# on "peilin" kulma. Eli jos pallo kimpoaa seinästä, niin angle1# on pallon kulma ja angle2# on seinän kulma.

Code: Select all

WrapAngle(angle2#-(angle1#-angle2#))
Tätä muistelen käyttäneeni SunBEAM-pelissäni.
User avatar
Ilmuri
Developer
Developer
Posts: 277
Joined: Sun Aug 26, 2007 2:46 pm
Location: \o

Re: LaskuKaavoja

Post by Ilmuri »

Sievenee siis

Code: Select all

WrapAngle(kulma2*2-kulma1)
Onko seinän kulmassa kyseessä seinän normaalin kulma?
CoolBasic henkilökuntaa
Kehittäjä
CoolBasic Classic
User avatar
Jare
Devoted Member
Posts: 877
Joined: Mon Aug 27, 2007 10:18 pm
Location: Pori
Contact:

Re: LaskuKaavoja

Post by Jare »

Ilmuri wrote:Onko seinän kulmassa kyseessä seinän normaalin kulma?
Tjaah? Kun en ole lukiota käynyt niin enpä tiedä, mikä tuo "normaali" on.

Edit: Aavesoturi, kiitos selvennyksestä. Kyseessä ei ole normaalin kulma.
Last edited by Jare on Thu May 08, 2008 9:56 pm, edited 1 time in total.
Aavesoturi
Active Member
Posts: 163
Joined: Fri Aug 31, 2007 7:07 pm
Location: Helsinki
Contact:

Re: LaskuKaavoja

Post by Aavesoturi »

Jare wrote:
Ilmuri wrote:Onko seinän kulmassa kyseessä seinän normaalin kulma?
Tjaah? Kun en ole lukiota käynyt niin enpä tiedä, mikä tuo "normaali" on.
Seinän normaali muodostaa suorankulman seinää vasten, eli käytännössä Seinänkulma + 90 astetta (tai - miinus riippuu vähän). Normaalia (lähinnä normaalivektoria) käytetään paljon tämäntyyppisissä laskuissa, heijastus fysiikassa, vektorilaskuissa, 3d matikassa ym. Jos kerta et tiedä mikä se on niin saattaapi olla että tuossa kaavassa on käytetty sitä seinän kulmaa. Tämänhän voisi testata kyllä, jos jaksaisi.

Yleisesti ottaen normaalin käytössä on se etu, että se sojottaa suoraan pois seinästä, eli kertoo mikä puoli on se varsinainen seinä. Toisin kuin seinän suuntainen vektori (tai kulma), joka määrittää seinälle suunnaan (usein turhaa), muttei kerro kumpi puoli vektoria (viivaa) on se itse pinta (mihin voi törmätä). Tuon pinnan voi tietty määrittää olevan aina esim. kulma+90, mutta se tietää sitten aina lisää laaskutoimituksia.

(Minulle suoran normaali opetettiin kyllä joskus yläasteen alussa...)
EDIT: ja vielä linkki wikipediaan
(huomaa taas suomi ja englanti versioiden eron: suomipediassa on lauseenmittainen artikkeli aiheesta Normaali (matematiikka), mutta englanninkielinen versio samasta on itseasiassa kymmeniä linkkejä sisältävä "mitä näistä tarkoitit" sivu.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: LaskuKaavoja

Post by Koodiapina »

Antaa muutujan a itseisarvon (Eli antaa muuttujan a positiivisena).

Code: Select all

a = a * -(a<0)+(a>0)*a
Tuon saisi ehtolauseilla, mutta tämähän on kaava topic. Ja tuossa on varmaan paljonkin sievennettävää ja turhia sulkeita.
Murskaaja
Member
Posts: 92
Joined: Tue Aug 28, 2007 8:19 pm
Contact:

Re: LaskuKaavoja

Post by Murskaaja »

Grandi wrote:Antaa muutujan a itseisarvon (Eli antaa muuttujan a positiivisena).

Code: Select all

a = a * -(a<0)+(a>0)*a
Tuon saisi ehtolauseilla, mutta tämähän on kaava topic. Ja tuossa on varmaan paljonkin sievennettävää ja turhia sulkeita.
*köh* tai helpommin:

Code: Select all

a = Abs(a)
ASCII star wars Xtreme | Cool Bombers | Combat (kehitteillä)

RedShadow productions
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: LaskuKaavoja

Post by Koodiapina »

Murskaaja wrote:*köh* tai helpommin:

Code: Select all

a = Abs(a)
Kaikissa kielissä ei tuollaista funktiota ole.
Murskaaja
Member
Posts: 92
Joined: Tue Aug 28, 2007 8:19 pm
Contact:

Re: LaskuKaavoja

Post by Murskaaja »

Grandi wrote:
Murskaaja wrote:*köh* tai helpommin:

Code: Select all

a = Abs(a)
Kaikissa kielissä ei tuollaista funktiota ole.
Eikä kaikissa voi tehdä sinun tavallasi, what's your point? Laitoinpa tuon vastineen, kun nämä kuitenkin ovat coolbasicin foorumit.
ASCII star wars Xtreme | Cool Bombers | Combat (kehitteillä)

RedShadow productions
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: LaskuKaavoja

Post by Koodiapina »

Tietenkin syntaxia joutuu muokkaamaan muissa kielissä, mutta matemaattinen kaava pysyy samana. En vaan osaa Pseudo koodia, joten tein tuon CB:läisille tutulla tavalla. Ja mistä sitä tietää jos joku tuota joskus tarvitsisikin?

Dibalo: Ok.
Last edited by Koodiapina on Thu May 08, 2008 4:52 pm, edited 1 time in total.
User avatar
Dibalo
Advanced Member
Posts: 298
Joined: Mon Aug 27, 2007 8:12 pm
Location: Espoo, Finland
Contact:

Re: LaskuKaavoja

Post by Dibalo »

Attention:

Pysytäänpä aiheessa!

The darkest spells can be found from
http://tunkkaus.blogspot.fi
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: LaskuKaavoja

Post by koodaaja »

Itse toteuttaisin sen näin:

Code: Select all

a = a - ( a<0 ) ( 2*a )
Eli otetaan a, ja jos se on negatiivinen, siitä vähennetään 2a.

Esimerkiksi -5 - 2*(-5) = -5 -(-10) = -5 + 10 = 5.

Tiedä sitten, kumpi on parempi tapa : D Ja Absiahan sitä oikeasti tulee projekteissa käytettyä.
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm

Re: LaskuKaavoja

Post by Koodiapina »

Tuohan on nerokas tapa, eikä ole epäilystä etteikö se olisi parempi, onhan se lyhempi. (Paitsi eihän sillä pituudella nyt niin suurta väliä ole). Oma kaavani perustui pitkälti purkkaan, kun sinulla näyttäisi olevan sievennetyin muoto mitä voi olla.
Northburns
Newcomer
Posts: 7
Joined: Tue Aug 28, 2007 5:49 pm

Re: LaskuKaavoja

Post by Northburns »

Tällaista pientä tarvitsin erääseen abstraktiin projektiin.

Code: Select all

(int a, int b, int max) //Parametrit
angularDistance = MIN ( ABS(a-b) , max+1-opt1)
Tämä pieni kaava palauttaa kahden arvon välisen "kulma etäisyyden" suljetussa joukossa. Esim kulma (0 - 359), tämä kaava palauttaa kahden kulman välisen kulman. Testattu kokonaisluvuilla, ja olettaa pienimmän arvon arvoksi 0. Diskretointiväliksi oletetaan 1, mutta en jaksa miettiä, vaikuttaako mitenkään.

Ja tässä topikissa ei ole vielä tullut MIN()-kaavaa, joten tässäpä olisi:

Code: Select all

(a,b) //Parametrit
pienempi = b-(((a-b) Sar 31)=-1)*(b-a)
Funktio palauttaa pienemmän kahdesta 32-bittisestä (kokonais?)-luvusta, jotka ovat muistissa 2-komplementtilukuina.
Kaava siis ottaa parametrien erotuksen (a-b), ja jos se on negatiivinen a<b, joten b-a on vähennettävä b:stä. Näin saatiin pienempi.
Kiva että CB:stä löytyi tuo Sar-komento. :)

EDIT----------
Jaaha, olihan CB:ssä sitten MIN() ja MAX() funktiot. No jaa. Tuota ylläolevaa laskukaavaa voi tosiaan käyttää MAX-kaavana antamalla sille a:n ja b:n vastaluvut ja ottamalla tuloksen vastaluvun. Jeps.
Valtzu
Active Member
Posts: 115
Joined: Sun Aug 26, 2007 2:40 pm
Location: Sauvo
Contact:

Re: LaskuKaavoja

Post by Valtzu »

koodaaja wrote:

Code: Select all

a = a - ( a<0 ) ( 2*a )
Vielä yksi tapa:

Code: Select all

luvun_itseisarvo = Sqrt(luku ^ 2.0)
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: LaskuKaavoja

Post by koodaaja »

Northburns wrote:Ja tässä topikissa ei ole vielä tullut MIN()-kaavaa, joten tässäpä olisi:

Code: Select all

(a,b) //Parametrit
pienempi = b-(((a-b) Sar 31)=-1)*(b-a)
Onko tuossa mitään oleellista etua tähän nähden?

Code: Select all

pienempi = a*(a<b) + b*(b<a)
Niin, ja sisäänrakennettu funkkarikin tietysti löytyy.

EDIT: Haha, Valtzu. Ovelaa, tuota en olisi tullut ajatelleeksikaan.
Northburns
Newcomer
Posts: 7
Joined: Tue Aug 28, 2007 5:49 pm

Re: LaskuKaavoja

Post by Northburns »

koodaaja wrote:
Northburns wrote:Ja tässä topikissa ei ole vielä tullut MIN()-kaavaa, joten tässäpä olisi:

Code: Select all

(a,b) //Parametrit
pienempi = b-(((a-b) Sar 31)=-1)*(b-a)
Onko tuossa mitään oleellista etua tähän nähden?

Code: Select all

pienempi = a*(a<b) + b*(b<a)
...
Etuhan on siinä, että jos kielessä tai kääntäjässä, jolla tuon toteuttaa löytyy binäärinen AND, niin pienemmän arvon valitsemisen voi toteuttaa ilman kertolaskua, vertailua ja hyppyjä (joista ensimmäinen ja kolmas ovat hitaita verrattuna ynnäämiseen ja maskaamiseen *).
Kun tuosta (a-b Sar 31) saadaan maski, joka on täynnä nollaa, jos a>b ja täynnä ykkösiä, jos a<b. Tällä AND-maskataan sitten b-a, ja b:stä vähennetään se. (jos a>b (maski ykkösiä-> vähennetään a-b), ja vähennetään nolla, kun b<a.
Mutta kuten sanottu, riippuu tosiaan ohjelmointikielestä, kääntäjästä ja alustasta, mikä on nopein. Kannattaa benchmarkata, ennen kuin valitsee. Ja tuo yksinkertainen Sar oli kivä löytää CB:stä, kun sitä ei mm. C-standardissa ole (vaikka onkin sama kuin perus shiftaus oikealle etumerkittömille, ja positiivisille luvuille). Tai voi jakaa 2^31:llä, mutta sitten kyllä mikä tahansa muu ratkaisu olisi parempi. ;)
EDIT:

Okei, testasin sitten nopeudet omalla koneella (niin minun kuin koodaajankin esittämät kaavat), niin CB:llä kuin MinGW:n kääntämällä C++:lla (ilman optimointeja luonnollisesti). Nopeimmiksi selvisivät CB:ssä CB:n oma MIN-funktio, ja C++:ssa (a<b?a:b). Muissa ei ollut merkittäviä eroja.
Olisin muuten postannut tulokset ja sorsat, mutta en voinut upata .txt, enkä .pdf tiedostoja, joten hmph... Evo tai tietoturva-kysymys.
Ja olisin voinut tähänkin postata, mutta se olisi mennyt liian off-topiciksi. Pysytään asiassa. Tää on hyvä topiikki.

*: Riippuu raudasta pitkälti tämäkin. Benchmarkkaus kannattaa.
SPuntte
Tech Developer
Tech Developer
Posts: 650
Joined: Mon Aug 27, 2007 9:51 pm
Location: Helsinki, Finland
Contact:

Re: LaskuKaavoja

Post by SPuntte »

Palautetaampas aihe taas matikan puolelle. Tässä funkkari, joka laskee mielivaltaisen pisteen (px, py) etäisyyden kahden mielivaltaisen pisteen (l1x, l1y) ja (l2x, l2y) kautta kulkevasta suorasta. Kaavan voi johtaa kohtalaisen helposti MAOLin analyyttisen geometrian osion avulla.

Code: Select all

Function PointToLineDist(px#, py#, l1x#, l1y#, l2x#, l2y#)
    //Suoran yhtälö
    a# =  (l2y - l1y) / (l2x - l1x)
    b# = -1
    c# = -a * l1x + l1y
    
    //Etäisyys
    d# = Abs(a * px + b * py + c) / Sqrt(a * a + b * b)
    
    Return d
EndFunction
CoolBasic henkilökuntaa
Tech-kehittäjä
CoolBasic Classic, Cool VES

CoolPhysicsEngine | MissileSystem | Jana-ympyrä -törmäys | cbSimpleTexture | CoolCPLX
Pate5
Artist
Artist
Posts: 551
Joined: Tue Aug 28, 2007 4:53 pm
Location: Vantaa

Re: LaskuKaavoja

Post by Pate5 »

Minkä kaavan avulla voitaisiin laskea kappaleen nopeus sen vaaka- ja pystyliikkeen avulla?
CoolBasic henkilökuntaa
Graafikko
Valtzu
Active Member
Posts: 115
Joined: Sun Aug 26, 2007 2:40 pm
Location: Sauvo
Contact:

Re: LaskuKaavoja

Post by Valtzu »

Pate5 wrote:Minkä kaavan avulla voitaisiin laskea kappaleen nopeus sen vaaka- ja pystyliikkeen avulla?

Code: Select all

nopeus# = Sqrt(nopeus_x# ^ 2 + nopeus_y# ^ 2)
Post Reply