Advertisement
Guest User

Untitled

a guest
Sep 5th, 2015
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.42 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "image"
  6. "image/color"
  7. "image/png"
  8. "math"
  9. "math/rand"
  10. "os"
  11. "time"
  12. )
  13.  
  14. type Expr interface {
  15. Eval(x float64, y float64) (r, g, b float64)
  16. }
  17.  
  18. func average(x,y,w float64) float64 {
  19. return w * x + (1.0 - w) * y
  20. }
  21.  
  22. type SumExpr struct {
  23. e1 Expr
  24. e2 Expr
  25. }
  26.  
  27. func (e SumExpr) Eval(x, y float64) (r, g, b float64) {
  28. r1,g1,b1 := e.e1.Eval(x,y)
  29. r2,g2,b2 := e.e2.Eval(x,y)
  30. r = average(r1,r2,0.5)
  31. g = average(g1,g2,0.5)
  32. b = average(b1,b2,0.5)
  33. return
  34. }
  35.  
  36. func tent(x float64) float64 {
  37. return 1.0 - 2.0 * math.Abs(x)
  38. }
  39.  
  40. type TentExpr struct {
  41. e1 Expr
  42. }
  43.  
  44. func (e TentExpr) Eval(x, y float64) (r, g, b float64) {
  45. r1,g1,b1 := e.e1.Eval(x,y)
  46. r = tent(r1)
  47. g = tent(g1)
  48. b = tent(b1)
  49. return
  50. }
  51.  
  52. func pown(x float64, y int) float64 {
  53. acc := 1.0
  54. for i:=0; i<y;i++ {acc *= x }
  55. return acc
  56. }
  57.  
  58. func well(x float64) float64 {
  59. return 1.0 - 2.0 / pown(1.0 + x * x,8)
  60. }
  61.  
  62. type WellExpr struct {
  63. e1 Expr
  64. }
  65.  
  66. func (e WellExpr) Eval(x, y float64) (r, g, b float64) {
  67. r1,g1,b1 := e.e1.Eval(x,y)
  68. r = well(r1)
  69. g = well(g1)
  70. b = well(b1)
  71. return
  72. }
  73.  
  74. type SinExpr struct {
  75. e1 Expr
  76. phase float64
  77. freq float64
  78. }
  79.  
  80. func makeSinExpr(e Expr) Expr {
  81. return SinExpr{e, rand.Float64() * math.Pi, (rand.Float64() * 5.0) + 1.0}
  82. }
  83.  
  84. func (e SinExpr) Eval(x, y float64) (r, g, b float64) {
  85. r1, g1, b1 := e.e1.Eval(x, y)
  86. r = math.Sin(e.phase + r1*e.freq)
  87. g = math.Sin(e.phase + g1*e.freq)
  88. b = math.Sin(e.phase + b1*e.freq)
  89. return
  90. }
  91.  
  92. type MaxExpr struct {
  93. e1 Expr
  94. e2 Expr
  95. }
  96.  
  97. func (e MaxExpr) Eval(x, y float64) (r, g, b float64) {
  98. r1, g1, b1 := e.e1.Eval(x, y)
  99. r2, g2, b2 := e.e2.Eval(x, y)
  100. r = math.Max(r1, r2)
  101. g = math.Max(g1, g2)
  102. b = math.Max(b1, b2)
  103. return
  104. }
  105.  
  106. type ModExpr struct {
  107. e1 Expr
  108. e2 Expr
  109. }
  110.  
  111. func (e ModExpr) Eval(x, y float64) (r, g, b float64) {
  112. r1, g1, b1 := e.e1.Eval(x, y)
  113. r2, g2, b2 := e.e2.Eval(x, y)
  114. r = math.Mod(r1, r2)
  115. g = math.Mod(g1, g2)
  116. b = math.Mod(b1, b2)
  117. return
  118. }
  119.  
  120. type SquareExpr struct {
  121. e1 Expr
  122. }
  123.  
  124. func (e SquareExpr) Eval(x, y float64) (r, g, b float64) {
  125. r1, g1, b1 := e.e1.Eval(x, y)
  126. r = r1 * r1
  127. g = g1 * g1
  128. b = b1 * b1
  129. return
  130. }
  131.  
  132. type ProductExpr struct {
  133. e1 Expr
  134. e2 Expr
  135. }
  136.  
  137. func (e ProductExpr) Eval(x, y float64) (r, g, b float64) {
  138. r1, g1, b1 := e.e1.Eval(x, y)
  139. r2, g2, b2 := e.e2.Eval(x, y)
  140. r = r1 * r2
  141. g = g1 * g2
  142. b = b1 * b2
  143. return
  144. }
  145.  
  146. type MixExpr struct {
  147. e1 Expr
  148. e2 Expr
  149. e3 Expr
  150. }
  151.  
  152. func (e MixExpr) Eval(x, y float64) (r, g, b float64) {
  153. n, _, _ := e.e1.Eval(x, y)
  154. w := 0.5 * (n + 1.0)
  155. r1,g1,b1 := e.e2.Eval(x, y)
  156. r2,g2,b2 := e.e3.Eval(x, y)
  157. r = average(r1,r2,w)
  158. g = average(g1,g2,w)
  159. b = average(b1,b2,w)
  160. return
  161. }
  162.  
  163. type LevelExpr struct {
  164. e1 Expr
  165. e2 Expr
  166. e3 Expr
  167. threshold float64
  168. }
  169.  
  170. func (e LevelExpr) Eval(x, y float64) (r, g, b float64) {
  171. r1,g1,b1 := e.e1.Eval(x, y)
  172. r2,g2,b2 := e.e2.Eval(x, y)
  173. r3,g3,b3 := e.e3.Eval(x, y)
  174. r = r2
  175. if r1 < e.threshold { r = r3 }
  176. g = g2
  177. if g1 < e.threshold { g = g3 }
  178. b = b2
  179. if b1 < e.threshold { b = b3 }
  180. return
  181. }
  182.  
  183. func makeLevelExpr(e1,e2,e3 Expr) Expr {
  184. threshold := (rand.Float64()*2.0) - 1.0
  185. return LevelExpr{e1,e2,e3,threshold}
  186. }
  187.  
  188. type XExpr struct{}
  189.  
  190. func (XExpr) Eval(x, _ float64) (r, g, b float64) {
  191. r = x
  192. g = x
  193. b = x
  194. return
  195. }
  196.  
  197. type YExpr struct{}
  198.  
  199. func (YExpr) Eval(_, y float64) (r, g, b float64) {
  200. r = y
  201. g = y
  202. b = y
  203. return
  204. }
  205.  
  206. type ConstantExpr struct {
  207. r float64
  208. g float64
  209. b float64
  210. }
  211.  
  212. func (c ConstantExpr) Eval(x, y float64) (r, g, b float64) {
  213. r = c.r
  214. g = c.g
  215. b = c.b
  216. return
  217. }
  218.  
  219. func makeConstantExpr() Expr {
  220. return ConstantExpr{rand.Float64(), rand.Float64(), rand.Float64()}
  221. }
  222.  
  223. func generateExpr(count int) Expr {
  224. if count == 0 {
  225. switch rand.Intn(3) {
  226. case 0: return XExpr{}
  227. case 1: return YExpr{}
  228. default: return makeConstantExpr()
  229. }
  230. }
  231. switch rand.Intn(10) {
  232. case 0:
  233. return MixExpr{generateExpr(count - 1), generateExpr(count - 1), generateExpr(count -1)}
  234. case 1:
  235. return ProductExpr{generateExpr(count - 1), generateExpr(count - 1)}
  236. case 2:
  237. return ModExpr{generateExpr(count - 1), generateExpr(count - 1)}
  238. case 3:
  239. return MaxExpr{generateExpr(count - 1), generateExpr(count - 1)}
  240. case 4:
  241. return SquareExpr{generateExpr(count - 1)}
  242. case 5:
  243. return WellExpr{generateExpr(count - 1)}
  244. case 6:
  245. return TentExpr{generateExpr(count - 1)}
  246. case 7:
  247. return SumExpr{generateExpr(count - 1), generateExpr(count - 1)}
  248. case 8:
  249. return makeSinExpr(generateExpr(count - 1))
  250. default:
  251. return makeLevelExpr(generateExpr(count - 1), generateExpr(count - 1), generateExpr(count -1))
  252. }
  253. }
  254.  
  255. func toByte(x float64) uint8 {
  256. return uint8(math.Max(0.0, math.Min(255.0, 128.0*(x+1.0))))
  257. }
  258.  
  259. func createImage(width int, height int, e *Expr) image.Image {
  260. imgRect := image.Rect(0, 0, width, height)
  261. img := image.NewRGBA(imgRect)
  262. for y := 0; y < height; y++ {
  263. for x := 0; x < width; x++ {
  264. u := (float64(x-width/2)+0.5)/float64(width)
  265. v := (float64(y-height/2)+0.5)/float64(height)
  266. r, g, b := (*e).Eval(u, v)
  267. c := color.RGBA{toByte(r), toByte(g), toByte(b), 255}
  268. img.SetRGBA(x, y, c)
  269. }
  270. }
  271. return img
  272. }
  273.  
  274. func main() {
  275. rand.Seed(time.Now().UTC().UnixNano())
  276. for i:=100;i<=999;i++ {
  277. out, _ := os.Create(fmt.Sprintf("./output%d.png",i))
  278. defer out.Close()
  279. //e := makeSinExpr(ProductExpr{YExpr{}, MaxExpr{XExpr{}, makeConstantExpr()}})
  280. e := generateExpr(6)
  281. img := createImage(640, 480, &e)
  282. png.Encode(out, img)
  283. }
  284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement