在CircuitPython中创建火焰动画

Adafruit CircuitPython相关
MicroPython重要分支
回复
头像
shaoziyang
帖子: 3919
注册时间: 2019年 10月 21日 13:48

在CircuitPython中创建火焰动画

#1

帖子 shaoziyang »

在CircuitPython中创建火焰动画,通过两个简单噪声函数来调节色调和亮度。

图片


https://github.com/Factoid/SimplexNoise
 
 

头像
shaoziyang
帖子: 3919
注册时间: 2019年 10月 21日 13:48

Re: 在CircuitPython中创建火焰动画

#2

帖子 shaoziyang »

参考程序

Code: Select all

# Python implementation of simplex noise, based on this implementation:
# https://github.com/SRombauts/SimplexNoise/blob/master/references/SimplexNoise.java
# Original code by Stefan Gustavson
# Port by Adrian Cheater (c 2021)
# This code is licened LGPL

from math import *;

p = [151,160,137,91,90,15,
  131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
  190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
  88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
  77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
  102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
  135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
  5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
  223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
  129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
  251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
  49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
  138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]

perm = p*2;
permMod12 = [i % 12 for i in perm]

F2 = 0.5*(sqrt(3.0)-1.0)
G2 = (3.0-sqrt(3.0))/6.0
F3 = 1.0/3.0
G3 = 1.0/6.0
F4 = (sqrt(5.0)-1.0)/4.0
G4 = (5.0-sqrt(5.0))/20.0

class Grad:
    def __init__(self, x, y, z):
      self.x = x
      self.y = y
      self.z = z

grad3 = [Grad(1,1,0),Grad(-1,1,0),Grad(1,-1,0),Grad(-1,-1,0),
         Grad(1,0,1),Grad(-1,0,1),Grad(1,0,-1),Grad(-1,0,-1),
         Grad(0,1,1),Grad(0,-1,1),Grad(0,1,-1),Grad(0,-1,-1)]

def dot( g, x, y ):
    return g.x*x + g.y*y

def fastfloor(x):
    xi = int(x)
    if x<xi:
        return xi-1
    else:
        return xi

def noise(xin, yin):
    s = (xin+yin)*F2
    i = fastfloor(xin+s)
    j = fastfloor(yin+s)
    t = (i+j)*G2
    X0 = i-t
    Y0 = j-t
    x0 = xin-X0
    y0 = yin-Y0
    if(x0>y0):
      i1=1
      j1=0
    else:
      i1=0
      j1=1
    x1 = x0 - i1 + G2
    y1 = y0 - j1 + G2
    x2 = x0 - 1.0 + 2.0 * G2
    y2 = y0 - 1.0 + 2.0 * G2
    ii = i & 255;
    jj = j & 255;
    gi0 = permMod12[ii+perm[jj]];
    gi1 = permMod12[ii+i1+perm[jj+j1]];
    gi2 = permMod12[ii+1+perm[jj+1]];
    t0 = 0.5 - x0*x0-y0*y0
    if(t0<0):
      n0 = 0.0;
    else:
      t0 *= t0
      n0 = t0 * t0 * dot(grad3[gi0], x0, y0)
    t1 = 0.5 - x1*x1-y1*y1
    if(t1<0):
      n1 = 0.0
    else:
      t1 *= t1
      n1 = t1 * t1 * dot(grad3[gi1], x1, y1)
    t2 = 0.5 - x2*x2-y2*y2
    if(t2<0):
      n2 = 0.0
    else:
      t2 *= t2
      n2 = t2 * t2 * dot(grad3[gi2], x2, y2)
    return 70.0 * (n0 + n1 + n2)
 

回复

  • 随机主题
    回复总数
    阅读次数
    最新文章