`
huxiaoheihei
  • 浏览: 174248 次
  • 性别: Icon_minigender_2
  • 来自: 吉林
社区版块
存档分类
最新评论

源代码:基于A*算法的八数码问题的实现(用OpenGL实现动态演示)

 
阅读更多

 

转载请注明出处:http://hi.baidu.com/lvchengbin405/blog/item/d95c2a1f722cb36bf624e42e.html

State、EDCNode和EDC的定义与实现请参看上一篇文章:源代码:基于A*算法的八数码问题的实现(类的定义与实现)(http://hi.baidu.com/lvchengbin405/blog/item/e354fd1faaeb09c0a7866921.html

 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string>
using namespace std;

#include <glut.h>

#include "EDCPP.h"

#pragma warning (disable:4996)

// define grid size
#define GRID_WIDTH 45
#define GRID_HEIGHT 56   
#define GRID_INTERSPACES_W 10
#define GRID_INTERSPACES_H 20

// define char size
#define FONTSIZEH 12
#define FONTSIZEW 15
#define FONTSIZEHB 18
#define FONTSIZEWB 18
#define VALUEH 16


// draw one line
#define drawOneLine(x1, y1, x2, y2) \
glBegin(GL_LINES);     \
glVertex2f((x1), (y1));\
glVertex2f((x2), (y2));\
glEnd();

// draw one grid
#define drawOneGrid(x1, y1, x2, y2) \
glBegin(GL_LINE_LOOP); \
glVertex2f((x1), (y1));\
glVertex2f((x2), (y1));\
glVertex2f((x2), (y2));\
glVertex2f((x1), (y2));\
glEnd();

// draw char with char size 12 pixes
#define drawChar(c, x, y) \
glRasterPos2f(x, y); \
    glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, c);

// draw char with char size 18 pixes
#define drawCharB(c, x, y) \
glRasterPos2f(x, y);   \
    glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, c);

#define STATE_INPUT 1
#define STATE_TRACK 2
#define STATE_END   3
#define STATE_RESTART   4

EDC* edc;
int windows_w;
int windows_h;
int windows_pagew = 0;
int windows_pageh = 0;
int state = 0;
int result = -1;
void drawString12(int x, int y, const char* string)
{
glRasterPos2f(x, y);
for (;*string != '\0';++string)
    {
   glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, *string);
}
}

void drawString18(int x, int y, const char* string)
{
glRasterPos2f(x, y);
for (;*string != '\0';++string)
    {
   glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, *string);
}
}


void drawEDCNode(EDCNode* node, int startx, int starty)
{
char g[8];
char h[8];
_itoa(node->GetG(), g, 10);
_itoa(node->GetH(), h, 10);
State* s = node->GetState();

// draw grid
drawOneGrid(startx, starty+FONTSIZEH, startx+GRID_WIDTH, starty-GRID_HEIGHT+FONTSIZEH);

// draw g&h
drawString12(startx+1, starty-1, g);
drawString12(startx+FONTSIZEW*2+1, starty-1, h);

// draw data(from 1 to 8)
starty = starty - VALUEH;
for (int i=0; i<3; i++)
{
   for (int j=0; j<3; j++)
   {
    if (i!=s->blankx || j!=s->blanky)
    {
     drawChar(s->value[i][j], startx+FONTSIZEW*j+1, starty-FONTSIZEH*i-1);
    }
   }
}
}

void drawHeap(int index, int h, int sx, int sy)
{
int dx = h*GRID_WIDTH;
int dy = GRID_HEIGHT + GRID_INTERSPACES_H;
EDCNode* node = edc->GetNodeFromOpenList(index);
if (!node)
   return;
drawEDCNode(node, sx, sy);
if (index*2+1<=edc->GetOpenNum())
{
   drawOneLine(sx+GRID_WIDTH/2, sy-GRID_HEIGHT+FONTSIZEH, sx+GRID_WIDTH/2-dx, sy+FONTSIZEH-dy);
   drawOneLine(sx+GRID_WIDTH/2, sy-GRID_HEIGHT+FONTSIZEH, sx+GRID_WIDTH/2+dx, sy+FONTSIZEH-dy);
   drawHeap(index*2, h/2, sx-dx, sy-dy);
   drawHeap(index*2+1, h/2, sx+dx, sy-dy);
}
else if (index*2<=edc->GetOpenNum())
{
   drawOneLine(sx+GRID_WIDTH/2, sy-GRID_HEIGHT+FONTSIZEH, sx+GRID_WIDTH/2-dx, sy+FONTSIZEH-dy);
   drawHeap(index*2, h/2, sx-dx, sy-dy);
}
}
void drawOpenList(int startx, int starty)
{
char ch[32] = "Open List : ";
int num = edc->GetOpenNum();
sprintf(ch, "Open List : %d", num);
drawString18(startx, starty+FONTSIZEHB, ch);
int x=startx, y=starty-GRID_INTERSPACES_H;
int i = num, j=1;
while (i>0)
{
   i /= 2;
   j *= 2;
}
int sx = startx + j/2*GRID_WIDTH - GRID_INTERSPACES_W;
int sy = starty - GRID_INTERSPACES_H;
drawHeap(1, j/4, sx, sy);
// 绘制第一个节点的儿子
glColor3f(0.0, 1.0, 1.0);
if (edc->GetOpenNum()>0)
{
   EDCNode* parent = new EDCNode(*(edc->GetNodeFromOpenList(1)));
   int line = 20;
   sx += GRID_WIDTH;
   drawOneLine(sx, sy-GRID_HEIGHT/3, sx+GRID_WIDTH+line, sy-GRID_HEIGHT/3);
   drawOneLine(sx+GRID_WIDTH+line, sy-GRID_HEIGHT/3, sx+GRID_WIDTH+line-10, sy-GRID_HEIGHT/3+10);
   drawOneLine(sx+GRID_WIDTH+line, sy-GRID_HEIGHT/3, sx+GRID_WIDTH+line-10, sy-GRID_HEIGHT/3-10);
   drawString12(sx+5, sy-GRID_HEIGHT/3+5, "CHILD");

   EDCNode* child = new EDCNode(*parent);
   if (EDCNode::MoveLeft(child->GetState()))
   {
    child->SetG(edc->CalculateG(parent, child));
    child->SetH(edc->CalculateH(child, edc->GetEnd()));
    sx += GRID_WIDTH + line;
    drawEDCNode(child, sx, sy);
    if (edc->IsInOpenList(child)==-1)
     drawString12(sx, sy+FONTSIZEHB, "N");
    else
     drawString12(sx, sy+FONTSIZEHB, "Y");
    if (edc->IsInCloseList(child)==-1)
     drawString12(sx+GRID_WIDTH-FONTSIZEW, sy+FONTSIZEHB, "N");
    else
     drawString12(sx+GRID_WIDTH-FONTSIZEW, sy+FONTSIZEHB, "Y");
   }
   delete child;

   child = new EDCNode(*parent);
   if (EDCNode::MoveRight(child->GetState()))
   {
    child->SetG(edc->CalculateG(parent, child));
    child->SetH(edc->CalculateH(child, edc->GetEnd()));
    sx += GRID_WIDTH + line;
    drawEDCNode(child, sx, sy);
    if (edc->IsInOpenList(child)==-1)
     drawString12(sx, sy+FONTSIZEHB, "N");
    else
     drawString12(sx, sy+FONTSIZEHB, "Y");
    if (edc->IsInCloseList(child)==-1)
     drawString12(sx+GRID_WIDTH-FONTSIZEW, sy+FONTSIZEHB, "N");
    else
     drawString12(sx+GRID_WIDTH-FONTSIZEW, sy+FONTSIZEHB, "Y");
   }
   delete child;

   child = new EDCNode(*parent);
   if (EDCNode::MoveUp(child->GetState()))
   {
    child->SetG(edc->CalculateG(parent, child));
    child->SetH(edc->CalculateH(child, edc->GetEnd()));
    sx += GRID_WIDTH + line;
    drawEDCNode(child, sx, sy);
    if (edc->IsInOpenList(child)==-1)
     drawString12(sx, sy+FONTSIZEHB, "N");
    else
     drawString12(sx, sy+FONTSIZEHB, "Y");
    if (edc->IsInCloseList(child)==-1)
     drawString12(sx+GRID_WIDTH-FONTSIZEW, sy+FONTSIZEHB, "N");
    else
     drawString12(sx+GRID_WIDTH-FONTSIZEW, sy+FONTSIZEHB, "Y");
   }
   delete child;

   child = new EDCNode(*parent);
   if (EDCNode::MoveDown(child->GetState()))
   {
    child->SetG(edc->CalculateG(parent, child));
    child->SetH(edc->CalculateH(child, edc->GetEnd()));
    sx += GRID_WIDTH + line;
    drawEDCNode(child, sx, sy);
    if (edc->IsInOpenList(child)==-1)
     drawString12(sx, sy+FONTSIZEHB, "N");
    else
     drawString12(sx, sy+FONTSIZEHB, "Y");
    if (edc->IsInCloseList(child)==-1)
     drawString12(sx+GRID_WIDTH-FONTSIZEW, sy+FONTSIZEHB, "N");
    else
     drawString12(sx+GRID_WIDTH-FONTSIZEW, sy+FONTSIZEHB, "Y");
   }
   delete child;

   delete parent;
}
}

void drawCloseList(int startx, int starty)
{
char ch[32] = "Close List : ";
int num = edc->GetCloseNum();
sprintf(ch, "Close List : %d", num);
drawString18(startx-250, starty-FONTSIZEHB, ch);
EDCNode* node = edc->GetNodeFromCloseList(num);
if (!node)
   return;

int sx = startx - GRID_WIDTH - GRID_INTERSPACES_W;
int sy = starty - GRID_INTERSPACES_H;
int x=sx, y=sy;
int i,j;
drawEDCNode(edc->GetNodeFromCloseList(1), sx, sy);
int levelindex1=1,levelindex2=1,parentindex=1;
for (i=2; i<=num; i++)
{
   x -= GRID_WIDTH + GRID_INTERSPACES_W;
   if (edc->GetNodeFromCloseList(i)->GetG() != edc->GetNodeFromCloseList(i-1)->GetG())
   {
    levelindex1 = levelindex2;
    levelindex2 = i;
    x = sx;
    y -= GRID_HEIGHT + GRID_INTERSPACES_H;
   }
   drawEDCNode(edc->GetNodeFromCloseList(i), x, y);
   parentindex = edc->GetNodeParentFromCloseList(i);
   if (parentindex != -1)
    drawOneLine(x+GRID_WIDTH/2, y+FONTSIZEH, sx-(parentindex-levelindex1)*(GRID_WIDTH + GRID_INTERSPACES_W)+GRID_WIDTH/2, y+GRID_INTERSPACES_H+FONTSIZEH);
}
// find path and draw it with red
glColor3f(1.0, 0.0, 0.0);
if (state == STATE_END && result == 1) 
{
   i--;
   while (i!=1)
   {
    drawEDCNode(edc->GetNodeFromCloseList(i), x, y);
    i = edc->GetNodeParentFromCloseList(i);
    j = i;
    while (edc->GetNodeFromCloseList(j-1)!=NULL && edc->GetNodeFromCloseList(j)->GetG() == edc->GetNodeFromCloseList(j-1)->GetG())
     j--;
    drawOneLine(x+GRID_WIDTH/2, y+FONTSIZEH, sx-(i-j)*(GRID_WIDTH + GRID_INTERSPACES_W)+GRID_WIDTH/2, y+GRID_INTERSPACES_H+FONTSIZEH);
    x = sx-(i-j)*(GRID_WIDTH + GRID_INTERSPACES_W);
    y += GRID_HEIGHT + GRID_INTERSPACES_H;
   }
   drawEDCNode(edc->GetNodeFromCloseList(i), x, y);
}
}

void drawFn(int startx, int starty)
{
int g, hdn, hpn, hsn;
edc->GetParas(g, hdn, hpn, hsn);
char ch[128] = "Estimated Function: F(n) = G(n) + H(n)";
drawString18(startx, starty, ch);
if (g==0)
   strcpy(ch, "G(child) = G(parent) + 1");
else if (g==1)
   strcpy(ch, "G(child) = G(parent) + H(child, parent)");
else
   strcpy(ch, "G(child) = 0");
drawString18(startx, starty-FONTSIZEHB, ch);
sprintf(ch, "H(n) = %dDn + %dPn + %dSn", hdn, hpn, hsn);
drawString18(startx, starty-FONTSIZEHB*2, ch);
}

void drawStart(int startx, int starty)
{
char ch[] = "Start State:";
drawString18(startx, starty, ch);
int x=startx, y=starty-FONTSIZEHB;
State* s = edc->GetStart()->GetState();
for (int i=0; i<3; i++)
{
   for (int j=0; j<3; j++)
   {
    if (i!=s->blankx || j!=s->blanky)
    {
     drawCharB(s->value[i][j], x+FONTSIZEWB*j+1, y-FONTSIZEHB*i-1);
    }
   }
}
}

void drawEnd(int startx, int starty)
{
char ch[] = "End   State:";
drawString18(startx, starty, ch);
int x=startx, y=starty-FONTSIZEHB;
State* s = edc->GetEnd()->GetState();
for (int i=0; i<3; i++)
{
   for (int j=0; j<3; j++)
   {
    if (i!=s->blankx || j!=s->blanky)
    {
     drawCharB(s->value[i][j], x+FONTSIZEWB*j+1, y-FONTSIZEHB*i-1);
    }
   }
}
}

void display(void)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-windows_w/2+windows_pagew, windows_w/2+windows_pagew, -windows_h/2+windows_pageh, windows_h/2+windows_pageh);

glClear(GL_COLOR_BUFFER_BIT);
//select white
glColor3f(1.0, 1.0, 1.0);
drawOneLine(-1000, 100, -100, 100);
drawOneLine(-100, -800, -100, 800);

glColor3f(1.0, 1.0, 0.0);
drawCloseList(-100, 100);
glColor3f(1.0, 0.0, 1.0);
drawOpenList(-100, 300);

glColor3f(1.0, 0.0, 0.0);
drawFn(-500+50, 100+100+100);
drawStart(-500+50, 100+100);
drawEnd(-500+50+150, 100+100);

glFlush();
}

void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
windows_w = w; windows_h = h;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-w/2, w/2, -h/2, h/2);
}

void processNormalKeys(unsigned char key, int x, int y)
{
switch (key)
{
case 27: // 'esc'
   exit(1);
case 13: // 'enter'
   if (state == STATE_TRACK)
   {
    result = edc->EDCOnce();
    if (result!=0)
     state = STATE_END;
    glutPostRedisplay();
   }
   break;
case 97: // 'a'
   windows_pagew -= 100;
   glutPostRedisplay();
   break;
case 100: // 'd'
   windows_pagew += 100;
   glutPostRedisplay();
   break;
case 119: // 'w'
   if (windows_pageh !=0)
   {
    windows_pageh += 100;
    glutPostRedisplay();
   }
   break;
case 115: // 's'
   windows_pageh -= 100;
   glutPostRedisplay();
   break;
case 32:   // ' '
   windows_pagew = 0;
   windows_pageh = 0;
   glutPostRedisplay();
   break; 
    default:
        fprintf(stderr, "Unknown key-press: --%d--\n", key);
        break;
    }
}

void processSpecialKeys(int key, int x, int y)
{
switch (key)
{
case GLUT_KEY_LEFT:
   if (state == STATE_INPUT)
   {
    EDCNode::MoveRight(edc->GetStart()->GetState());
    glutPostRedisplay();
   }
   break;
case GLUT_KEY_RIGHT:
   if (state == STATE_INPUT)
   {
    EDCNode::MoveLeft(edc->GetStart()->GetState());
    glutPostRedisplay();
   }
   break;
case GLUT_KEY_UP:
   if (state == STATE_INPUT)
   {
    EDCNode::MoveDown(edc->GetStart()->GetState());
    glutPostRedisplay();
   }
   break;
case GLUT_KEY_DOWN:
   if (state == STATE_INPUT)
   {
    EDCNode::MoveUp(edc->GetStart()->GetState());
    glutPostRedisplay();
   }
   break;
case GLUT_KEY_F1:
   if (state!=STATE_TRACK)
    state = STATE_INPUT;
   break;
case GLUT_KEY_F2:
   state = STATE_TRACK;
   break;
case GLUT_KEY_F3:
   state = STATE_RESTART;
   result = -1;
   edc->StartEDC();
   glutPostRedisplay();
   break;
    default:
        break;
    }
}

void initGL(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}

void initEDC()
{
State* send = new State();
send->value[0][0] = '1';send->value[0][1] = '2';send->value[0][2] = '3';
send->value[1][0] = '8';send->value[1][1] = '0';send->value[1][2] = '4';
send->value[2][0] = '7';send->value[2][1] = '6';send->value[2][2] = '5';
send->blankx = 1;send->blanky = 1;
EDCNode* nend=new EDCNode();
nend->InitEDCNode(0, send, 0, 0, 0, 0);

EDCNode* nstart = new EDCNode(*nend);

edc = new EDC(nstart, nend, 0, 1, 0, 0);
edc->StartEDC();

delete nstart;
delete nend;
delete send;
//edc->InsertToOpenList(edc->GetStart());

}

void releaseEDC()
{
if (edc)
{
   delete edc;
}
}

int main(int argc, char** argv)
{
initEDC();
int gParas, hParasDn, hParasPn, hParasSn;
printf("估价函数 F(n) = G(n) + H(n) \n");
printf("其中 G(n)有两种计算方式: 输入1时G(child)=G(parent)+H(child,parent),输入0时G(child)=g(parent)+1\n请输入:");
scanf("%d", &gParas);
printf("其中 H(n)的计算方式为:H(n) = aDn + bPn + cSn \n");
printf("D(n)表示起始节点的格局与目标节点格局的不同牌数,包括空格 \n");
printf("P(n)是指当前格局各将牌离“家”的最短路径之和,包括空格 \n");
printf("S(n)计算方法:依照顺时针方向来检查非中心位置的每个奖牌,若其后紧跟的将牌与目标格局一致,该将牌得0分,否则得2分;中间方格有将牌得1分,否则得0分。所有将牌得分之和即为S(n)。 \n");
printf("请输入a、b、c的值:");
scanf("%d%d%d", &hParasDn, &hParasPn, &hParasSn);
if (!edc)
{
   printf("创建edc对象失败,退出!");
   return 0;
}
edc->SetParas(gParas, hParasDn, hParasPn, hParasSn);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(1000, 700);
glutInitWindowPosition(0, 0);
glutCreateWindow(argv[0]);
//glutFullScreen();
initGL();
glutKeyboardFunc(processNormalKeys);
glutSpecialFunc(processSpecialKeys);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}

 

 

程序运行效果图如下:

 

 

 

按键操作提示
进入图形化界面后,可按下相关键进行操作,一下是按键说明:
 F1:输入状态,用于调整八数码的起始状态,按下该键后,才能编辑八数码的起始状态,方向键有效。
 F2:遍历状态,用于八数码查找路径的单步演示,按下该键后,回车键才有效,F1键无效。
 F3:重来状态,用于八数码重新单步演示及修改起始状态,按下该键后,按F1有效。
 a:调整界面可视视图,视图向左移动一个单位。
 d:调整界面可视视图,视图向右移动一个单位。
 w:调整界面可视视图,视图向上移动一个单位。
 s:调整界面可视视图,视图向下移动一个单位。
 空格:调整界面可视视图,视图回归初始位置。
 回车:在遍历状态下,按该键进行单步演示。
 向上方向键:调整八数码的起始状态,空格下移,下边的数字上移。
 向下方向键:调整八数码的起始状态,空格上移,上边的数字下移。
 向左方向键:调整八数码的起始状态,空格右移,右边的数字左移。
 向右方向键:调整八数码的起始状态,空格左移,左边的数字右移。

 

分享到:
评论

相关推荐

    A * 算法实现和演示

    在提供的"PushBox"文件中,可能包含的是一个实现A*算法的项目源代码,可能是一个推箱子游戏的实现,其中A*算法用于解决玩家如何从起点到达终点的问题。推箱子游戏中的地图通常是连通的,且有移动和推箱规则的限制,A...

    自己做的算法演示demo源代码

    标题 "自己做的算法演示demo源代码" 暗示了这是一个包含了特定算法实现的编程示例,主要用于教学或展示目的。这个项目可能包含了多种排序算法的实现,其中一个被明确指出的是“冒泡排序”(Bubble Sort)。源代码是...

    opengl实现的 图形学主要算法

    在这个“OpenGL实现的图形学主要算法”压缩包中,很可能是包含了一系列用于演示和学习图形学基础概念和算法的源代码。 在计算机图形学中,主要算法可以分为以下几个关键领域: 1. **坐标系统和变换**:OpenGL使用...

    open GL编程指南

    - **编译与链接着色器**:描述如何将源代码编译成着色器对象,并将其组合成着色器程序。 - **属性与顶点数组对象**: - **属性绑定**:解释如何将顶点数据与着色器中的属性相对应。 - **顶点数组对象**:介绍VAO的...

    QEM曲面简化算法

    - **源代码**:实现了QEM算法的C++代码,可能使用了Qt库作为用户界面框架,OpenGL用于3D渲染。 - **文档**:详细解释了算法的理论基础和实现细节,帮助读者理解每一步操作的目的和原理。 - **实验结果**:可能包括...

    动态火焰算法演示源代码

    在这个VS2008工程源码中,开发者可能使用C++编程语言,利用OpenGL或者DirectX等图形库来实现火焰的动态效果。 首先,我们要理解火焰的生成过程。火焰的形成基于热力学原理,它涉及到燃烧、扩散和颜色的变化。在...

    OpenGL动画演示(包含代码)

    3. **膨胀球体**:这可能是演示如何在OpenGL中动态改变物体大小的示例,可能通过平移、缩放矩阵或在顶点着色器中修改顶点位置来实现。膨胀球体可以用来展示物体的动态变形和动画效果。 4. **算法集合**:这个子...

    七巧板演示程序和代码

    - **人机交互**:添加AI算法,让计算机自动解决七巧板问题,或者实现玩家对战模式。 - **跨平台移植**:将代码移植到其他操作系统,如Linux或Mac OS,实现跨平台运行。 综上所述,这个七巧板演示程序及源代码是一...

    opengl下Bresenham直线算法实现(鼠标取点)

    OpenGL是计算机图形学中广泛使用的库,用于在各种操作系统上创建2D和3D图形。...通过阅读和理解源代码,你可以更好地掌握在实际开发中如何运用Bresenham直线算法和鼠标事件处理来增强图形应用程序的功能。

    影线填充算法opengl实现

    在“图形学作业”这个压缩包文件中,可能包含了源代码、纹理图像、编译脚本等资源,用于演示和测试影线填充算法的实现。通过分析和运行这些代码,可以更深入地理解如何在实际项目中结合OpenGL和影线填充算法。 总之...

    opengl 游戏编程 第六章源代码

    源代码可能包含对环境光、点光源、方向光的实现,以及使用阴影贴图(Shadow Mapping)或其他阴影技术来增强真实感。 4. **帧缓冲对象(Frame Buffer Objects, FBOs)**:FBOs用于实现离屏渲染,可以用于后期处理...

    3D魔方和设计文档(opengl实现)

    4. **算法实现**:讲解如何使用OpenGL的API来实现魔方的旋转、复原等功能。这可能涉及到矩阵变换、向量运算和状态管理。 5. **源码结构**:解析项目中的关键文件和函数,比如主程序、渲染循环、输入处理和GLUT或...

    用OPGL写的太阳系演示[SolarSystem.rar]-精品源代码

    标题中的“用OpenGL写的太阳系演示[SolarSystem.rar]-精品源代码”表明这是一个使用OpenGL图形库编写的程序,用于模拟太阳系的动态演示。OpenGL是一个跨语言、跨平台的编程接口,主要用于渲染2D、3D矢量图形,广泛...

    OPENGL编写的演示汉诺塔

    OpenGL编写的演示汉诺塔是一款基于VC6.0开发的程序,它巧妙地结合了图形化界面和递归算法,为用户呈现了经典的汉诺塔游戏。汉诺塔游戏源于印度,是一个古老的智力挑战,其目标是将一个柱子上的所有盘子按照大小顺序...

    OpenGL中实现布料模拟算法的源码合集_C_C++_下载.zip

    本合集包含的是用C和C++编程语言实现的OpenGL布料模拟算法的源代码,这对于学习高级图形编程和游戏开发的程序员来说是一个宝贵的资源。 在OpenGL中实现布料模拟,主要涉及以下几个关键技术点: 1. **物理模型**:...

    牛顿宇宙演示附程序源代码

    《牛顿宇宙演示》是一款基于牛顿力学原理的模拟软件,其附带的源代码为开发者提供了深入理解物理规律和游戏开发技术的机会。这个项目旨在通过可视化的方式展示牛顿的三大定律以及动量守恒和万有引力定律在宇宙中的...

    SFS算法实现及可视化显示代码

    1. SFS算法的源代码文件:这些文件可能包含C++源代码,实现了SFS的基本步骤,如边缘检测、匹配、几何变换、多视图融合等。 2. 数据处理脚本:可能包括预处理和后处理步骤,例如图像格式转换、轮廓提取、数据格式化等...

    计算机图形学实用教程(第4版)-实例源代码.rar

    在这个"计算机图形学实用教程(第4版)-实例源代码.rar"压缩包中,我们很可能会找到一系列与计算机图形学相关的编程实例,这些实例可能是用各种编程语言编写的,如C++, OpenGL, 或者现代的Web图形库如Three.js。...

    基于Android计算器功能的实现.doc

    - **源代码**:包括Java或Kotlin等编程语言编写的源代码。 - **资源文件**:如图像、布局文件等。 - **配置文件**:如AndroidManifest.xml,定义了应用程序的基本信息。 - **库文件**:应用程序依赖的第三方库文件。...

Global site tag (gtag.js) - Google Analytics