January 23, 2021, 05:07:17 AM
Welcome,
Guest
. Please
login
or
register
.
Did you miss your
activation email
?
1 Hour
1 Day
1 Week
1 Month
Forever
Login with username, password and session length
Home
Forum
Help
Search
Gallery
Login
Register
SyntaxBomb - Indie Coders
»
Languages & Coding
»
Blitz Code Archives
»
Algorithms
»
[bmx] Interpolation by Pineapple [ 1+ years ago ]
« previous
next »
Print
Pages: [
1
]
Go Down
Author
Topic: [bmx] Interpolation by Pineapple [ 1+ years ago ] (Read 644 times)
BlitzBot
Jr. Member
Posts: 1
[bmx] Interpolation by Pineapple [ 1+ years ago ]
«
on:
June 29, 2017, 12:28:43 AM »
Title :
Interpolation
Author :
Pineapple
Posted :
1+ years ago
Description :
Linear, cosine, cubic, and hermite interpolation functions
Code :
Code: BlitzMax
' --+-----------------------------------------------------------------------------------------+--
' | This code was originally written by Sophie Kirschner (sophiek@pineapplemachine.com) |
' | It is released as public domain. Please don't interpret that as liberty to claim credit |
' | that isn't yours, or to sell this code when it could otherwise be obtained for free |
' | because that would be a really shitty thing of you to do. |
' --+-----------------------------------------------------------------------------------------+--
' these functions were adapted from the interpolation algorithms described at
' http://freespace.virgin.net/hugo.elias/models/m_perlin.htm
' http://www.blitzbasic.com/codearcs/codearcs.php?code=781
SuperStrict
Import
brl.math
' for interpolate_cosine
' example code
Rem
Graphics
512
,
512
Local
pix_linear:TPixmap=CreatePixmap
(
128
,
256
,PF_RGB888
)
Local
pix_cosine:TPixmap=pix_linear.copy
(
)
Local
pix_cubic:TPixmap=pix_linear.copy
(
)
Local
pix_hermite:TPixmap=pix_linear.copy
(
)
Local
begin_r%=
0
Local
begin_g%=
10
Local
begin_b%=
32
Local
end_r%=
255
Local
end_g%=
70
Local
end_b%=
4
Local
before_r%=
0
Local
before_g%=
0
Local
before_b%=
0
Local
after_r%=
255
Local
after_g%=
255
Local
after_b%=
255
For
Local
y%=
0
Until
pix_linear.height
' linear
Local
value!=y/
Double
(
pix_linear.height
)
Local
red%= interpolate_linear
(
begin_r,end_r,value
)
Local
green%=interpolate_linear
(
begin_g,end_g,value
)
Local
blue%= interpolate_linear
(
begin_b,end_b,value
)
red=
Min
(
255
,
Max
(
0
,red
)
)
;green=
Min
(
255
,
Max
(
0
,green
)
)
;blue=
Min
(
255
,
Max
(
0
,blue
)
)
Local
rgb_linear%=red
Shl
16
| green
Shl
8
| blue
' cosine
red%= interpolate_cosine
(
begin_r,end_r,value
)
green%=interpolate_cosine
(
begin_g,end_g,value
)
blue%= interpolate_cosine
(
begin_b,end_b,value
)
red=
Min
(
255
,
Max
(
0
,red
)
)
;green=
Min
(
255
,
Max
(
0
,green
)
)
;blue=
Min
(
255
,
Max
(
0
,blue
)
)
Local
rgb_cosine%=red
Shl
16
| green
Shl
8
| blue
' cubic
red%= interpolate_cubic
(
before_r,begin_r,end_r,after_r,value
)
green%=interpolate_cubic
(
before_g,begin_g,end_g,after_g,value
)
blue%= interpolate_cubic
(
before_b,begin_b,end_b,after_b,value
)
red=
Min
(
255
,
Max
(
0
,red
)
)
;green=
Min
(
255
,
Max
(
0
,green
)
)
;blue=
Min
(
255
,
Max
(
0
,blue
)
)
Local
rgb_cubic%=red
Shl
16
| green
Shl
8
| blue
' hermite
red%= interpolate_hermite
(
before_r,begin_r,end_r,after_r,value,
0.5
,
0.5
)
green%=interpolate_hermite
(
before_g,begin_g,end_g,after_g,value,
0.5
,
0.5
)
blue%= interpolate_hermite
(
before_b,begin_b,end_b,after_b,value,
0.5
,
0.5
)
red=
Min
(
255
,
Max
(
0
,red
)
)
;green=
Min
(
255
,
Max
(
0
,green
)
)
;blue=
Min
(
255
,
Max
(
0
,blue
)
)
Local
rgb_hermite%=red
Shl
16
| green
Shl
8
| blue
For
Local
x%=
0
Until
pix_linear.width
pix_linear.WritePixel
(
x,y,rgb_linear
)
pix_cosine.WritePixel
(
x,y,rgb_cosine
)
pix_cubic.WritePixel
(
x,y,rgb_cubic
)
pix_hermite.WritePixel
(
x,y,rgb_hermite
)
Next
Next
Local
start_y%=
0
Local
end_y%=
0
Local
before_y%=
0
Local
after_y%=
0
Local
editpoint%=
0
Repeat
Cls
DrawPixmap pix_linear,
0
,
0
DrawPixmap pix_cosine,
128
,
0
DrawPixmap pix_cubic,
256
,
0
DrawPixmap pix_hermite,
384
,
0
lines before_y,start_y,end_y,after_y,
128
,
382
,
256
SetColor
255
,
255
,
255
DrawText
"Linear"
,
2
,
2
DrawText
"Cosine"
,
130
,
2
DrawText
"Cubic"
,
258
,
2
DrawText
"Hermite"
,
386
,
2
SetColor
128
,
128
,
128
DrawText
"Linear"
,
2
,
260
SetColor
255
,
0
,
0
DrawText
"Cosine"
,
2
,
280
SetColor
0
,
255
,
0
DrawText
"Cubic"
,
2
,
300
SetColor
255
,
255
,
0
DrawText
"Hermite"
,
2
,
320
Local
modifier%=KeyDown
(
key_down
)
-KeyDown
(
key_up
)
If
KeyHit
(
key_left
)
Or
KeyHit
(
key_right
)
Then
editpoint=
Not
editpoint
If
editpoint
Then
start_y:+modifier
Else
end_y:+modifier
start_y=
Min
(
100
,
Max
(
-
100
,start_y
)
)
end_y=
Min
(
100
,
Max
(
-
100
,end_y
)
)
Flip
Until
KeyDown
(
key_escape
)
Or
AppTerminate
(
)
Function
lines
(
a%,b%,c%,d%,x%,y%,w%
)
For
Local
i%=
0
Until
w
Local
value!=i/
Double
(
w
)
SetColor
128
,
128
,
128
Plot x+i,y+interpolate_linear
(
b,c,value
)
SetColor
255
,
0
,
0
Plot x+i,y+interpolate_cosine
(
b,c,value
)
SetColor
0
,
255
,
0
Plot x+i,y+interpolate_cubic
(
a,b,c,d,value
)
SetColor
255
,
255
,
0
Plot x+i,y+interpolate_hermite
(
a,b,c,d,value,
0.5
,
0.5
)
Next
End
Function
EndRem
' a --- b
Function
interpolate_linear!
(
a#,b#,x!
)
Return
a*
(
1
-x
)
+b*x
End
Function
' a --- b
Function
interpolate_cosine!
(
a#,b#,x!
)
Local
f!=
(
1
-Cos
(
x*
180
)
)
*.5
Return
a*
(
1
-f
)
+b*f
End
Function
' a b --- c d
Function
interpolate_cubic!
(
a#,b#,c#,d#,x!
)
Local
p#=
(
d-c
)
-
(
a-b
)
Return
p*x*x*x+
(
(
a-b
)
-p
)
*x*x+
(
c-a
)
*x+b
End
Function
' a b --- c d
Function
interpolate_hermite!
(
a#,b#,c#,d#,x!,tension#,bias#
)
Local
x2!=x*x
Local
x3!=x*x2
Local
xb!=
(
1
+bias
)
*
(
1
-tension
)
/
2
!
Return
(
2
*x3-
3
*x2+
1
)
*b+
(
(
(
x3-
2
*x2+x
)
*
(
a+c
)
)
+
(
x3-x2
)
*
(
b+d
)
)
*xb+
(
3
*x2-
2
*x3
)
*c
End
Function
Comments :
none...
Logged
Print
Pages: [
1
]
Go Up
« previous
next »
SyntaxBomb - Indie Coders
»
Languages & Coding
»
Blitz Code Archives
»
Algorithms
»
[bmx] Interpolation by Pineapple [ 1+ years ago ]
SimplePortal 2.3.6 © 2008-2014, SimplePortal