C语言300行-投篮

#include "stdio。h"

#ifdef __APPLE__

#include 〈GLUT/glut。h〉

#else

#include <GL/glut.h>

#endif

#include 〈stdlib.h>

#include <stdio。h〉

#include <math.h〉

#include 〈windows.h〉

#include 〈time。h〉

static double a=0;

static double b=0.2;

static double t=0;

static double t1=0;

static double v=0;

static double i=0;

static double m=0;

static double n=0;

static double p,q,r,r1=1;

static void resize(int width,int height)//重绘回调函数

{

    const float ar=(float)width/(float)height;

    glViewport(0,0,width,height);//利用函数glViewport定义视区

    glMatrixMode(GL_PROJECTION);//投影矩阵

    glLoadIdentity();// 重置坐标系统,使投影变换复位

    glFrustum(-ar,ar,—1。0,1。0,2。0,100.0);//利用函数glFrustum定义修剪区

    glMatrixMode(GL_MODELVIEW);

    glLoadIdentity();

}

static void display(void)//显示回调

{

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除颜色缓冲区和深度缓冲区

    t=t+t1*0.0001;

    glColor3d(1,0。6,0.6);//画图颜色灰红

//绘制一个实心球,默认原点在屏幕中心与照相机重合

    glPushMatrix();

        glTranslated(—3+0。5*cos(a),-0.6+0。5*sin(a),-5);

        glRotated(0,0,0,0);

        glutSolidSphere(b,16,16);

        glPopMatrix();

    glColor3d(1,0,0);//画图颜色红

//绘制一个实心球,默认原点在屏幕中心与照相机重合

    glPushMatrix();

        glTranslated(—3+t*cos(a)*v*t1,-0。6+(t*sin(a)*v—45*t*t)*t1,—5);

        glRotated(0,0,0,0);

        glutSolidSphere(0。2*r1,16,16);

        glPopMatrix();

    glColor3d(1,1,1);//画图颜色灰

//绘制一个线框圆环

    glPushMatrix();

        glTranslated(m+2。3,n—0。6,-5);

        glRotated(100,1,0,0);

        glRotated(7。5,0,1,0);

        glutWireTorus(0。1*r1,0。6,16,16);

        glPopMatrix();

        if(pow(3—t*cos(a)*v*t1+m+2。3,2)+pow(0.6-(t*sin(a)*v-45*t*t)*t1+n—0。6,2)〈0.024)

            {

                t=t-t1*0。0001;

                r1=3。5;

            }

        else r1=1;

        for(p=-3。5,q=0.5;p<3。6;p=p+0.5)

        {

            if(pow(3-t*cos(a)*v*t1+p,2)+pow(0。6—(t*sin(a)*v—45*t*t)*t1+q,2)<0。2)r=0.4;

            else r=0。05;

            glColor3d(0,0,0);//画图颜色黑

        //绘制一个线框圆环

        glPushMatrix();

            glTranslated(p,q,—5);

            glRotated(t*5000,0,1,0);

            glutWireTorus(r,0.15,16,16);

        glPopMatrix();

        }

       for(p=-3.5,q=0;p〈3.6;p=p+0。5)

        {

            if(pow(3—t*cos(a)*v*t1+p,2)+pow(0.6-(t*sin(a)*v—45*t*t)*t1+q,2)<0。2)r=0.4;

            else r=0.05;

            glColor3d(0,0,0);//画图颜色黑

        //绘制一个线框圆环

        glPushMatrix();

            glTranslated(p,q,—5);

            glRotated(t*5000,0,1,0);

            glutWireTorus(r,0.15,16,16);

        glPopMatrix();

        }

     for(p=—3。5,q=1;p〈3。6;p=p+0.5)

        {

            if(pow(3-t*cos(a)*v*t1+p,2)+pow(0。6-(t*sin(a)*v—45*t*t)*t1+q,2)<0。2)r=0。4;

            else r=0.05;

            glColor3d(0,0,0);//画图颜色黑

        //绘制一个线框圆环

        glPushMatrix();

            glTranslated(p,q,—5);

            glRotated(t*5000,0,1,0);

            glutWireTorus(r,0.15,16,16);

        glPopMatrix();

        }

    glutSwapBuffers();//交换缓冲区

static void key(unsigned char key, int x, int y)//键盘回调函数

    switch(key)

    {

        case 27://Esc键的ASCII码为27

        case 13://回车的ASCII码为13

            exit(0);

            break;

        case 43://加号的ASCII码为43

        if (a<1.4)

        {

            a=a+0。1;

        }

        break;

        case 45://减号的ASCII码为45

        if (a〉0)

        {

            a=a-0.1;

        }

        break;

        case 49://1的ASCII码为49

            v=4;

            break;

        case 50://2的ASCII码为50

            v=8;

            break;

        case 51://3的ASCII码为51

            v=12;

            break;

        case 52://4的ASCII码为52

            v=16;

            break;

        case 53://5的ASCII码为53

            v=20;

            break;

        case 54://6的ASCII码为54

            v=24;

            break;

        case 55://7的ASCII码为55

            v=28;

            break;

        case 56://8的ASCII码为56

            v=32;

            break;

        case 57://9的ASCII码为57

            v=36;

            break;

        case 32://空格的ASCII码为32

           if(t〈0.1)

           {

               t1=1;

               b=0.001;

           }

           else

            {

                b=0.2;

                v=0;

                t1=0;

                t=0;

                m=0;

                n=0;

            }

           break;

        case 97://a的ASCII码为97

            m=m-0。2;

            break;

        case 119://w的ASCII码为119

            n=n+0。2;

            break;

        case 100://d的ASCII码为100

            m=m+0。2;

            break;

        case 115://s的ASCII码为115

            n=n-0.2;

            break;

    }

    glutPostRedisplay();//标记当前窗口需要重新绘制

}

static void idle(void)//空闲回调函数

{

    glutPostRedisplay();//标记当前窗口需要重新绘制

}

//定义一个默认的光源的属性值,使用数组来存放光源的颜色值

const GLfloat light_ambient[]  = { 0。0f, 0.0f, 0.0f, 1。0f };//光源中环境光的颜色,黑色,第四个分量1。0表示不透明。

const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1。0f };//光源中漫射光的颜色,白色

const GLfloat light_specular[] = { 1.0f, 1.0f, 1。0f, 1。0f };//光源中镜面反射光的颜色

const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0。0f };//定向光源,指定了光源的方向

//定义材质属性值,使用数组来存放材质的颜色值

const GLfloat mat_ambient[]    = { 0。7f, 0.7f, 0。7f, 1。0f }; //材质的环境颜色

const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0。8f, 1。0f };  //材质的漫射光颜色

const GLfloat mat_specular[]   = { 1.0f, 1。0f, 1。0f, 1。0f };//材质镜面反射光的颜色

const GLfloat high_shininess[] = { 100。0f };//材质的镜面反射指数

int main(int argc, char *argv[])

{

    MessageBox(NULL,"\”+、-\”控制角度\n\"1~9\"控制速度\n\"wasd\"控制框移动\n按空格发射",”介绍",MB_OK);

    glutInit(&argc, argv);//对GLUT 进行初始化

    glutInitWindowPosition(15,15);//窗口位置

    glutInitWindowSize(960,640);//窗口大小

    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);//使用双缓冲区窗口,窗口使用深度缓存

    glutCreateWindow("GLUT Shapes”);//参数将被作为窗口的标题

    glutReshapeFunc(resize);

    glutDisplayFunc(display);

    glutKeyboardFunc(key);

    glutIdleFunc(idle);//注册回调函数

    glClearColor(0。1f,0.1f,1。0f,1);//参数可以在0、1改动

    glEnable(GL_CULL_FACE);

    glCullFace(GL_BACK);

    glEnable(GL_DEPTH_TEST);// 开启剔除操作效果

    glDepthFunc(GL_LESS);// 指定深度缓冲比较值,深度值小于参考值,则通过

    glEnable(GL_LIGHT0);//启用0号光源

    glEnable(GL_NORMALIZE);// 启用自动单位化法向量

    glEnable(GL_COLOR_MATERIAL);//启用材质颜色

    glEnable(GL_LIGHTING);//启用光照

//设置0号光源的特性值

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);

    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);

    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

//设置材质的特性值,本题只设置了物体前面的材质值

    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);

    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);

    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);

    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

    glutMainLoop();//启动glut程序进入事件循环

    return EXIT_SUCCESS;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习-梯度消失/爆炸产生的原因、解决方法

在深度学习模型中&#xff0c;梯度消失和梯度爆炸现象是限制深层神经网络有效训练的主要问题之一&#xff0c;这两个现象从本质上来说是由链式求导过程中梯度的缩小或增大引起的。特别是在深层网络中&#xff0c;若初始梯度在反向传播过程中逐层被放大或缩小&#xff0c;最后导…

Linux运行Java程序,并按天输出日志

我们写好的Java程序&#xff08;非web项目&#xff09;&#xff0c;直接在服务器中敲入命令 java -jar app_name.jar就可以运行&#xff0c;如果想让程序一直在服务器中运行&#xff0c;则需要nohup命令。如下&#xff1a; nohup java -jar app_name.jar 如果需要将程序输出的日…

【Clikhouse 探秘】ClickHouse 物化视图:加速大数据分析的新利器

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

electron + vue 打包完成后,运行提示 electrion-updater 不存在

electron vue 打包完成后&#xff0c;运行提示 electrion-updater 不存在 检查配置&#xff1a; electrion-updater 放在 dependencies 下你的项目 package.json 与 electron 的 package.json 是否共用同一个&#xff0c;如果不是&#xff0c; electrion-updater 放在 elect…

【Android】Java开发语言规范

Java语言规范 命名风格 **类名&#xff1a;**使用 UpperCamelCase 风格&#xff0c;必须遵从驼峰形式&#xff0c;但以下情形例外&#xff1a;DO / BO / DTO / VO / AO&#xff0c;所有单词的首字母大写**方法名、参数名、成员变量、局部变量&#xff1a;**统一使用 lowerCam…

Mybatisplus多表关联分页查询有多种实现方式

Mybatisplus多表关联分页查询有多种实现方式 1. 使用 MyBatis-Plus 配合 XML 自定义 SQL 实现多表关联分页查询实现步骤示例代码实体类定义Mapper 接口定义Mapper XML 编写多表关联查询Service 调用分页查询 2. 使用 MyBatis-Plus 的 Wrapper 搭配 自定义 SQL 实现分页查询示例…

一些硬件知识【2024/11/2】

当需要提供功率型的输出信号的时候&#xff0c;可以在信号发生器外接功率放大器&#xff0c;这样可以提高输出功率 信号的调幅&#xff08;AM&#xff09;、调频&#xff08;FM&#xff09;与调相&#xff08;PM&#xff09;&#xff1a; 调制信号&#xff1a;控制高频振荡的低…

WPF自定义日历控件Calendar 的方法

推荐下载地址 https://www.haolizi.net/example/view_2107.html <UserControl.Resources><local1:DayConverter x:Key"DayConverter"/><!--导入转换器--><Style x:Key"CalendarStyle1"TargetType"{x:Type Calendar}">&…

Qt第三课 ----------输入类的控件属性

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Go如何实现自旋锁

自旋锁简介 在并发编程中&#xff0c;互斥锁&#xff08;Mutex&#xff09;是一种常用的同步机制&#xff0c;用于保护临界资源&#xff0c;防止数据竞争。而在某些特定场景下&#xff0c;尤其是当锁的持有时间很短且线程数量有限的情况下&#xff0c;一种更为轻量级的锁——自…

LabVIEW 离心泵机组故障诊断系统

开发了一套基于LabVIEW图形化编程语言设计的离心泵机组故障诊断系统。系统利用先进的数据采集技术和故障诊断方法&#xff0c;通过远程在线监测与分析&#xff0c;有效提升了离心泵的预测性维护能力&#xff0c;保证了石油化工生产的连续性和安全性。 项目背景及意义 离心泵作…

typescript的简介

简介 tsc npm install -g typescripttsc -v作用 检查类型和语法错误&#xff0c;提前纠错 ts的类型 如何穿件带有ts的vue工程 作用 常见类型 用法 编写一个ts文件 let username:string "John";let age:number 25;let isUpdated:boolean true;let data:any &q…

WPF+MVVM案例实战(二十)- 制作一个雷达辐射效果的按钮

文章目录 1、案例效果2、文件创建与代码实现1、创建文件2、图标资源文件3、源代码获取1、案例效果 2、文件创建与代码实现 1、创建文件 打开 Wpf_Examples 项目,在 Views 文件夹下创建窗体界面 RadarEffactWindow.xaml 。代码功能分两个部分完成,一个是样式,一个是动画。页…

5G学习笔记三之物理层、数据链路层、RRC层协议

5G学习笔记三之物理层、数据链路层、RRC层协议 物理层位于无线接口协议栈的最底层&#xff0c;作用&#xff1a;提供了物理介质中比特流传输所需要的所有功能。 1.3.1 传输信道的类型 物理层为MAC层和更高层提供信息传输的服务&#xff0c;其中&#xff0c;物理层提供的服务…

​Java面试经典 150 题.P13. 罗马数字转整数(012)​

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int romanToInt(String s) {int sum…

一键AI换衣-可图AI试衣

我们的真的实现了穿衣自由了吗&#xff1f;上传一张人物图片和衣服的图片&#xff0c;就能实现一键换衣。 这就是可图AI试衣项目 魔塔地址&#xff1a;https://www.modelscope.cn/studio ... lors-Virtual-Try-On 参考&#xff1a; 一键AI换衣-可图AI试衣 https://www.jinsh…

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…

ffmpeg+vue2

一、安装依赖 npm install ffmpeg/core ffmpeg/ffmpeg "ffmpeg/core": "^0.10.0", "ffmpeg/ffmpeg": "^0.10.1",二、配置ffmpeg 安装好插件以后&#xff0c;需要配置一下代码&#xff0c;否则会报错&#xff1a; 1、在vue.config.js…

奇瑞汽车:降阶模型在新能源汽车热管理仿真上的应用

随着新能源汽车的发展&#xff0c;对仿真技术的要求也越来越高。那么奇瑞汽车利用降阶模型在新能源汽车热管理仿真上做了哪些应用呢&#xff1f;本次内容主要从四个方面展开介绍&#xff1a; 1、 奇瑞汽车简介&#xff1b; 2、 热管理降阶模型开发的背景&#xff1b; 3、 高低…

ctf文件上传题小总结与记录

解题思路&#xff1a;先看中间件&#xff0c;文件上传点&#xff08;字典扫描&#xff0c;会员中心&#xff09;&#xff0c;绕过/验证&#xff08;黑名单&#xff0c;白名单&#xff09;&#xff0c;解析漏洞&#xff0c;cms&#xff0c;编辑器&#xff0c;最新cve 文件上传漏…