• OpenGL 4 : 一个漂亮的心 For you, My Love


    画一个心形有非常多公式能够使用,以下这个公式我觉得最完美了:

    float x = R * 16 * pow(sin(theta), 3);
    float y = R * (13 * cos(theta) - 5*cos(2*theta)	- 2*cos(3*theta) - cos(4*theta));

    画出来的心形最美丽,最原始的笛卡尔的心形是个肥心,没这个好看,呵呵。

    效果例如以下:



    数学參考:

    http://mathworld.wolfram.com/HeartCurve.html

    http://www.mathematische-basteleien.de/heart.htm


    #pragma once
    #include <stdio.h>
    #include <glglew.h>
    #include <GLfreeglut.h>
    #include "math_3d.h"
    #include <cmath>
    
    namespace Tutorial2_Heart
    {
    	const static float PI = 3.1415926f;
    	int gSegments;
    	GLuint VBO;
    
    	void genHeart_2(Vector3f *vers, int offset, int segments,
    		float ox, float oy, float R = 0.05)
    	{
    		for (int i = 0; i < segments; i++)
    		{
    			float theta = 2.0f * PI * float(i) / float(segments);
    
    			float x = R * 16 * pow(sin(theta), 3);
    			float y = R * (13 * cos(theta) - 5*cos(2*theta)
    				- 2*cos(3*theta) - cos(4*theta));
    
    			vers[offset+i] = Vector3f(ox+x, oy+y, 0.0f);
    		}
    	}
    
    	void genGeometry()
    	{
    		const int segments = 360;
    		Vector3f vers[segments];
    		gSegments = segments;
    		genHeart_2(vers, 0, segments, 0.f, 0.f);
    
    		glGenBuffers(1, &VBO);
    		glBindBuffer(GL_ARRAY_BUFFER, VBO);
    		glBufferData(GL_ARRAY_BUFFER, sizeof(vers), vers, GL_STATIC_DRAW);
    	}
    
    	static void renderScene()
    	{
    		glClear(GL_COLOR_BUFFER_BIT);
    
    		glEnableVertexAttribArray(0);
    		glBindBuffer(GL_ARRAY_BUFFER, VBO);
    		glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    
    		glDrawArrays(GL_LINE_LOOP, 0, gSegments);
    
    		glDisableVertexAttribArray(0);
    
    		glutSwapBuffers();
    	}
    
    	void initCallBack()
    	{
    		glutDisplayFunc(renderScene);
    	}
    
    	int run(int argv, char **argc)
    	{
    		glutInit(&argv, argc);
    		glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    		glutInitWindowSize(600, 600);
    		glutInitWindowPosition(50, 50);
    		glutCreateWindow("Heart Shape");
    
    		initCallBack();
    
    		GLenum res = glewInit();
    		if (res != GLEW_OK)
    		{
    			fprintf(stderr, "Error:'%s'
    ", glewGetErrorString(res));
    			return 1;
    		}
    
    		genGeometry();
    
    		glClearColor(0.8f, 0.1f, 0.1f, 0.0f);
    
    		glutMainLoop();
    
    		return 0;
    	}
    }



  • 相关阅读:
    redis入门
    elementui入门
    1387:搭配购买(buy)
    P1536 村村通
    1388:家谱(gen)
    1389:亲戚
    1385:团伙(group)
    P1305 新二叉树
    P5076 【深基16.例7】普通二叉树(简化版)
    二叉搜索树(BST)模版
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/3899714.html
Copyright © 2020-2023  润新知