一、目的

1、正弦波叠加为方波的GLSL实现;

二、程序运行结果

三、正弦波合成方波的处理

1、傅里叶函数分解方波公式:

f(y) = 4/PI * (sinx+ sin3x/3 + sin5x/5 + …);

2、实际程序里面公式为:

f(y) = sinx+ sin3x/3 + sin5x/5 + …

3、键盘控制

加入了正弦波合成方波的处理,使用箭头键移动正弦波,使用上下箭头进行振幅调整,使用+,-号来调整正弦波叠加的次数。

四、源代码

"""

glfw_sin02.py

Author: dalong10

Description: Draw a SquareWave, learning OPENGL

"""

import glutils #Common OpenGL utilities,see glutils.py

import sys, random, math

import OpenGL

from OpenGL.GL import *

from OpenGL.GL.shaders import *

import numpy

import numpy as np

import glfw

strVS = """

#version 330 core

layout (location = 0) in float vertexSerial;

uniform int g_sinCnt;

uniform float g_rangeL;

uniform float g_rangeR;

uniform float g_amplitud;

const int sampleCnt=200;

vec2 createSinPostion(float posIdex,float factor,float amplitude, float rangeL, float rangeR)

{vec2 sinPos;

float range = rangeR - rangeL;

sinPos.x = (2.0 * posIdex - sampleCnt)/sampleCnt;

sinPos.y = amplitude * sin(factor * (rangeL + posIdex * range / sampleCnt));

return sinPos;

}

vec2 createSquareWave(float posIdex,int sinCnt, float amplitude, float rangeL, float rangeR)

{vec2 SquareWarvePos, sinPos;

int i = 0;

for (i = 0;i<100 ; i++)

{int f = 2 * i + 1;

sinPos =createSinPostion(posIdex, 1.0 * f, 1.0 / f, rangeL, rangeR);

SquareWarvePos.x = sinPos.x;

SquareWarvePos.y += (sinPos.y * amplitude);

if (i>=sinCnt) return SquareWarvePos;

}

return SquareWarvePos;

}

void main(){

vec2 SquareWarvePos = createSquareWave(vertexSerial,g_sinCnt,g_amplitud,g_rangeL,g_rangeR);

gl_Position = vec4(SquareWarvePos,0.0,1.0);

}

"""

strFS = """

#version 330 core

out vec3 color;

void main(){

color = vec3(1,1,0);

}

"""

class FirstSinCurve:

def __init__(self):

global sinCntIdx

global rangeLIdx

global rangeRIdx

global amplitudIdx

global g_sinCnt

global g_rangeL

global g_rangeR

global g_amplitud

sampleCnt=200

# load shaders

self.program = glutils.loadShaders(strVS, strFS)

glUseProgram(self.program)

# attributes

sinCntIdx = glGetUniformLocation(self.program, "g_sinCnt");

rangeLIdx = glGetUniformLocation(self.program, "g_rangeL");

rangeRIdx = glGetUniformLocation(self.program, "g_rangeR");

amplitudIdx = glGetUniformLocation(self.program, "g_amplitud");

# set up VBOs

vertexSerial = np.zeros(200, np.float32)

for i in range(sampleCnt):

vertexSerial[i] = i

self.vertexBuffer = glGenBuffers(1)

glBindBuffer(GL_ARRAY_BUFFER, self.vertexBuffer)

glBufferData(GL_ARRAY_BUFFER, 4*len(vertexSerial), vertexSerial, GL_STATIC_DRAW)

# Position attribute

glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0,None)

# enable arrays

glEnableVertexAttribArray(0)

def render(self):

global sinCntIdx

global rangeLIdx

global rangeRIdx

global amplitudIdx

global g_sinCnt

global g_rangeL

global g_rangeR

global g_amplitud

# use shader

sampleCnt=200

glUseProgram(self.program)

glUniform1i(sinCntIdx,g_sinCnt)

glUniform1f(rangeLIdx,g_rangeL)

glUniform1f(rangeRIdx,g_rangeR)

glUniform1f(amplitudIdx,g_amplitud)

# set up VBOs

vertexSerial = np.zeros(200, np.float32)

for i in range(sampleCnt):

vertexSerial[i] = i

self.vertexBuffer = glGenBuffers(1)

glBindBuffer(GL_ARRAY_BUFFER, self.vertexBuffer)

glBufferData(GL_ARRAY_BUFFER, 4*len(vertexSerial), vertexSerial, GL_STATIC_DRAW)

# Position attribute

glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0,None)

# enable arrays

glEnableVertexAttribArray(0)

# draw

glDrawArrays(GL_LINE_STRIP, 0, 200)

glFlush()

if __name__ == '__main__':

import sys

import glfw

import OpenGL.GL as gl

global g_sinCnt

global g_rangeL

global g_rangeR

global g_amplitud

PI = 3.14159265358979323846264

g_sinCnt = 5

g_rangeL = -3 * PI

g_rangeR = 3 * PI

g_amplitud = 1.0

def on_key(window, key, scancode, action, mods):

global g_sinCnt

global g_rangeL

global g_rangeR

global g_amplitud

if action == glfw.PRESS:

if key == glfw.KEY_ESCAPE :

glfw.set_window_should_close(window,1)

elif key == glfw.KEY_KP_ADD or key == glfw.KEY_A:

if (g_sinCnt < 100):

g_sinCnt+=1

elif key == glfw.KEY_KP_SUBTRACT or key == glfw.KEY_D:

if (g_sinCnt >=1):

g_sinCnt-=1

elif key == glfw.KEY_UP:

if (g_amplitud < 2):

g_amplitud += 0.1

elif key == glfw.KEY_DOWN:

if (g_amplitud > 0.3):

g_amplitud -= 0.1

elif key == glfw.KEY_LEFT:

g_rangeL -= 0.1

g_rangeR -= 0.1

elif key == glfw.KEY_RIGHT:

g_rangeL += 0.1

g_rangeR += 0.1

print('g_sinCnt=',g_sinCnt)

# Initialize the library

if not glfw.init():

sys.exit()

# Create a windowed mode window and its OpenGL context

window = glfw.create_window(300, 300, "draw SquareWave ", None, None)

if not window:

glfw.terminate()

sys.exit()

# Make the window's context current

glfw.make_context_current(window)

# Install a key handler

glfw.set_key_callback(window, on_key)

# Loop until the user closes the window

firstSinCurve0 = FirstSinCurve()

while not glfw.window_should_close(window):

# Render here

width, height = glfw.get_framebuffer_size(window)

ratio = width / float(height)

gl.glViewport(0, 0, width, height)

gl.glClear(gl.GL_COLOR_BUFFER_BIT)

gl.glClearColor(0.0,0.0,4.0,0.0)

firstSinCurve0.render()

# Swap front and back buffers

glfw.swap_buffers(window)

# Poll for and process events

glfw.poll_events()

glfw.terminate()

五、参考文献

1、他山随悟博客https://blog..net/t3swing/article/details/78471135

python正弦波变方波_Python之OpenGL笔记(19):正弦波叠加为方波的GLSL实现相关推荐

  1. python画平面直角坐标系_Python之OpenGL笔记(20):画平面直角坐标系

    一.目的 1.画平面直角坐标系: 二.程序运行结果 平面直角坐标系 三.numpy.hstack()函数 1.函数 函数原型:numpy.hstack(tup),其中tup是arrays序列,阵列必须 ...

  2. python 曲面_Python之OpenGL笔记(35):曲面物体的构建

    一.目的 1.曲面物体的构建画球体: 2.棋盘纹理着色器应用: 二.程序运行结果 棋盘纹理着色器应用 三.曲面物体的构建基本原理 吴亚峰<OpenGL ES 3.x游戏开发>(上卷)内容 ...

  3. python绘制六角星外廓_Python之OpenGL笔记(32):正交投影画六角星

    一.目的 1.摄像机应用,正交投影画六角星: 二.程序运行结果 三.摄像机的设置 吴亚峰<OpenGL ES 3.x游戏开发>(上卷)内容 从日常生活的经验中可以很容易地了解到,随着摄像机 ...

  4. python画四边形_Python之OpenGL笔记(12):画纹理四边形

    一.目的 1.画一个四边形并加载纹理. 二.程序运行结果 三.纹理 纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节. 为了能够把纹理映射(Map)到四边形上,我们需要指定四边 ...

  5. math python 向上取整_Python成为专业人士笔记-各数学运算操作深度剖析

    "专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com Python可以执行常见的数学运算符,包括整 ...

  6. python按位翻转_Python成为专业人士笔记-位操作符

    "专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com 按位操作符直接操作二进制的字符串,这些是最基本 ...

  7. opencv python 直方图反向投影_python OpenCV学习笔记直方图反向投影的实现

    本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下: 它用于图像分割或寻找图像中感兴趣的对象.简单地说,它创建一个与我们的输入图像相同大小(但单通道)的图像,其中每 ...

  8. python 全部缩进一行_Python成为专业人士笔记–程序行空白及tab缩进的作用

    "专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com python中的空白tab缩进 Python ...

  9. python如何下载安装glfw_Python之OpenGL笔记(1):窗口工具包GLFW的安装

    一.OpenGL简介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口(Application programming interface)的规 ...

  10. python显示变量值_Python 中如何打印变量值

    展开全部 python打印变量的值需32313133353236313431303231363533e78988e69d8331333366306435要用到print语句,具体的使用方法如下: 1. ...

最新文章

  1. python语法怎么读-python怎么读sql数据?
  2. MVC4实现批量更新数据
  3. java学习与总结:反射及动态代理
  4. 取代C语言的标准输入输出:cin 和 cout【C++标准输入输出】
  5. 介绍一个Excel批量处理软件
  6. Little Sub and Balloons
  7. LVS(8)——tcpdump查看数据包到底如何传递
  8. 工资管理信息系统java_java+sql server,工资管理信息系统,源程序+数据库+报告
  9. w8计算机配置要求,win8系统最低配置要求有哪些|win8系统是否有最低配置要求-系统城...
  10. .NET 6 中的 ConfigurationManager
  11. java typereference_记录一下jackson中TypeReference的使用
  12. u盘模式 linux hi3518,嵌入式 RT3070_STA驱动移植到hi3518c平台小结
  13. webpack 无法加载文件 C:\Users\User\AppData\Roaming\npm\webpack.ps1,因为在此系统上禁止运行脚本。
  14. 【渝粤教育】电大中专计算机职业素养 (11)作业 题库
  15. 在 cmd 中启动 Android 模拟器
  16. TK1+yolo安装指南
  17. mysql约束简单理解
  18. 保卫资金链:资金链的五种死法和五种活法
  19. UPS=蓄电池+逆变器?
  20. 【毕业设计】深度学习车牌识别系统 - yolo python

热门文章

  1. 2020年最新Java后端学习路线,适用于所有Java初学者!
  2. 使用BeautifulSoup爬取百度图片
  3. 概念学习和一般到特殊序
  4. HNOI 2009 图的同构记数 题解
  5. 制作业信息化为什么难施行?
  6. 两条平滑曲线相乘_圆锥曲线中两条相交直线的斜率之积为定值,这点你可能不会用...
  7. java 人脸活体检测_人脸识别活体检测测试案例
  8. “知识付费”里有知识吗?
  9. 计算机标准红色,标准红色cmyk值
  10. 分享一个基于labview的2048小游戏(附详细教程+代码)