Minulta pukkaa taasen yksi (turha) kaava lisää:
Trigonometrinen interpolaatio
peruskaava (interpoloiva funktio):
kulmasuureena asteet:
f(x) = y1 + 1/2 {(y1 - y2) cos[(x - x1)/(x2 - x1) * 180°] - (y1 - y2)}
kulmasuureena radiaanit:
f(x) = y1 + 1/2 {(y1 - y2) cos[(x - x1)/(x2 - x1) * π] - (y1 - y2)}
Interpoloitaessa arvoja funktio rajataan suljetulle välille [x1, x2]
Palauttaa y-koordinaatin annetulle x-koordinaatille trigonometriseltä interpolaatiokäyrältä. Jos edellinen lause oli pelkkää sanahelinää, aja koodi ja katso niin ymmärrät. DrawTrigCurve() piirtää annetun käyränpätkän halutulla tarkkuudella.
Code: Select all
//Trigonometric interpolation/Trigonometrinen interpolaatio
//©2008 by Pontus "SPuntte" Lundström
SCREEN 800, 600
SetWindow "l33t.h4><.lullorz"
px# = -350
py# = 230
pallot = True
tarkkuus% = 15
Repeat
Color 255, 255, 255
Text 5, 5, "Hiiren ykkösnappi alustaa käyrän alkupisteen hiiren koordinaatteihin"
Text 5, 20, "Kakkosnappi kytkee pallot päälle/pois Tila: " + pallot
Text 5, 35, "Rulla muuttaa käyrän piirtotarkkuutta Arvo: " + tarkkuus%
If MouseHit(1) Then
px# = MouseWX()
py# = MouseWY()
EndIf
If MouseHit(2) Then pallot = Not pallot
tarkkuus% = tarkkuus% + MouseMoveZ()
If tarkkuus% < 1 Then tarkkuus% = 1
DrawToWorld ON
//Käyrä
Color 0, 0, 255:DrawTrigCurve(px#, py#, MouseWX(), MouseWY(), tarkkuus%)
//Pisteet
If pallot Then
If MouseWX() > px#
For i = px# To MouseWX() Step 10
Color 255, 0, 0:Circle i, TrigCurve(px#, py#, MouseWX(), MouseWY(), i), 2
Next i
Else
For i = px# To MouseWX() Step -10
Color 255, 0, 0:Circle i, TrigCurve(px#, py#, MouseWX(), MouseWY(), i), 2
Next i
EndIf
EndIf
DrawToWorld OFF
DrawScreen
Forever
Function TrigCurve(x1#, y1#, x2#, y2#, p#)
Return y1# + 0.5 * ((y1# - y2#) * Cos((p# - x1#)/(x2# - x1#)*180.0) - (y1# - y2#))
EndFunction
Function DrawTrigCurve(x1#, y1#, x2#, y2#, div%=20)
ox# = x1#
oy# = y1#
For i = 1 To div%
x# = x1# + i * (x2# - x1#)/div%
y# = y1# + 0.5 * ((y1# - y2#) * Cos(Float(i)/Float(div%)*180.0) - (y1# - y2#))
Line ox#, oy#, x#, y#
ox# = x#
oy# = y#
Next i
EndFunction
Syntaksi wrote:TrigCurve(x1#, y1#, x2#, y2#, p#)
Palauttaa pisteiden (x1#, y1#) ja (x2#, y2#) väliseltä interpolaatiokäyrältä x-koordinaattia p# vastaavan y-koordinaatin.
DrawTrigCurve(x1#, y1#, x2#, y2#, div%=20)
Piirtää pisteiden (x1#, y1#) ja (x2#, y2#) välisen interpolaatiokäyrän jakamalla sen div% osaan, eli piirtämällä peräkkäin div% kpl janoja. Käyttää maailmakoordinaatteja ja nykyistä piirtoväriä.
Tämä siis perustuu siihen, että märitetään trigonometrinen funktio, jonka vierekkäiset huiput (aallon pohja ja harja) ovat kahdessa halutussa mielivaltaisessa pisteessä. Vetäsin tän ihan empiirisesti (=kokeellisesti) päästäni, kun oli tarvetta (pehmeän maaston luomiseen matemaattisesti, kokeilkaa vaikka, sopii erinomaisesti!), etten tiedä löytyykö yksinkertaisempaa tapaa. Matemaattisesti en jaksanut tätä todistaa paikkansapitäväksi, mutta graafisella laskimella kyllä katselin, että pitäis päteä suurinpiirtein kaikille arvoille. Ja voihan tätä ihan puhtaasti matikassakin hyödyntää. En kyllä usko, että edes lukion ysikurssin kokeessa kysyttäisiin