Tunnel Effect 【Graphics】

本文介绍了一个基于OpenGL的隧道视觉效果实现方法。通过非线性变换表来调整纹理映射,结合动态纹理更新技术,实现了一种类似从隧道内部观看的效果。文章提供了完整的源代码,并参考了http://lodev.org/cgtutor/tunnel.html的原理。

晚上看到大牛http://fabiensanglard.net/ 的好早的文章将Tunnel Effect的,觉得挺好看,根据他给的算法,自己实现了opengl版,读BMP函数直接网上摘得

他给的链接里面有Tunnel Effect的详细原理  http://lodev.org/cgtutor/tunnel.html 

/* 
=========================================
  参考:
    http://lodev.org/cgtutor/tunnel.html
    http://fabiensanglard.net/Tunnel/index.php
=========================================
*/
#include <cstdio>
#include <cmath>
#include <gl/glut.h>

#pragma comment(lib, "glut32.lib")

typedef struct BMPImage {
  int width, height;
  unsigned char *data;
  void ReleaseRes() {
    delete [] data;
  }
}BmpImage;

bool loadBMP_custom(const char *imagepath, BMPImage &bmpData) {
  printf("Reading image %s\n", imagepath);

  // Data read from the header of the BMP file
  unsigned char header[54];
  unsigned int dataPos;
  unsigned int imageSize;
  unsigned int width, height;
  unsigned char *data;
  // Open the file
  FILE * file = fopen(imagepath,"rb");
  if (!file) {
    printf("%s could not be opened. Are you in the right directory ? Don't forget to read the FAQ !\n", imagepath); 
    return false;
  }

  // Read the header, i.e. the 54 first bytes

  // If less than 54 byes are read, problem
  if (fread(header, 1, 54, file)!=54){ 
    printf("Not a correct BMP file\n");
    return 0;
  }
  // A BMP files always begins with "BM"
  if (header[0]!='B' || header[1]!='M'){
    printf("Not a correct BMP file\n");
    return 0;
  }
  // Make sure this is a 24bpp file
  if ( *(int*)&(header[0x1E])!=0  )         {printf("Not a correct BMP file\n");    return 0;}
  if ( *(int*)&(header[0x1C])!=24 )         {printf("Not a correct BMP file\n");    return 0;}

  // Read the information about the image
  dataPos    = *(int*)&(header[0x0A]);
  imageSize  = *(int*)&(header[0x22]);
  width      = *(int*)&(header[0x12]);
  height     = *(int*)&(header[0x16]);

  // Some BMP files are misformatted, guess missing information
  if (imageSize==0)    imageSize=width*height*3; // 3 : one byte for each Red, Green and Blue component
  if (dataPos==0)      dataPos=54; // The BMP header is done that way

  // Create a buffer
  data = new unsigned char [imageSize];

  // Read the actual data from the file into the buffer
  fread(data,1,imageSize,file);
  bmpData.data = data;
  bmpData.width = width;
  bmpData.height = height;

  // Everything is in memory now, the file wan be closed
  fclose (file);

  return true;
}

#define screenWidth 400
#define screenHeight 400

static BMPImage bmpImage;

int distanceTable[screenWidth][screenHeight];
int angleTable[screenWidth][screenHeight];
unsigned char dynamicTex[screenWidth][screenHeight][3];
static float animation;

void init() {
  glClearColor(0.0f,0.0f,0.0f,1.0f);
  glShadeModel(GL_SMOOTH);

  loadBMP_custom("./tex99.bmp", bmpImage);
  //generate non-linear transformation table
  for(int x = 0; x < screenWidth; x++)
    for(int y = 0; y < screenHeight; y++)
    {
      int angle, distance;
      float ratio = 32.0;
      distance = int(ratio * bmpImage.height / sqrt((x - screenWidth / 2.0) * (x - screenWidth / 2.0) 
        + (y - screenHeight / 2.0) * (y - screenHeight / 2.0))) % bmpImage.height;
      angle = (unsigned int)(0.5 * bmpImage.width * atan2(y - screenHeight / 2.0, x - screenWidth / 2.0) / 3.1416);
      distanceTable[x][y] = distance;
      angleTable[x][y] = angle;
    }
}

void reshape(int w, int h) {
  glViewport(0,0,w,h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(0,0,1,1);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}

void calculate() {
  animation = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
  //calculate the shift values out of the animation value
  int shiftX = int(bmpImage.width * 1.0 * animation);
  int shiftY = int(bmpImage.height * 0.25 * animation);        

  for(int x = 0; x < screenWidth; x++)
    for(int y = 0; y < screenHeight; y++)
    {
      //get the texel from the texture by using the tables, shifted with the animation values
      unsigned char *pBmpData = bmpImage.data;
      unsigned char r = pBmpData[(unsigned int)(distanceTable[x][y] + shiftX)  % bmpImage.width *3
        + (unsigned int)(angleTable[x][y] + shiftY) % bmpImage.height * bmpImage.width * 3];
      unsigned char g = pBmpData[(unsigned int)(distanceTable[x][y] + shiftX)  % bmpImage.width *3
        + (unsigned int)(angleTable[x][y] + shiftY) % bmpImage.height * bmpImage.width * 3 + 1];
      unsigned char b = pBmpData[(unsigned int)(distanceTable[x][y] + shiftX)  % bmpImage.width *3
        + (unsigned int)(angleTable[x][y] + shiftY) % bmpImage.height * bmpImage.width * 3 + 2];
      dynamicTex[x][y][0] = r;
      dynamicTex[x][y][1] = g;
      dynamicTex[x][y][2] = b;
    }
}

void display() {
  calculate();

  glDrawPixels(screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, dynamicTex);

  glutSwapBuffers();
  glutPostRedisplay();
}

int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
  glutInitWindowSize(screenWidth,screenHeight);    
  glutInitWindowPosition(200,200);
  glutCreateWindow("Tunnel Effect");
  
  init();
  glutDisplayFunc(display);
  glutReshapeFunc(reshape);
  
  glutMainLoop();
  bmpImage.ReleaseRes();

  return 0; 
}


内容概要:本文围绕“考虑电动汽车聚合可调节能力的含波动性电源电氢耦合系统多目标优化运行”展开研究,提出了一种基于Matlab代码实现的多目标优化模型。该模型深度融合电-氢耦合系统与高比例波动性可再生能源(如风电、光伏),充分挖掘电动汽车(EV)集群作为移动储能单元的灵活调节潜力,通过聚合调控提升系统对新能源的消纳能力与运行经济性。研究系统构建了电动汽车可调度能力、电解水制氢与储氢动态过程、多能源协同互补的优化调度框架,并结合智能优化算法实现经济性、低碳性与运行稳定性等多重目标的协同优化。文中配套提供了完整的Matlab仿真代码、相关数据及可能的论文支撑材料,极大地方便了模型的复现、验证与后续深化研究。; 适合人群:具备电力系统、综合能源系统、优化理论或新能源技术等相关领域基础知识的研究生、科研人员,以及从事新型电力系统规划、清洁能源消纳与智慧能源管理的工程技术人员。; 使用场景及目标:①开展高渗透率可再生能源接入下的综合能源系统多目标优化调度研究;②探究电动汽车集群在电网削峰填谷、平抑新能源出力波动及提供辅助服务方面的应用价值与潜力;③学习并掌握电氢耦合系统的建模方法、多目标优化求解技术及其在Matlab/Simulink环境下的仿真实现流程。; 阅读建议:此资源不仅提供可运行的代码,更蕴含了前沿的科研思路与创新方法,建议读者结合所提供的代码、数据与可能的论文文档,系统性地学习从问题建模、算法设计到仿真分析的完整科研过程,并重点关注其中关于需求侧资源聚合、多能互补协同与绿色低碳运行的核心理念。
内容概要:本文档名为《经济学期刊论文复现:数字化转型能促进企业的高质量发展吗》,表面上聚焦于经济学领域中数字化转型对企业高质量发展影响的研究,实则是一份涵盖多学科交叉的科研仿真代码资源合集。资源以Matlab、Simulink、Python为主要工具,系统整合了电力系统仿真、微电网优化调度、路径规划、信号处理、图像处理、机器学习预测模型等方向的可复现算法与仿真模型。尽管标题指向经济学实证分析,但内容重心在于提供顶级期刊论文的复现代码,如企业全要素生产率(TFP)测算方法(OL、FE、LP、OP、GMM)、风光储氢系统优化、需求响应与综合能源系统调度等,并融合智能优化算法与深度学习技术进行数据建模与预测分析,体现出极强的工程化与科研实用性。; 适合人群:具备一定编程基础,熟练掌握Matlab/Simulink/Python等仿真工具,从事工程仿真、经济实证研究或交叉学科科研工作的研究生、高校教师及科研人员。; 使用场景及目标:① 复现经济学顶刊论文中的计量经济模型,深入探究数字化转型对企业全要素生产率的影响机制;② 借助提供的代码资源开展电力系统故障仿真、微电网优化、多能系统调度等科研项目的算法验证与仿真分析;③ 应用机器学习与深度学习模型完成负荷预测、风电光伏出力预测、电池健康状态评估等典型实证任务; 阅读建议:此资源虽冠以经济学论文之名,实质为多领域高价值仿真代码集成,建议读者依据自身研究方向筛选适配内容,优先关注“顶刊复现”“论文复现”类项目,结合配套数据与代码进行实证推演,并通过公众号“荔枝科研社”获取完整资料与持续技术支持。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值