sunminmin 发表于 2011-5-6 09:45

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

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

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

sunminmin 发表于 2011-5-6 09:48

回复 1 # sunminmin 的帖子

生成三维随机地形图的代码,用matlab实现:
CeatHill.m文件function =CeatHill(N,h,x0,y0,xi,yi,num)
%创建小山丘模型,N座山,H为山的高度,X0,Y0为山的坐标。XI,YI为山丘的斜度,NUM为山丘模型数据的维数。
%XI,YI的值越大,山丘就越平坦
% Example:
%          tic;
%          h=;
%          x0=;
%          y0=;
%          xi=[];
%          yi=[];
%          d=CeatHill(3,h,x0,y0,xi,yi,65);
%          colormap(gray); %设置渲染的颜色
%          surf(d); %画出三维曲面
%          shading flat; %各小曲面之间不要网格
%          toc %测试运行时间
x=1:1:num;y=1:1:num;
%z2=zeros(1,4);
for m=1:num
    for n=1:num
      Sum=0;
      for k=1:N
            s=h(k)*exp(-((x(m)-x0(k))/xi(k))^2-((y(n)-y0(k))/yi(k))^2);
            Sum=Sum+s;
      end
      data(m,n)=Sum;
    end
end

sunminmin 发表于 2011-5-6 09:50

回复 2 # sunminmin 的帖子

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

n=2^N;
data=zeros(n+1);
data(1,1)=initvalue;
data(1,n+1)=initvalue;
data(n+1,1)=initvalue;
data(n+1,n+1)=initvalue;
data=mytry(data,n,c,n);

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

function =mytry(data,m,r,n)
%square=========================================
%x-------x
%---------
%-- 0 -- 由四个x定中间的0
%---------
%x-------x
for i=1:m:n
for j=1:m:n
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);
end
end
%diamond========================================
%----x--
%-----
%x- 0 -x 由四个x定中间的0
%--------
%----x---

%钻石步骤的横向部分
%line No.1
for j=1+m/2:m:n
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);
end
%middle
for i=1+m:m:n
for j=1+m/2:m:n
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);
end
end
%line last
for j=1+m/2:m:n
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);
end

%钻石步骤的纵向部分
%line No.1
for i=1+m/2:m:n
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);
end
%middle
for i=1+m/2:m:n
for j=1+m:m:n
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);
end
end
% line last
for i=1+m/2:m:n
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);
end

if (m>2)
data=mytry(data,m/2,r/2,n); %递归
end

sunminmin 发表于 2011-5-6 09:52

回复 3 # sunminmin 的帖子

createmap.m文件clc
clear all
close all
%map1 随机地表。
Z1=SquareDiamond(6,2,8);
figure(1);
surf(Z1); %画出三维曲面
shading flat; %各小曲面之间不要网格
%map2 山峰图
h=;
x0=;
y0=;
xi=;
yi=;
Z2=CeatHill(3,h,x0,y0,xi,yi,65);
figure(2);
surf(Z2); %画出三维曲面
shading flat; %各小曲面之间不要网格
%map3 合成图
Z3=max(Z1,Z2);
figure(3);
surf(Z3); %画出三维曲面
shading flat; %各小曲面之间不要网格


sunminmin 发表于 2011-5-6 09:54

回复 4 # sunminmin 的帖子

上面3个M-File文件用于生成三维随机地形图。

sunminmin 发表于 2011-5-6 09:57

回复 5 # sunminmin 的帖子

因为做航迹规划时,地理环境是不变的(地形),在生成的随机地形图中取一个地形用于航迹规划,然后在此图是上做航迹规划。

sunminmin 发表于 2011-5-6 09:57

回复 6 # sunminmin 的帖子

求解决!!!

Rainyboy 发表于 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

sunminmin 发表于 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

sunminmin 发表于 2011-5-6 16:39

回复 8 # Rainyboy 的帖子

谢谢!!

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

望指教,不胜感激!!在线等待。。。。。。。

sunminmin 发表于 2011-5-6 16:47

回复 10 # sunminmin 的帖子

能做到设置起点(x1,y1,z1)考虑飞机机动性能最小航迹段,最低飞行高度,最大拐弯角和最大爬升/俯冲角,以及避开地形威胁,到达终点(x2,y2,z2)在三维地形图中生成一条轨迹就行。

Rainyboy 发表于 2011-5-6 17:55

回复 11 # sunminmin 的帖子

VC与MATLAB的交互是一个独立的方面,你关注的算法是另一个方面,不能说
“能附个关于VC++调用matlab引擎利用三维A*算法在指定地形图中生成飞行器航迹的代码例子吗?”
而是说通过探索和学习,先实现vc与matlab的数据交互,然后再在matlab中去实现具体算法,这两方面我都没有现成的代码,抱歉。

sunminmin 发表于 2011-5-6 18:09

回复 12 # Rainyboy 的帖子

谢谢指教,说得对“通过探索和学习”。我应该静下心学习。{:{17}:}

sunminmin 发表于 2011-5-6 19:50

回复 5 # sunminmin 的帖子

如何获取上面3个m文件生成的三维地形图的坐标(x,y,z)信息??
页: [1]
查看完整版本: 如何在VC++中建立MFC AppWizard工程实现三维A*算法