file: rrt_graph.h

brief:这个rrt_graph.h文件是为了绘制rrt的地图,主要内容是包括任意障碍物的绘制方法的功能实现

author:AIplusX

version:beta_v0.0

date:2021_12_01

update:2021_12_01

warning:记得在类的析构函数里面delete掉堆内申请的内存

remarks:无

todo:可以做为之后rrt改进算法绘图类的基类

#pragma once

#include "Graph.h"

class rrtGraph
{
public:
    rrtGraph();
    ~rrtGraph();
    void init_obs_start_end();

private:
    rrtPara* rrt_graph_para = new rrtPara;
};

file:rrt_graph.h

brief:用户数据结构体

author:AIplusX

param:无

return:无

exception:无

note:无

remarks:无

typedef struct _rrt_para
{
    int rrt_graph_width = 960;//可走地图宽度,窗口宽度
    int rrt_graph_height = 480;//可走地图高度
    int block = 16;//起点,终点方块
    int rrt_graph_real_height = rrt_graph_height + block * 3;//窗口高度
    int obstacle_r = 30;//绘制障碍物画笔半径
    int separating_line = 5;//下方分割线宽度
    int rrt_line_width = 3;//探索路径宽度
    int rrt_edge_len = 20;//探索路径长度
    float beta = 0.5;//随机点延伸和终点延伸的概率阈值
    int avoid_obstacles_cnt = 5;//避障时的像素点要求
}rrtPara;

file:rrt_graph.cpp

brief:rrt地图的初始化,主要是可以绘制任意形状的障碍物

author:AIplusX

param:私有成员变量

return:无

exception:无

note:主要逻辑在上一篇文章中已经写过了,在此不再赘述,请移步阅读

remarks:无

rrtGraph::rrtGraph()
{

    init_obs_start_end();

    //while (1) {
    //    HWND wnd = GetHWnd();
    //    if (MessageBox(wnd, _T("rrt is over.\ndo it again?"), _T("ask"), MB_YESNO | MB_ICONQUESTION) == IDYES)
    //        init_obs_start_end();
    //}
    //else
    //    Quit();

}

void rrtGraph::init_obs_start_end()
{
    initgraph(rrt_graph_para->rrt_graph_width, rrt_graph_para->rrt_graph_real_height);
    settextstyle(16, 8, _T("Consolas"));
    setbkcolor(WHITE);
    settextcolor(BLACK);
    setlinestyle(PS_DASHDOT, rrt_graph_para->separating_line);
    setlinecolor(BLACK);
    setfillstyle(BS_SOLID);
    cleardevice();

    setfillcolor(RED);
    solidrectangle(0, 0, rrt_graph_para->block, rrt_graph_para->block);
    setfillcolor(GREEN);
    solidrectangle(rrt_graph_para->rrt_graph_width - rrt_graph_para->block,
        rrt_graph_para->rrt_graph_height - rrt_graph_para->block,
        rrt_graph_para->rrt_graph_width, rrt_graph_para->rrt_graph_height);

    setfillcolor(BLACK);


    line(0, rrt_graph_para->rrt_graph_height + rrt_graph_para->separating_line,
        rrt_graph_para->rrt_graph_width,
        rrt_graph_para->rrt_graph_height + rrt_graph_para->separating_line);

    bool mouse_down_flag = false;
    ExMessage mse;

    while (1) {
        mse = getmessage(EM_MOUSE | EM_KEY);

        if (mouse_down_flag == false && mse.message == WM_RBUTTONDOWN) {
            mouse_down_flag = true;
            while (1) {
                mse = getmessage(EM_MOUSE);
                if (mse.message == WM_RBUTTONUP) {
                    mouse_down_flag = false;
                    break;
                }
                else {solidcircle(mse.x, mse.y, rrt_graph_para->obstacle_r);}
            }
        }
        else if (mse.message == WM_LBUTTONUP) {
            setfillcolor(GREEN);
            solidcircle(0 + rrt_graph_para->block, rrt_graph_para->rrt_graph_height+block, 
                rrt_graph_para->obstacle_r/4);
            break;
        }
    }


}

file:rrt_graph.cpp

brief:析构函数

author:AIplusX

param:无

return:无

exception:无

note:释放掉堆里的内存

remarks:以后设计类的时候记得要把类的析构函数设计成virtual的

rrtGraph::~rrtGraph()
{
    delete rrt_graph_para;
}