声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3860|回复: 13

[人工智能] 如何在VC++中建立MFC AppWizard工程实现三维A*算法

[复制链接]
发表于 2011-5-6 09:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
如何在VC++中建立MFC AppWizard工程基于基本对话框实现三维A*算法

我要做一个简单飞行器航迹规划(要考虑飞行器的性能最大拐弯角,爬升/俯冲角,最小航迹段),通过vc++与matlab混合编程利用matlab引擎,在matlab生成的三维地形图中采用三维A*算法实现飞行航迹规划,求教代码/思路???
回复
分享到:

使用道具 举报

 楼主| 发表于 2011-5-6 09:48 | 显示全部楼层
回复 1 # sunminmin 的帖子

生成三维随机地形图的代码,用matlab实现:
CeatHill.m文件
  1. function [data]=CeatHill(N,h,x0,y0,xi,yi,num)
  2. %创建小山丘模型,N座山,H为山的高度,X0,Y0为山的坐标。XI,YI为山丘的斜度,NUM为山丘模型数据的维数。
  3. %XI,YI的值越大,山丘就越平坦
  4. % Example:
  5. %          tic;
  6. %          h=[20,60,40];
  7. %          x0=[20,40,50];
  8. %          y0=[20,50,60];
  9. %          xi=[];
  10. %          yi=[];
  11. %          d=CeatHill(3,h,x0,y0,xi,yi,65);
  12. %          colormap(gray); %设置渲染的颜色
  13. %          surf(d); %画出三维曲面
  14. %          shading flat; %各小曲面之间不要网格
  15. %          toc %测试运行时间
  16. x=1:1:num;y=1:1:num;
  17. %z2=zeros(1,4);
  18. for m=1:num
  19.     for n=1:num
  20.         Sum=0;
  21.         for k=1:N
  22.             s=h(k)*exp(-((x(m)-x0(k))/xi(k))^2-((y(n)-y0(k))/yi(k))^2);
  23.             Sum=Sum+s;
  24.         end
  25.         data(m,n)=Sum;
  26.     end
  27. end
复制代码
 楼主| 发表于 2011-5-6 09:50 | 显示全部楼层
回复 2 # sunminmin 的帖子

SquareDiamond.m文件
  1. function [data]=SquareDiamond(N,initvalue,c)
  2. %输入N为:方阵的维数2^N+1,在方阵的四个角的顶点上放置的初值,
  3. %这里定为四个初值一样
  4. % Example:
  5. %          tic;
  6. %          d=SquareDiamond(8,5,0.5);
  7. %          colormap(gray); %设置渲染的颜色
  8. %          surf(d); %画出三维曲面
  9. %          shading flat; %各小曲面之间不要网格
  10. %          toc %测试运行时间

  11. n=2^N;
  12. data=zeros(n+1);
  13. data(1,1)=initvalue;
  14. data(1,n+1)=initvalue;
  15. data(n+1,1)=initvalue;
  16. data(n+1,n+1)=initvalue;
  17. data=mytry(data,n,c,n);

  18. function [x]=rnd(absvalue)
  19. %扩展的随机函数生成器,产生绝对值小于absvalue的随机实数
  20. x=(rand(1)-0.5)*2*absvalue;

  21. function [data]=mytry(data,m,r,n)
  22. %square=========================================
  23. %x-------x
  24. %---------
  25. %-- 0 -- 由四个x定中间的0
  26. %---------
  27. %x-------x
  28. for i=1:m:n
  29. for j=1:m:n
  30. data((i+i+m)/2,(j+j+m)/2)=(data(i,j)+data(i,j+m)+data(i+m,j)+data(i+m,j+m))/4+rnd(r);
  31. end
  32. end
  33. %diamond========================================
  34. %----x--
  35. %-----
  36. %x- 0 -x 由四个x定中间的0
  37. %--------
  38. %----x---

  39. %钻石步骤的横向部分
  40. %line No.1
  41. for j=1+m/2:m:n
  42. data(1,j)=(data(1,j+m/2)+data(1+m/2,j)+data(1,j-m/2)+data(n+1-m/2,j))/4+rnd(r);
  43. end
  44. %middle
  45. for i=1+m:m:n
  46. for j=1+m/2:m:n
  47. data(i,j)=(data(i,j+m/2)+data(i+m/2,j)+data(i,j-m/2)+data(i-m/2,j))/4+rnd(r);
  48. end
  49. end
  50. %line last
  51. for j=1+m/2:m:n
  52. data(n+1,j)=(data(n+1,j+m/2)+data(1+m/2,j)+data(n+1,j-m/2)+data(n+1-m/2,j))/4+rnd(r);
  53. end

  54. %钻石步骤的纵向部分
  55. %line No.1
  56. for i=1+m/2:m:n
  57. data(i,1)=(data(i,1+m/2)+data(i+m/2,1)+data(i,n+1-m/2)+data(i-m/2,1))/4+rnd(r);
  58. end
  59. %middle
  60. for i=1+m/2:m:n
  61. for j=1+m:m:n
  62. data(i,j)=(data(i,j+m/2)+data(i+m/2,j)+data(i,j-m/2)+data(i-m/2,j))/4+rnd(r);
  63. end
  64. end
  65. % line last
  66. for i=1+m/2:m:n
  67. data(i,n+1)=(data(i,1+m/2)+data(i+m/2,n+1)+data(i,n+1-m/2)+data(i-m/2,n+1))/4+rnd(r);
  68. end

  69. if (m>2)
  70. data=mytry(data,m/2,r/2,n); %递归
  71. end
复制代码
 楼主| 发表于 2011-5-6 09:52 | 显示全部楼层
回复 3 # sunminmin 的帖子

createmap.m文件
  1. clc
  2. clear all
  3. close all
  4. %map1 随机地表。
  5. Z1=SquareDiamond(6,2,8);
  6. figure(1);
  7. surf(Z1); %画出三维曲面
  8. shading flat; %各小曲面之间不要网格
  9. %map2 山峰图
  10. h=[20,35,25];
  11. x0=[10,40,45];
  12. y0=[10,25,50];
  13. xi=[5.5,8,5];
  14. yi=[5,7,6];
  15. Z2=CeatHill(3,h,x0,y0,xi,yi,65);
  16. figure(2);
  17. surf(Z2); %画出三维曲面
  18. shading flat; %各小曲面之间不要网格
  19. %map3 合成图
  20. Z3=max(Z1,Z2);
  21. figure(3);
  22. surf(Z3); %画出三维曲面
  23. shading flat; %各小曲面之间不要网格


复制代码
 楼主| 发表于 2011-5-6 09:54 | 显示全部楼层
回复 4 # sunminmin 的帖子

上面3个M-File文件用于生成三维随机地形图。
 楼主| 发表于 2011-5-6 09:57 | 显示全部楼层
回复 5 # sunminmin 的帖子

因为做航迹规划时,地理环境是不变的(地形),在生成的随机地形图中取一个地形用于航迹规划,然后在此图是上做航迹规划。
 楼主| 发表于 2011-5-6 09:57 | 显示全部楼层
回复 6 # sunminmin 的帖子

求解决!!!
发表于 2011-5-6 15:01 | 显示全部楼层
本帖最后由 coohit 于 2016-7-21 11:26 编辑

这个问题应该有三个方面吧:
1,在VC中用MFC建立windows界面,该界面要能有满足用户的交互需求,读入用户参数,并向用户展示结果。
2,具体算法的实现,在你的例子中, 是航迹规划算法。
3,算法实现代码与界面代码的交互。

从你贴的程序来看,第二点应该是解决了,第一点更多的是与用户需求有关,当然也跟你的程序设计有关,技术上应该不是难点,至于matlab与VC的交互,论坛上也有很多讨论,可以检索一下:
http://forum.vibunion.com/thread-97127-1-1.html
http://forum.vibunion.com/thread-147556-1-1.html
 楼主| 发表于 2011-5-6 16:16 | 显示全部楼层
回复 5 # sunminmin 的帖子

file:///C:/Documents%20and%20Settings/Administrator/Application%20Data/Tencent/Users/573362313/QQ/WinTemp/RichOle/Q%7BJ%60%25JLH(C5IU2%7BZH]0V79N.jpg
 楼主| 发表于 2011-5-6 16:39 | 显示全部楼层
回复 8 # Rainyboy 的帖子

谢谢!!

能附个关于VC++调用matlab引擎利用三维A*算法在指定地形图中生成飞行器航迹的代码例子吗?
我第一次接触vc++与matlab混合编程编写考虑飞行器机动性能,避开地形威胁并绘制飞行器航迹的程序。

望指教,不胜感激!!在线等待。。。。。。。
 楼主| 发表于 2011-5-6 16:47 | 显示全部楼层
回复 10 # sunminmin 的帖子

能做到设置起点(x1,y1,z1)考虑飞机机动性能最小航迹段,最低飞行高度,最大拐弯角和最大爬升/俯冲角,以及避开地形威胁,到达终点(x2,y2,z2)在三维地形图中生成一条轨迹就行。
发表于 2011-5-6 17:55 | 显示全部楼层
回复 11 # sunminmin 的帖子

VC与MATLAB的交互是一个独立的方面,你关注的算法是另一个方面,不能说
“能附个关于VC++调用matlab引擎利用三维A*算法在指定地形图中生成飞行器航迹的代码例子吗?”
而是说通过探索和学习,先实现vc与matlab的数据交互,然后再在matlab中去实现具体算法,这两方面我都没有现成的代码,抱歉。
 楼主| 发表于 2011-5-6 18:09 | 显示全部楼层
回复 12 # Rainyboy 的帖子

谢谢指教,说得对“通过探索和学习”。我应该静下心学习。
 楼主| 发表于 2011-5-6 19:50 | 显示全部楼层
回复 5 # sunminmin 的帖子

如何获取上面3个m文件生成的三维地形图的坐标(x,y,z)信息??
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-20 16:58 , Processed in 0.052871 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表