VC 鼠标路径算法

VC 鼠标路径算法,第1张

x1=100,y1=100

x2=50,y2=100

while((x1==x2)&&(y1==y2))

{

if(x2<x1)

x2++

if(x2>x1)

x2--

if(y2<y1)

y2++

if(y2>y1)

y2--

SetCurSorPos(x2,y2)

延时……

}

// 6.Bresenham画线算法.cpp

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

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

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

#include<iostream.h>// cout,cin

#include<math.h>// abs

#define GLUT_DISABLE_ATEXIT_HACK

#include<glut.h>

int x0,y01,xEnd,yEnd// 全局变量(y0与math.h中的变量重名,故用y01代替)

int width=400,height=400

void setPixel(GLint x,GLint y) // OpenGL画点函数

{

glBegin(GL_POINTS)// 开始画点

glVertex2i(x,y)// 根据2个整型值画1个点

glEnd()// 结束画点

}

void lineBresenham()

{ // Bresenham画线算法。其中x0,y01,xEnd,yEnd是全局变量

int dx=xEnd-x0,dy=yEnd-y01// Δx,Δy

int x,y,p

int twoDy,twoDyMinusDx,twoDyAddDx// 2Δy,2(Δy-Δx)

glClear(GL_COLOR_BUFFER_BIT)// 清除原显示窗口,让新显示窗口出现(颜色缓存)

if(dy==0) // m=0,水平线,x坐标每次增1,y不变

{

if(x0>xEnd) // (x0,y01)为右端点

{ // 交换两端的坐标,并令(x,y01)指示左端点

x=xEnd

xEnd=x0

x0=x

}

else // (x0,y01)为左端点

x=x0// 令(x,y01)指示左端点

while(x<=xEnd)

{

setPixel(x,y01)

x++

}

}

else if(dx==0) // m=∞,垂直线,y坐标每次增1,x不变

{

if(y01>yEnd) // (x0,y01)为下端点

{ // 交换两端的坐标,并令(x0,y)指示上端点

y=yEnd

yEnd=y01

y01=y

}

else // (x0,y01)为上端点

y=y01// 令(x0,y)指示上端点

while(y<=yEnd)

{

setPixel(x0,y)

y++

}

}

else if(dx==dy) // 45度(撇),m=1,x、y坐标每次各增1

{

if(x0>xEnd) // (x0,y01)为右端点

{ // 交换两端的坐标,并令(x,y)指示左端点

x=xEnd

y=yEnd

xEnd=x0

yEnd=y01

x0=x

y01=y

}

else // (x0,y01)为左端点

{ // 令(x,y)指示左端点

x=x0

y=y01

}

while(x<=xEnd)

{

setPixel(x,y)

x++

y++

}

}

else if(dx==-dy) // -45度(捺),m=-1,x坐标每次增1,y坐标每次减1

{

if(x0>xEnd) // (x0,y01)为右端点

{ // 交换两端的坐标,并令(x,y)指示左端点

x=xEnd

y=yEnd

xEnd=x0

yEnd=y01

x0=x

y01=y

}

else // (x0,y01)为左端点

{ // 令(x,y)指示左端点

x=x0

y=y01

}

while(x<=xEnd)

{

setPixel(x,y)

x++

y--

}

}

else if(abs(dx)>abs(dy)) // 0<|m|<1.0,x坐标每次增1

{

if(x0>xEnd) // (x0,y01)为右端点

{ // 交换两端的坐标,并令(x,y)指示左端点

x=xEnd

y=yEnd

xEnd=x0

yEnd=y01

x0=x

y01=y

dx=-dx// Δx

dy=-dy// Δy

}

else // (x0,y01)为左端点

{ // 令(x,y)指示左端点

x=x0

y=y01

}

twoDy=2*dy// 2Δy

twoDyMinusDx=2*(dy-dx)// 2(Δy-Δx)

twoDyAddDx=2*(dy+dx)// 2(Δy+Δx)

if(dy>0) // 0<m<1.0

{

p=2*dy-dx// p0=2Δy-Δx

while(x<=xEnd)

{

setPixel(x,y)

x++

if(p<0)

p+=twoDy

else

{

y++

p+=twoDyMinusDx

}

}

}

else // -1<m<0

{

p=2*dy+dx// p0=2Δy+Δx

while(x<=xEnd)

{

setPixel(x,y)

x++

if(p<0)

{

y--

p+=twoDyAddDx

}

else

p+=twoDy

}

}

}

else if(abs(dx)<abs(dy)) // 1.0<|m|<∞,y坐标每次增1

{

if(y01>yEnd) // (x0,y01)为下端点

{ // 交换两端的坐标,并令(x,y)指示上端点

x=xEnd

y=yEnd

xEnd=x0

yEnd=y01

x0=x

y01=y

dx=-dx// Δx

dy=-dy// Δy

}

else // (x0,y01)为上端点

{ // 令(x,y)指示上端点

x=x0

y=y01

}

twoDy=2*dx// 2Δx

twoDyMinusDx=2*(dx-dy)// 2(Δx-Δy)

twoDyAddDx=2*(dx+dy)// 2(Δx+Δy)

if(dx>0) // 1.0<m<∞

{

p=2*dx-dy// p0=2Δx-Δy

while(y<=yEnd)

{

setPixel(x,y)

y++

if(p<0)

p+=twoDy

else

{

x++

p+=twoDyMinusDx

}

}

}

else // -1<m<0

{

p=2*dx+dy// p0=2Δx+Δy

while(y<=yEnd)

{

setPixel(x,y)

y++

if(p<0)

{

x--

p+=twoDyAddDx

}

else

p+=twoDy

}

}

}

glFlush()// 尽可能快地处理画图

}

void main(int argc,char** argv) // 可不输入参数

{

cout<<"请输入x0 y0 xEnd yEnd:"<<endl

cin>>x0>>y01>>xEnd>>yEnd

glutInit(&argc,argv)// 初始化GLUT

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB)// 设置窗口的缓存和颜色模型

glutInitWindowPosition(0,0)// 设置窗口左上角的坐标(在屏幕左上角)

glutInitWindowSize(width,height)// 设置窗口的大小

glutCreateWindow("画线算法1")// 创建窗口,并在标题栏显示字符串

glClearColor(1.0, 1.0, 1.0, 0.0)// 设置白色背景(R,G,B,透明),默认为黑色

glColor3f(1.0, 0.0, 0.0)// 用3个浮点数表示前景色(红),默认为白色

glMatrixMode(GL_PROJECTION)// 对三维图形作正投影

glLoadIdentity()// 初始化模型变换矩阵

gluOrtho2D(0.0,width,0.0,height)// 二维笛卡尔坐标系,x和y的起止坐标

glutDisplayFunc(lineBresenham)// 显示画线函数lineBresenham()

glutMainLoop()// 程序的最后一个函数,激活窗口及图形。使程序进入检查鼠标键盘的循环中

}

#include<math.h>

double xsp=0.0,ysp=0.0

#define K 10.0   //(调整K可以调整速度!)

#define max 200  //在max距离以外运动速度不变

void nextspeed(int mx,int my,int bx,int by)

{

int dx=mx-bx , dy=my-by 

if(dx> max)dx= max   if(dy> max)dy= max

if(dx<-max)dx=-max   if(dy<-max)dy=-max

xsp= K / dx 

ysp= K / dy 

}//计算小球移动,你想要的!

//正值代表向右、上运动,负值代表向左、下运动

//春节对联:如有错误请指正,看不明白可私聊。

/*  P.S.   移动效果,可以用time(),确定每0.2秒计算一次nextspeed并移动。  */


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11520113.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存