python正弦波变方波_Python之OpenGL笔记(19):正弦波叠加为方波的GLSL实现
一、目的
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实现相关推荐
- python画平面直角坐标系_Python之OpenGL笔记(20):画平面直角坐标系
一.目的 1.画平面直角坐标系: 二.程序运行结果 平面直角坐标系 三.numpy.hstack()函数 1.函数 函数原型:numpy.hstack(tup),其中tup是arrays序列,阵列必须 ...
- python 曲面_Python之OpenGL笔记(35):曲面物体的构建
一.目的 1.曲面物体的构建画球体: 2.棋盘纹理着色器应用: 二.程序运行结果 棋盘纹理着色器应用 三.曲面物体的构建基本原理 吴亚峰<OpenGL ES 3.x游戏开发>(上卷)内容 ...
- python绘制六角星外廓_Python之OpenGL笔记(32):正交投影画六角星
一.目的 1.摄像机应用,正交投影画六角星: 二.程序运行结果 三.摄像机的设置 吴亚峰<OpenGL ES 3.x游戏开发>(上卷)内容 从日常生活的经验中可以很容易地了解到,随着摄像机 ...
- python画四边形_Python之OpenGL笔记(12):画纹理四边形
一.目的 1.画一个四边形并加载纹理. 二.程序运行结果 三.纹理 纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节. 为了能够把纹理映射(Map)到四边形上,我们需要指定四边 ...
- math python 向上取整_Python成为专业人士笔记-各数学运算操作深度剖析
"专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com Python可以执行常见的数学运算符,包括整 ...
- python按位翻转_Python成为专业人士笔记-位操作符
"专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com 按位操作符直接操作二进制的字符串,这些是最基本 ...
- opencv python 直方图反向投影_python OpenCV学习笔记直方图反向投影的实现
本文介绍了python OpenCV学习笔记直方图反向投影的实现,分享给大家,具体如下: 它用于图像分割或寻找图像中感兴趣的对象.简单地说,它创建一个与我们的输入图像相同大小(但单通道)的图像,其中每 ...
- python 全部缩进一行_Python成为专业人士笔记–程序行空白及tab缩进的作用
"专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com python中的空白tab缩进 Python ...
- python如何下载安装glfw_Python之OpenGL笔记(1):窗口工具包GLFW的安装
一.OpenGL简介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口(Application programming interface)的规 ...
- python显示变量值_Python 中如何打印变量值
展开全部 python打印变量的值需32313133353236313431303231363533e78988e69d8331333366306435要用到print语句,具体的使用方法如下: 1. ...
最新文章
- python语法怎么读-python怎么读sql数据?
- MVC4实现批量更新数据
- java学习与总结:反射及动态代理
- 取代C语言的标准输入输出:cin 和 cout【C++标准输入输出】
- 介绍一个Excel批量处理软件
- Little Sub and Balloons
- LVS(8)——tcpdump查看数据包到底如何传递
- 工资管理信息系统java_java+sql server,工资管理信息系统,源程序+数据库+报告
- w8计算机配置要求,win8系统最低配置要求有哪些|win8系统是否有最低配置要求-系统城...
- .NET 6 中的 ConfigurationManager
- java typereference_记录一下jackson中TypeReference的使用
- u盘模式 linux hi3518,嵌入式 RT3070_STA驱动移植到hi3518c平台小结
- webpack 无法加载文件 C:\Users\User\AppData\Roaming\npm\webpack.ps1,因为在此系统上禁止运行脚本。
- 【渝粤教育】电大中专计算机职业素养 (11)作业 题库
- 在 cmd 中启动 Android 模拟器
- TK1+yolo安装指南
- mysql约束简单理解
- 保卫资金链:资金链的五种死法和五种活法
- UPS=蓄电池+逆变器?
- 【毕业设计】深度学习车牌识别系统 - yolo python