社区
C++ 语言
帖子详情
关于c/c++语言中的图形移动问题
wuxue0427
2007-01-23 08:38:57
在下新手,有个小问题想请教一下。
在屏幕上显示一个小方格,要实现的功能是用鼠标可以把他移动到任意方位。所用语言是C/C++。
...全文
372
5
打赏
收藏
关于c/c++语言中的图形移动问题
在下新手,有个小问题想请教一下。 在屏幕上显示一个小方格,要实现的功能是用鼠标可以把他移动到任意方位。所用语言是C/C++。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wuxue0427
2007-01-23
打赏
举报
回复
晕了,不好意思啊.刚才搞错了,是用键盘操作的,不是鼠标.
楼上给的太复杂了,看不懂
jixingzhong
2007-01-23
打赏
举报
回复
类似如下过程:
本程序用于描绘一个旋转的多面体,有如下控制健,1,2,3,4,5,6,7,8,9,0(小键盘).a,s,d,w,(和cs一样的功能)程序中有详细的说明.希望经验大家交流--贾胜华.
#include <math.h>
#include <stdio.h>
#include <graphics.h>
main()
{int i,j; /*循环变量*/
int mode=VGAHI,driver=VGA;
int l,n,k=0;
char gg,hh[13]="complete %";
float arf,the,baty=0,batz=0,r; /*角度变量*/
float xx[5],yy[5],zz[5],x,y,z; /*三维变量*/
float a[32][16][3],c[32][16][3][2];/*用于暂存?/
initgraph(&driver,&mode,"\\tc");/*图像初始化*/
xx[4]=0;/*初值*/
yy[4]=0;
zz[4]=0;
xx[3]=0;
yy[3]=0;
zz[3]=0;
for(i=0;i<=31;i++)/*对c[][][][]付初值*/
for(j=0;j<=15;j++)
for(l=0;l<=2;l++)
{c[i][j][l][0]=0;
c[i][j][l][1]=0;}
setfillstyle(1,9);
for(i=0;i<=31;i++) /*按角度开始求解方程*/
{
cleardevice(); /*这一段用于实现求解进度条*/
rectangle(9+220,19+220,114+220,31+220);
bar(10+220,20+220,10+3*i+6+220,30+220);
hh[10]=(3*i+6)%10+48;
hh[9]=(3*i+6-(3*i+6)%10)/10+48;
outtextxy(120+220,20+220,hh);
for(j=0;j<=15;j++)
{
the=(3.1415926/15)*(j-7.5);/*角度的精度为0.0000001*/
arf=(3.1415926/31)*i*2;
for(r=0;r<150;r+=0.01) /*(精确度为0.01)开始求解方程*/
{x=r*cos(the)*cos(arf);
y=r*cos(the)*sin(arf);
z=r*sin(the);
if((x*x/100+y*y/100+z*z-100)*(x*x/100+y*y/100+z*z-100)<0.001)/*此处插入用户曲面方程*/
break;
}
a[i][j][0]=x;/*保存求解结果,一次保存三个量是用空间换时间.(可以改进)*/
a[i][j][1]=y;
a[i][j][2]=z;
}
}
cleardevice();
l=0;
the=0;
gg='6';
for(;;) /*开始处理用户的控制*/
{ /*这一段用于实现移动*/
if(gg=='w'||gg=='W') yy[4]-=1; /*前进*/
else if(gg=='a'||gg=='A') {if(l==0) xx[4]+=1; if(l==1) the-=0.01;}/*左移或者右转*/
else if(gg=='s'||gg=='S') yy[4]+=1; /*后退*/
else if(gg=='d'||gg=='D') {if(l==0) xx[4]-=1; if(l==1) the+=0.01;}/*右移或者左转*/
else if(gg=='c'||gg=='C') {l=(l-1)*(l-1);gg='q';}/*a,d功能控制键*/
/*接下来用于实现转动*/
else if(gg=='6') batz+=0.01;/*左转*/
else if(gg=='8') baty+=0.01;/*上转*/
else if(gg=='2') baty-=0.01;/*下转*/
else if(gg=='4') batz-=0.01;/*右转*/
else if(gg=='9') {batz+=0.01;baty+=0.01;}/*右上*/
else if(gg=='1') {batz-=0.01;baty-=0.01;}/*左下*/
else if(gg=='7') {batz-=0.01;baty+=0.01;}/*左上*/
else if(gg=='3') {batz+=0.01;baty-=0.01;}/*右下*/
else if(gg=='0') exit(0);/*退出*/
else ;/*其他键,为暂停*/
r=pow(xx[4]*xx[4]+yy[4]*yy[4],0.5);
k=(1-k)*(1-k);
if(kbhit())/*判断用户是否有键入*/
gg=getch();
for(i=0;i<=31;i++)/*开始3D->2D的转换*/
for(j=0;j<=15;j++)
{
xx[0]=a[i][j][0];/*承接求解数据*/
yy[0]=a[i][j][1];
zz[0]=a[i][j][2];
xx[1]=xx[0]*cos(baty)-zz[0]*sin(baty);/*延y轴的偏转计算*/
zz[1]=sin(baty)*xx[0]+cos(baty)*zz[0];
yy[1]=yy[0];
xx[2]=xx[1]*cos(batz)-yy[1]*sin(batz)+xx[4];/*延z轴的偏转计算*/
yy[2]=sin(batz)*xx[1]+cos(batz)*yy[1]+yy[4];
zz[2]=zz[1]+zz[4];
xx[3]=xx[2]*cos(the)-yy[2]*sin(the);/*实现定点转动*/
yy[3]=sin(the)*xx[2]+cos(the)*yy[2];
x=1/(0.18+0.002*yy[3]);/*远小近大的计算,同时考虑视点*/
xx[2]=xx[3]*x;
zz[2]=zz[2]*x;
c[i][j][0][k]=xx[2]+0*yy[2]*0.707+320;/*计算完后进行3d->2d*/
c[i][j][1][k]=zz[2]+0*yy[2]*0.707+240;/*其中的0常数用来调节对纵深的权重*/
c[i][j][2][k]=yy[3];
}/*end loop for i j*/
n=(1-k)*(1-k);
for(i=0;i<=31;i++)/*开始作图*/
for(j=0;j<15;j++)
{if(c[i][j+1][2][n]>0&&c[i][j][2][n]>0)/*用于判断是否是身后的图像*/
{setcolor(0);/*去掉以前的*/
line(c[i][j][0][n],c[i][j][1][n],c[i][j+1][0][n],c[i][j+1][1][n]);
}
if(c[i][j+1][2][k]>0&&c[i][j][2][k]>0)
{setcolor(9)/*画上现在的,以下一样*/;
line(c[i][j][0][k],c[i][j][1][k],c[i][j+1][0][k],c[i][j+1][1][k]);
}
if(i<31)
{if(c[i+1][j][2][n]>0&&c[i][j][2][n]>0)
{setcolor(0);
line(c[i][j][0][n],c[i][j][1][n],c[i+1][j][0][n],c[i+1][j][1][n]);
}
if(c[i+1][j][2][k]>0&&c[i][j][2][k]>0)
{setcolor(9);
line(c[i][j][0][k],c[i][j][1][k],c[i+1][j][0][k],c[i+1][j][1][k]);
}
}/*end if i*/
if(i==31)
{if(c[0][j][2][n]>0&&c[i][j][2][n]>0)
{setcolor(0);
line(c[i][j][0][n],c[i][j][1][n],c[0][j][0][n],c[0][j][1][n]);
}
if(c[0][j][2][k]>0&&c[i][j][2][k]>0)
{setcolor(9);
line(c[i][j][0][k],c[i][j][1][k],c[0][j][0][k],c[0][j][1][k]);
}
}/*end if i*/
}/*end loop for i j*/
}/*end loop for baty*/
}
v2002750
2007-01-23
打赏
举报
回复
看看位图相关的东西,你可以管理帖子,转移到WINDOWS编程版,这样就不用给两次分了。
taodm
2007-01-23
打赏
举报
回复
去windows编程版问。本问题和C、C++无关。
高级
语言
程序设计
C++
大作业基于
C++
实现的2048小游戏源码+详细项目开发文档
高级
语言
程序设计
C++
大作业基于
C++
实现的2048小游戏源码+详细项目开发文档 1. 作业题目 2048小游戏:通过上下左右键合并数字块,合并得出2048时,游戏胜利;当上下左右操作均无法
移动
任一数字块,游戏失败。 2. 开发软件 系统环境: Windows 10 开发环境: Qt Creator 4.3.1 编译器环境: MinGW 5.3.0 32bit (C/
C++
) Qt依赖版本: Qt 5.9.0 3. 课题要求 学生自选题目,使用
C++
语言
完成一个
图形
化的小程序。
图形
化平台不限,可以是MFC、QT等。 程序内容主题不限,可以是小游戏、小工具等。
EasyX_20200315(beta) (1).exe
EasyX 是针对 C/
C++
的
图形
库,可以帮助使用C/
C++
语言
的程序员快速上手
图形
和游戏编程。 比如,可以用 VC + EasyX 很快的用几何
图形
画一个房子,或者一辆
移动
的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习
图形
学的各种算法,等等。
《C
语言
/
C++
学习指南》Linux开发篇
本篇面向Linux初级、但已掌握C/
C++
基本语法的学员,以CentOS为演示平台,介绍Linux下的C/
C++
开发技术。在内容编排上,先介绍Linux的安装、基本使用和配置,然后再开始介绍在Linux下的C/
C++
开发技术: gcc命令行、...
easyx和easyxw库
EasyX 是针对
C++
的
图形
库,可以帮助
C++
语言
初学者快速上手
图形
和游戏编程。 比如,可以用 VC + EasyX 很快的用几何
图形
画一个房子,或者一辆
移动
的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习
图形
学的各种算法,等等。 使用上,基本和 Turbo C没太大区别。启动Visual
C++
,创建一个控制台项目(Win32 Console Application),然后引用 graphics.h 头文件就可以了。
C++
语言
:C
语言
/
C++
语言
的简介、发展历史、应用领域、编程
语言
环境IDE安装、最强学习路线之详细攻略
C++
语言
:C
语言
/
C++
语言
的简介、发展历史、应用领域、编程
语言
环境IDE安装、最强学习路线之详细攻略 目录 C
语言
/
C++
语言
的简介 C
语言
/
C++
语言
的应用领域
C++
语言
的IDE安装
C++
语言
的学习路线
C++
语言
实现的算法案例集合 C
语言
/
C++
语言
的简介 1995年之前,江湖比较平静,编程
语言
有C、basics、pascal、 fortran、汇编
语言
,还有foxbase(曾经被列入
C++ 语言
64,639
社区成员
250,578
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章