精华内容
下载资源
问答
  • 2021-04-18 06:38:37

    图的绘制(1)网线图mesh函数 函数名 说明 mesh 三维网格图 函数名 meshc 说明 将网格与等高线结合 meshz 屏蔽的网格图 meshgrid 生成网格点 MATLAB对于网格的处理......

    实验地点:大成楼 A210 实验目的:1、掌握绘制三维曲线的方法; 2、掌握绘制三维网格图和三维曲面图的方法; 3、比较绘制三维图形和二维图形的方法,了解其中的相似点。...

    数学2-用MATLAB绘制二维三维图形(lq) 2.1二维图形...('sine and cosine cruves') %标记图名 text(...d 2)按上述划分生成投影域上全部网格节点的坐标矩阵......

    用matlab绘制二维、三维图形 2.1二维图形的绘制 ? ...绘制直方图;使用stairs(x,y)命令实现 绘制阶梯图。...2)按上述划分生成投影域上全部网格节点的坐标矩阵。...

    (x,y,z) 有等位线投影的实心网格图 [x,y,z]=cylinder(r,n) 三维旋转曲面,其中n为母线的条数 Matlab软件例1:在区间[0,10π]画出参数曲线x=sint, y=......

    利用在X-Y平面的矩形网格点上的Z轴坐标值,Matlab 定义了一个网格曲面。三维网格图的形成原理为:在X-Y平 面上指定一个长方形区域,采用与坐标轴平行的直线将其......

    应用 MATLAB 绘制二次曲面图 1、用 surf 工 mesh 函数绘图 Surf 函数绘制的是三维表面图,mesh 函数绘制的是三维网格图,当二次曲面方程是标准方 程时,原方程式......

    沿z轴按每一网格变化) 调用格式: surf(x,y,z) —— 绘制三维曲面图,x,y,z为图形坐标向量 peaks 函数 为了方便测试立体绘图,MATLAB提供了一个peaks 函数,可......

    helix'),text(0,0,0,'origin'); xlabel('sin(t)'),ylabel('cos(t)'),zl abel('t'); grid; 4.4 三维图形二、mesh函数 mesh函数用于绘制三维网格图......

    三维网格图 mesh函数为数据点绘制网格线: mesh(z) —— z为n×m的...

    Matlab 绘图 Matlab 绘图如何画出 y=sin(x) 在 [0, 2*pi] 上的图像? ...确定的曲面图,参数含义同 mesh mesh 绘制网格图,surf 绘制着色的三维表面图 ?...

    grid; 三维图形 ? 二、mesh函数 ? mesh函数用于绘制三维网格图。在不需要绘制特别精细的三维曲 面结构图时,可以通过绘制三维网格图来表示三维曲面。三维曲 面的......

    信息工程学院 MATLAB 及仿真技术实验报告课程名称: 机房: 实验日期: 实验班级: 实验名称: 实验设备 、设施: 实验要求: 三维图形绘制和动画制作 计算机 Matlab7.0......

    执行后,所得到的网格坐标矩阵和上法,相同,当 x=y 时,可以写成 meshgrid(x) 2.绘制三维曲面的函数 Matlab 提供了 mesh 函数和 surf 函数来绘制三维曲面图。...

    图的绘制(1)网线图mesh函数 函数名 说明 mesh 三维网格图 函数名 meshc 说明 将网格与等高线结合 meshz 屏蔽的网格图 meshgrid 生成网格点 MATLAB对于网格的处理......

    . 1 二、绘制三维网格图和曲面图 1. meshgrid命令为了绘制三维立体图形,MATLAB的方法是将x方向 划分为m份,将y方向划分为n份,meshgrid命令是以x、y 向量为......

    helix'),text(0,0,0,'origin'); xlabel('sin(t)'),ylabel('cos(t)'),zl abel('t'); grid; 4.4 三维图形二、mesh函数 mesh函数用于绘制三维网格图......

    110N TEcHNIQuES 人工智能及识别技术 基于Matlab绘制三维地质图形李文华.张群龙(...%为了使等值线和表面图光滑,对网格进行iIlte叩2插 %值,得到加密后的网格 x......

    图的绘制(1)网线图mesh函数 函数名 说明 mesh 三维网格图 函数名 meshc 说明 将网格与等高线结合 meshz 屏蔽的网格图 meshgrid 生成网格点 MATLAB对于网格的处理......

    matlab画图功能很强大 介绍了从0开始的三维画图 以及后来的符号作图等等 ...作图命令:mesh mesh(X,Y,Z) 绘制由矩阵 X, Y, Z 所确定的曲面网格图 ?...

    更多相关内容
  • 通过sms 得到grd文件,以此画出网格图
  • 它包含:平铺或离散化输入地图、路径规划(最短路径)、稀疏网格图等。 % 主函数将输入图像(.png、.jpg、.bmp)转换(离散化)为网格% 稀疏矩阵形状的图(网格单元)。 此外,dijkstra 算法是% 应用于寻找点之间的...
  • 郑州网格图

    2019-01-10 10:41:00
    郑州的网格图,可以用它进行地图的开发,制作热力图
  • MATLAB非结构三角形网格作图程序,网格有SMS得到,格式只是读取问题
  • 网格地图软件

    2013-10-10 16:40:21
    HAM 用网格地图转换,但是转换精度不高,不如在www.qrz.com的grid中详细。
  • 6.3.16、挖填前后原地形测量记录网格图
  • Unity 制作一个网格地图生成组件

    千次阅读 热门讨论 2021-08-01 19:03:13
    如果你玩过三国志这种类型的战旗游戏或者模拟城市、部落冲突、海岛奇兵这种模拟经营类的游戏,那么你对网格地图一定不会陌生。在这些游戏中,所有地图场景中的物体都是基于整齐的网格来记录位置等信息。 如果你还是...

    前言

    如果你玩过三国志这种类型的战旗游戏或者模拟城市、部落冲突、海岛奇兵这种模拟经营类的游戏,那么你对网格地图一定不会陌生。在这些游戏中,所有地图场景中的物体都是基于整齐的网格来记录位置等信息。如下图:
    我在网上找了一张图

    如果你还是感知不到什么是网格地图。俄罗斯方块或者贪吃蛇你一定不会陌生,物体的存在是依托于规整的网格地图而存在的。

    还是一如既往,本篇文章为零基础小白文,如果你是小萌新,并且对网格地图感兴趣的话,可以学习本片文章,然后尝试创建自己的游戏吧!

    本文章的最终显示效果为:
    在这里插入图片描述

    1,创建组建出网格的基本单元

    我们知道网格是由一个个格子组成的,所以第一步需要先创建出一个基本的模板:

    创建一个脚本命名为Grid,并定义一些我们需要修改的属性,由于本案例我想要创建一个有障碍物的地图,用来作为A*寻路的地图。所以需要下面的信息:

    • 模板宽度
    • 模板高度
    • 模板颜色
    • 模板是否为障碍(由颜色标识)
    • 模板点击事件(模板颜色转换)

    编写模板脚本:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System;
    
    public class Grid : MonoBehaviour
    {
    
        public float gridWidght;
        public float girdHeight;
        public bool isHinder;
        public Color color;
        public Action OnClick;    
        //当网格地图比较大时,每帧更新模板颜色比较消耗性能,可以修改为通过事件触发
        void Update()
        {
            gameObject.GetComponent<MeshRenderer>().material.color=color;
        }
        //委托绑定模板点击事件
        private void OnMouseDown()
        {
            OnClick?.Invoke();
        }
    
    }
    

    编写好脚本后,创建模板预制体,本案例就使用一个简单的方块来作为演示案例,为了保证可以区分每一个方格,大小缩放到0.9,这样两个方格之间就会有空隙来分割不同的网格块。

    创建好方格后,将Grid脚本挂在到物体上,并设置相关的初始参数,具体如图:

    在这里插入图片描述

    2,编辑网格创建脚本

    接下来我们就需要封装一个网格创建的脚本,创建一个脚本命名为GridMeshCreate,然后编写该脚本,为了实现创建网格地图的功能,我们需要获取到一些基本信息:

    • 创建网格的宽度:xGrid预制体的个数
    • 创建网格的高度:yGrid预制体的个数
    • 创建网格中Grid的位置:通过一个初始点,然后通过Grid的长宽计算

    完成上面的信息的定义后,我们就可以编写脚本来实现网格创建的功能了,但是在此之前我们要思考一个问题,我们的创建的每一个Grid的会完全一摸一样吗。答案肯定是不会。比如说,在一些模拟经营的游戏中,一个物体可能会对周围的环境造成一些影响,为了标识其影响范围,就需要通过不同颜色的网格来表示,如图所示:

    请添加图片描述在上面的图片中可以看出,我们需要对于不同区块的网格进行不同的信息展示,这就需要我们在网格创建时传入对应的处理逻辑。具体的代码结构为:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System;
    
    
    public class GridMeshCreate : MonoBehaviour
    {
        [Serializable]
        public class MeshRange
        {
            public int widght;
            public int height;
        }
        //网格的宽高范围
        public MeshRange meshRange;
        //生成网格起始点
        public Vector3 startPos;
        //网格生成的父物体
        public Transform parentTran;
        //模板预制体
        public GameObject gridPre;
        
        private Grid[,] m_grids;
        public Grid[,] MeshGridData
        {
            get
            {
                return m_grids;
            }
        }
        //注册模板事件
        public Action<Grid> gridEvent;
    
        /// <summary>
        /// 基于挂载组件的初始数据创建网格
        /// </summary>
        public void CreateMesh()
        {
            if (meshRange.widght == 0 || meshRange.height == 0)
            {
                return;
            }
            ClearMesh();
            m_grids = new Grid[meshRange.widght, meshRange.height];
            for (int i = 0; i < meshRange.widght; i++)
            {
                for (int j = 0; j < meshRange.height; j++)
                {
                    CreateGrid(i, j);
    
                }
            }
        }
    
        /// <summary>
        /// 重载,基于传入宽高数据来创建网格
        /// </summary>
        /// <param name="height"></param>
        /// <param name="widght"></param>
        public void CreateMesh(int height,int widght)
        {
            if (widght == 0 || height == 0)
            {
                return;
            }
            ClearMesh();
            m_grids = new Grid[widght, height];
            for (int i = 0; i < widght; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    CreateGrid(i, j);
                }
            }
        }
    
        /// <summary>
        /// 根据位置创建一个基本的Grid物体
        /// </summary>
        /// <param name="row">x轴坐标</param>
        /// <param name="column">y轴坐标</param>
        public void CreateGrid(int row,int column)
        {
            GameObject go = GameObject.Instantiate(gridPre, parentTran);
            Grid grid = go.GetComponent<Grid>();
    
            float posX = startPos.x + grid.gridWidght * row;
            float posZ = startPos.z + grid.girdHeight * column;
            go.transform.position = new Vector3(posX, startPos.y, posZ);
            m_grids[row, column] = grid;
            gridEvent?.Invoke(grid);
        }
    
        /// <summary>
        /// 删除网格地图,并清除缓存数据
        /// </summary>
        public void ClearMesh()
        {
            if (m_grids == null || m_grids.Length == 0)
            {
                return;
            }
            foreach (Grid grid in m_grids)
            {
                if (grid.gameObject != null)
                {
                    Destroy(grid.gameObject);
                }
            }
            Array.Clear(m_grids, 0, m_grids.Length);
        }
    }
    

    关于上面的脚本,有下面的两个关键点:

    • 创建网格
    • 对外暴露处理Grid逻辑的方法

    关于网格的创建,在脚本中,我们写了一个重载的方法public void CreateMesh(int height,int widght),传入了网格宽和高,来方便通过后期通过脚本灵活的修改网格的宽和高(注意这里的宽和高指的是x轴与y轴格子的个数)

    而对于Grid逻辑对外暴露的实现,是利用在创建预制体时,为其添加一个委托事件。这样就可以在我们其他脚本创建时写入逻辑方法,而不需要对于这个封装好的网格地图创建类进行修改,而关于委托的一些知识,可以查看我之前的文章:

    关于委托的文章:

    3,地图生成案例

    在我们封装好网格创建的脚本后,就可以通过该脚本来做一个简单的网格地图来演示其用法

    创建脚本命名为MainRun ,并进行编辑:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class MainRun : MonoBehaviour
    {
        //获取网格创建脚本
        public GridMeshCreate gridMeshCreate;
        //控制网格元素grid是障碍的概率
        [Range(0,1)]
        public float probability;
    
        private void Update()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                Run();
            }
        }
        private void Run()
        {
            
            gridMeshCreate.gridEvent = GridEvent;
            gridMeshCreate.CreateMesh();
        }
    
        /// <summary>
        /// 创建grid时执行的方法,通过委托传入
        /// </summary>
        /// <param name="grid"></param>
        private void GridEvent(Grid grid)
        {
            //概率随机决定该元素是否为障碍
            float f = Random.Range(0, 1.0f);
            Debug.Log(f.ToString());
            grid.color = f <= probability ? Color.red : Color.white;
            grid.isHinder = f <= probability;
            //模板元素点击事件
            grid.OnClick = () => {
                if (!grid.isHinder)
                    grid.color = Color.blue;
            };
    
        }
    }
    

    可以看到,在Run方法中是对于我们网格创建框架的一个调用,而在GridEvent(Grid grid)中我们就可以写入我们的逻辑,并通过修改Grid脚本中的代码来辅助完成我们需要的效果,比如本案例中在Grid写入了一个点击事件,就可以在创建时通过委托定义该事件。

    注意:

    • 在脚本里面用到了Random.Range(0, 1.0f)来生成一个概率,注意不要写成Random.Range(0, 1),因为这样输出的结果只能为整数,即只能输出零

    在编写完成脚本后,就可以将GridMeshCreate脚本挂载到场景中的物体上,并根据注释进行相关的赋值。如图:
    在这里插入图片描述

    完成脚本挂载后点击运行,进入游戏后,点击空格键就会创建一张地图,在地图中会有随机的障碍物,以红色来标识障碍物,不可被点击,而白色区域点击后颜色变为蓝色,具体效果如图所示:
    在这里插入图片描述

    补充

    在使用网格地图创建的代码时,也许你发现了一个不方便的地方,就是里面的一个变量类型是类名Grid,这样就会有局限性,我的预制体脚本只能挂载Grid,这显然是不方便的,因此后续我对其进行了一些修改,将Grid替换为GameObject 修改后的脚本为:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System;
    public class GridMeshCreate : MonoBehaviour 
    {
        [Serializable]
        public class MeshRange
        {
            public int horizontal;
            public int vertical;
        }
        [Header("网格地图范围")]
        public MeshRange meshRange;
        [Header("网格地图起始点")]
        private Vector3 startPos;
        [Header("创建地图网格父节点")]
        public Transform parentTran;
        [Header("网格地图模板预制体")]
        public GameObject gridPre;
        [Header("网格地图模板大小")]
        public Vector2 scale;
    
    
        private GameObject[,] m_grids;
        public GameObject[,] grids
        {
            get
            {
                return m_grids;
            }
        }
        //注册模板事件
        public Action<GameObject, int, int> gridEvent;
    
        /// <summary>
        /// 基于挂载组件的初始数据创建网格
        /// </summary>
        public void CreateMesh()
        {
            if (meshRange.horizontal == 0 || meshRange.vertical == 0)
            {
                return;
            }
            ClearMesh();
            m_grids = new GameObject[meshRange.horizontal, meshRange.vertical];
            for (int i = 0; i < meshRange.horizontal; i++)
            {
                for (int j = 0; j < meshRange.vertical; j++)
                {
                    CreateGrid(i, j);
    
                }
            }
        }
    
        /// <summary>
        /// 重载,基于传入宽高数据来创建网格
        /// </summary>
        /// <param name="height"></param>
        /// <param name="widght"></param>
        public void CreateMesh(int height, int widght)
        {
            if (widght == 0 || height == 0)
            {
                return;
            }
            ClearMesh();
            m_grids = new GameObject[widght, height];
            for (int i = 0; i < widght; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    CreateGrid(i, j);
    
                }
            }
        }
    
        /// <summary>
        /// 根据位置创建一个基本的Grid物体
        /// </summary>
        /// <param name="row">x轴坐标</param>
        /// <param name="column">y轴坐标</param>
        public void CreateGrid(int row, int column)
        {
            GameObject go = GameObject.Instantiate(gridPre, parentTran);
            //T grid = go.GetComponent<T>();
    
            float posX = startPos.x + scale.x * row;
            float posZ = startPos.z + scale.y * column;
            go.transform.position = new Vector3(posX, startPos.y, posZ);
            m_grids[row, column] = go;
            gridEvent?.Invoke(go, row, column);
        }
        /// <summary>
        /// 删除网格地图,并清除缓存数据
        /// </summary>
        public void ClearMesh()
        {
            if (m_grids == null || m_grids.Length == 0)
            {
                return;
            }
            foreach (GameObject go in m_grids)
            {
                if (go != null)
                {
                    Destroy(go);
                }
            }
            Array.Clear(m_grids, 0, m_grids.Length);
        }
    
    }
    

    总结

    这里只是介绍了一个简单的案例,如果你觉得有用的话,可以尝试基于GridMeshCreate脚本创建自己的网格地图生成方法,来做出自己想要的效果!

    展开全文
  • 挖填前后原地形测量记录网格图挖填前后原地形测量记录网格图挖填前后原地形测量记录网格图
  • 卷积码的编程程序,采用了先构造网格图,然后沿着网格图查找到方法(This is a convolution code programming procedure, the first constructed grid map, and then along the trellis to find methods)
  • 包括世界网格shp和地图shp文件
  • 带有其他封面的 Matlab 徽标。
  • 在MATLAB中,卷积码的维特比(Viterbi)译码实现通常需要先将生成多项式转换成网格图描述,然后才能利用网格图进行维特比译码。 生成多项式转网格图描述的built-in函数为poly2trellis,在MATLAB中,改函数为通信工具...
  • 这是如何从 MATLAB:registered: 中的函数创建网格图的示例。 阅读 MATLAB 文档中的“fmesh”函数。 此功能在 R2016a 或更新版本中可用。 有关更多示例,请转到 MATLAB 绘图库 - ...
  • 这是如何在 MATLAB:registered: 中创建 3D 网格图的示例。 阅读 MATLAB 文档中的“网格”函数。 有关更多示例,请转到 MATLAB 绘图库 - http://www.mathworks.com/discovery/gallery.html
  • unity开发之3d网格地图(一)

    千次阅读 2021-02-04 23:05:15
    简单整理下最近的get到的模块 — — 3d网格地图,这个功能在策略型游戏中应用比较广泛,基本情况下会将地图分割成正方形网格或者六边形网格...实现效果:正方形.png正六边形.png1.地图网格控制类public enum Grid...

    简单整理下最近的get到的模块 — — 3d网格地图,这个功能在策略型游戏中应用比较广泛,基本情况下会将地图分割成正方形网格或者六边形网格,下面就针对这两种情况进行实现。当然,鉴于本人能力有限,可能只能达到简单的启发作用,我也是在雨凇momo大神的启发下完成,希望有想法的小伙伴可以提出意见,进行探讨和优化。

    实现效果图:

    d71f1dd5e7c6

    正方形.png

    d71f1dd5e7c6

    正六边形.png

    1.地图网格控制类

    public enum GridShapeType

    {

    ///

    /// 正方形

    ///

    Square,

    ///

    /// 正六边形

    ///

    RegularHexagon,

    }

    public class MapGridCtr: MonoBehaviour

    {

    private const float MAXDIS = 10000001f;

    ///

    /// 网格线是否显示

    ///

    public bool showGrid = true;

    ///

    /// 网格线宽度

    ///

    public float gridLine = 0.1f;

    ///

    /// 网格线颜色

    ///

    public Color gridColor = Color.red;

    ///

    /// 网格线

    ///

    private GameObject[,] m_lines;

    ///

    /// 一个网格的基数

    ///

    public int coefficient = 8;

    ///

    /// 当前地图地形

    ///

    public Terrain m_terrian;

    ///

    /// 当前地图地形行数

    ///

    private int m_arrRow = 0;

    ///

    /// 当前地图地形宽度

    ///

    private int m_arrCol = 0;

    ///

    /// 当前地图vector3数据

    ///

    private Vector3[,] m_array;

    ///

    /// 网片形状

    ///

    public GridShapeType m_meshType;

    protected void Start()

    {

    this.LoadMap();

    }

    ///

    /// 加载地图数据

    ///

    public void LoadMap()

    {

    if (this.m_terrian == null)

    {

    Debug.Log("地形为空!");

    return;

    }

    if (this.m_meshType == GridShapeType.Square && this.coefficient < 2)

    {

    Debug.Log("网格基数必须大于2!");

    return;

    }

    TerrainData data = m_terrian.terrainData;

    int mapz = (int)(data.size.x / data.heightmapScale.x);

    int mapx = (int)(data.size.z / data.heightmapScale.z);

    this.m_arrRow = Math.Min(data.heightmapWidth, mapz);

    this.m_arrCol = Math.Min(data.heightmapHeight, mapx);

    float[,] heightPosArray = data.GetHeights(0, 0, this.m_arrRow, this.m_arrCol);

    this.m_array = new Vector3[this.m_arrRow, this.m_arrCol];

    for (int i = 0; i < this.m_arrRow; ++i)

    {

    for (int j = 0; j < this.m_arrCol; ++j)

    {

    this.m_array[i, j] = new Vector3(j * data.heightmapScale.x, heightPosArray[i, j] * data.heightmapScale.y, i * data.heightmapScale.z);

    }

    }

    if (this.showGrid)

    {

    this.ShowGrid();

    }

    }

    ///

    /// 显示地图网格

    ///

    private void ShowGrid()

    {

    switch (m_meshType)

    {

    case GridShapeType.Square:

    {

    this.ShowSquareGird();

    break;

    }

    case GridShapeType.RegularHexagon:

    {

    this.ShowRegularHexagon();

    break;

    }

    default:

    {

    Debug.LogError("暂不支持此形状! m_meshType: " + m_meshType);

    break;

    }

    }

    }

    ///

    /// 显示正方形网格

    /// coefficient代表边的网格数,最小为2

    ///

    private void ShowSquareGird()

    {

    Vector3[] pos;

    int rn = this.m_arrRow / (this.coefficient - 1);

    int cn = this.m_arrCol / (this.coefficient - 1);

    if (this.m_arrRow % (this.coefficient - 1) > 0)

    ++rn;

    if (this.m_arrCol % (this.coefficient - 1) > 0)

    ++cn;

    this.m_lines = new GameObject[rn, cn];

    for (int i = 0; i < this.m_arrRow - 1;)

    {

    int lastr = i + this.coefficient - 1;

    if (lastr >= this.m_arrRow)

    {

    lastr = this.m_arrRow - 1;

    }

    for (int j = 0; j < this.m_arrCol - 1;)

    {

    int lastc = j + this.coefficient - 1;

    if (lastc >= this.m_arrCol)

    {

    lastc = this.m_arrCol - 1;

    }

    if (lastr < this.m_arrRow - 1 && lastc < this.m_arrCol - 1)

    {

    pos = new Vector3[this.coefficient * 4];

    for (int k = 0; k < this.coefficient; ++k)

    {

    pos[0 * this.coefficient + k] = this.m_array[i, j + k];

    pos[1 * this.coefficient + k] = this.m_array[i + k, lastc];

    pos[2 * this.coefficient + k] = this.m_array[lastr, lastc - k];

    pos[3 * this.coefficient + k] = this.m_array[lastr - k, j];

    }

    this.CreatLine(i / (this.coefficient - 1), j / (this.coefficient - 1), pos);

    }

    else

    {

    int cr = lastr - i + 1;

    int cl = lastc - j + 1;

    pos = new Vector3[(cr + cl) * 2];

    for (int k = 0; k < cr; ++k)

    {

    pos[cl + k] = this.m_array[i + k, lastc];

    pos[cr + 2 * cl + k] = this.m_array[lastr - k, j];

    }

    for (int k = 0; k < cl; ++k)

    {

    pos[k] = this.m_array[i, j + k];

    pos[cr + cl + k] = this.m_array[lastr, lastc - k];

    }

    this.CreatLine(i / (this.coefficient - 1), j / (this.coefficient - 1), pos);

    }

    j = lastc;

    }

    i = lastr;

    }

    }

    ///

    /// 显示正六边形网格

    /// 正六边形边长最小为5,coefficient表示倍率

    ///

    private void ShowRegularHexagon()

    {

    this.coefficient = this.coefficient / 5;

    Vector3[] pos_1;

    Vector3[] pos_2;

    int num_1 = this.m_arrCol / (this.coefficient * (3 + 5)) * (this.coefficient * 5 + 1);

    int num_2 = this.m_arrCol % (this.coefficient * (3 + 5));

    if (num_2 > 0)

    {

    if (num_2 < 3 * this.coefficient)

    {

    num_2 = 1;

    }

    else

    {

    num_2 = num_2 - 3 * this.coefficient + 2;

    }

    }

    pos_1 = new Vector3[num_1 + num_2];

    pos_2 = new Vector3[num_1 + num_2];

    int rn = this.m_arrRow / (this.coefficient * (3 + 5));

    this.m_lines = new GameObject[rn, 2];

    for (int i = 4 * this.coefficient; i < this.m_arrRow;)

    {

    int index_1 = 0;

    int index_2 = 0;

    int r_1 = i - 4 * this.coefficient;

    int r_2 = i + 4 * this.coefficient;

    bool flag_1 = true;

    bool flag_2 = false;

    if (r_2 >= this.m_arrRow)

    {

    flag_1 = false;

    }

    for (int j = 0; j < this.m_arrCol;)

    {

    if (j % (this.coefficient * (3 + 5)) == 0)

    {

    flag_2 = !flag_2;

    if (flag_2)

    {

    pos_1[index_1++] = this.m_array[i, j];

    if (flag_1)

    {

    pos_2[index_2++] = this.m_array[i, j];

    }

    }

    else

    {

    pos_1[index_1++] = this.m_array[r_1, j];

    if (flag_1)

    {

    pos_2[index_2++] = this.m_array[r_2, j];

    }

    }

    j += 3 * this.coefficient;

    }

    else

    {

    if (flag_2)

    {

    pos_1[index_1++] = this.m_array[r_1, j];

    if (flag_1)

    {

    pos_2[index_2++] = this.m_array[r_2, j];

    }

    }

    else

    {

    pos_1[index_1++] = this.m_array[i, j];

    if (flag_1)

    {

    pos_2[index_2++] = this.m_array[i, j];

    }

    }

    ++j;

    }

    }

    this.CreatLine(i / (2 * 4 * this.coefficient), 0, pos_1);

    if (flag_1)

    {

    this.CreatLine(i / (2 * 4 * this.coefficient), 1, pos_2);

    }

    i += (4 * this.coefficient * 2);

    }

    }

    ///

    /// 创建网格线

    ///

    private void CreatLine(int row, int col, Vector3[] pos)

    {

    if(this.m_lines[row, col] != null)

    {

    GameObject.Destroy(this.m_lines[row, col]);

    }

    this.m_lines[row, col] = new GameObject();

    LineRenderer _lineRenderer = this.m_lines[row, col].AddComponent();

    _lineRenderer.material = new Material(Shader.Find("Particles/Additive"));

    _lineRenderer.SetColors(this.gridColor, this.gridColor);

    _lineRenderer.SetWidth(this.gridLine, this.gridLine);

    _lineRenderer.useWorldSpace = true;

    _lineRenderer.SetVertexCount(pos.Length);

    for (int i = 0; i < pos.Length; ++i)

    {

    _lineRenderer.SetPosition(i, pos[i]);

    }

    this.m_lines[row, col].name = "CreateLine " + row + " " + col;

    }

    }

    为什么正六边形的边长是5的倍数的,这是因为网格线是根据地形数据数组生成的,当边长最小为5时,正六边形的六个顶点会在数组中,这也会导致生成正六边形的网格线存在一定限制和漏洞。因为本人项目中网格线只是辅助,实际中并不需要,所以使用了LineRenderer 。

    到此,第一部分就结束了,欢迎大家拍砖,提出更好的解决方案。

    下一章会实现网格地图的点击选中状态。

    展开全文
  • python 可视化 ploty 画3dmesh网格图

    千次阅读 2021-02-03 08:08:49
    python 可视化 plotly 画3dmesh网格图最近在工作中遇到python 打印可视化3D图。需求是需要根据根据之前用matplotlib打印出来的效果不是很好。发现了非常强大的可视化包plotly。附上官方文档链接 ...

    python 可视化 plotly 画3dmesh网格图

    最近在工作中遇到python 打印可视化3D图。需求是需要根据根据之前用matplotlib打印出来的效果不是很好。发现了非常强大的可视化包plotly。附上官方文档链接 https://plot.ly/python/

    首先安装plotly包:

    pip install plotly

    # -*- coding:utf8 -*-

    import pandas as pd

    import numpy as np

    import plotly.graph_objs as go

    from collections import defaultdict

    import plotly.offline as py # 设置离线画图

    """

    打开原始CSV文件数据,必须保证csv 文件只有一行列名,并且检查输入查询的列名是否存在于文件中,存在则返回正确的列名用于坐标轴标签

    若存在,则提取这些列的数据,返回新的dataframe,

    若不存在,则报错不执行程序

    返回值: new_Df, correct_list

    """

    def check_file_column():

    input_file = input('请输入csv文件路径:')

    filename = input_file.strip()

    with open(filename, 'rb') as f:

    csv_data = pd.read_csv(f, encoding='gb2312')

    if len(csv_data.columns) != 3:

    print('文件列名不等于3列,请修改文件!')

    exit()

    correct_list = list(csv_data.columns.values)

    # 删除空的数据行

    new_Df = csv_data.dropna()

    # 将导入的各个类型变成正确的类型

    new_Df[new_Df.columns.values[0]] = new_Df[new_Df.columns.values[0]].apply(int)

    new_Df[new_Df.columns.values[2]] = new_Df[new_Df.columns.values[2]].apply(float)

    new_Df[new_Df.columns.values[1]] = new_Df[new_Df.columns.values[1]].apply(float)

    # 将new_Df进行排序

    new_Df.sort_values(new_Df.columns.values[0], inplace=True)

    return new_Df, correct_list

    """

    使用递归对input dataframe 进行处理,每次返回删除指定数据后的dataframe和需要删除的dataframe列表

    """

    def get_blockdata(csv_data_copy,sorted_pd_list):

    while csv_data_copy.size != 0:

    min_value = csv_data_copy.iloc[:, 0].min()

    # 筛选转速Speed的误差值在正负10之内,并组成新的dataframe

    diff_value_1 = min_value - 10

    diff_value_2 = min_value + 10

    pd_block = csv_data_copy[(csv_data_copy[csv_data_copy.columns.values[0]] > diff_value_1) & (csv_data_copy[csv_data_copy.columns.values[0]] < diff_value_2)]

    # 将pd_block按照Torque排序

    pd_block.sort_values(pd_block.columns.values[1], inplace=True)

    pd_block.reset_index(drop=True, inplace=True)

    # 将每个pd_block添加到一个sorted_pd list中

    sorted_pd_list.append(pd_block)

    # 从csv_data中删除pd_block的数据

    csv_data_copy.drop(

    csv_data_copy[(csv_data_copy[csv_data_copy.columns.values[0]] > diff_value_1) & (csv_data_copy[csv_data_copy.columns.values[0]] < diff_value_2)].index,

    inplace=True)

    return csv_data_copy, sorted_pd_list

    """

    提取CSV_data的数据,分别画网格线和3D平面图:

    x1,y1,z1 用于画3D mesh 图

    x2,y2,z2 用于画同一个x轴坐标上的不同y轴坐标点在三维空间上的线性图

    x3,y3,z3 用于画同一个y轴坐标上的不同x轴坐标点在三维空间上的线性图

    """

    def handle_data_plot_3D(csv_data, correct_list):

    # x1,y1,z1 用于画3D mesh 图

    x1 = np.array(list(csv_data.iloc[:, 0].values))

    y1 = np.array(list(csv_data.iloc[:, 1].values))

    z1 = np.array(list(csv_data.iloc[:, 2].values))

    # 将每个相同X值得数据提取放入一个pandas中

    csv_data_copy = csv_data

    # 用于存出每个数据块pandas数据

    sorted_pd_list = []

    csv_data_copy, sorted_pd_list = get_blockdata(csv_data_copy, sorted_pd_list)

    lines = []

    line_marker = dict(color='black', width=0.8)

    # 画同一个x轴坐标上的不同y轴坐标点在三维空间上的线性图

    for each in sorted_pd_list:

    x2 = np.array(list(each.iloc[:, 0].values))

    y2 = np.array(list(each.iloc[:, 1].values))

    z2 = np.array(list(each.iloc[:, 2].values))

    lines.append(go.Scatter3d(x=x2, y=y2, z=z2, mode='lines', line=line_marker, showlegend=False,hoverinfo='none'))

    # 用于存储每个数据块中相同index的数据字典

    x_y_z_row = defaultdict(list)

    for _ in sorted_pd_list:

    for index, row in _.iterrows():

    x_y_z_row[index].append([row[0], row[1], row[2]])

    # 提取每一数据块的x, y,z坐标字典

    each_index_x = defaultdict(list)

    each_index_y = defaultdict(list)

    each_index_z = defaultdict(list)

    for key, value in x_y_z_row.items():

    for each in value:

    each_index_x[key].append(each[0])

    each_index_y[key].append(each[1])

    each_index_z[key].append(each[2])

    # 遍历每个数据块的x,y,z坐标字典,每个块进行描点和画图

    for key, value in each_index_x.items():

    if key in each_index_y.keys() and key in each_index_z:

    x3 = value

    y3 = each_index_y[key]

    z3 = each_index_z[key]

    lines.append(go.Scatter3d(x=x3, y=y3, z=z3, mode='lines', line=line_marker, showlegend=False, hoverinfo='none'))

    fig = go.Figure(data=lines)

    fig.add_trace(go.Mesh3d(x=x1, y=y1, z=z1, opacity=0.80,intensity=z1,

    colorbar={"title": correct_list[2], "len": 0.6, },

    hoverinfo='x+y+z',

    colorscale='Portland',

    ))

    fig.update_layout(title='3D_Mesh_Grid plotly', autosize=False,

    width=900, height=900,

    margin=dict(l=65, r=50, b=65, t=90),

    scene=dict(

    xaxis_title=correct_list[0],

    yaxis_title=correct_list[1],

    zaxis_title=correct_list[2],

    )

    )

    fig.show()

    py.plot(fig, filename='pictures/3Dfigure.html', # 会生成一个网页文件

    image='png', ) # 设置保存的文件类型,不会在本地有个png的文件,需要在生成的网页打开另存为png的文件

    def main():

    # check columns and check files

    csv_data, correct_list = check_file_column()

    # 处理数据画网格图以及3Dmesh 图

    handle_data_plot_3D(csv_data, correct_list)

    if __name__ == '__main__':

    main()1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75

    76

    77

    78

    79

    80

    81

    82

    83

    84

    85

    86

    87

    88

    89

    90

    91

    92

    93

    94

    95

    96

    97

    98

    99

    100

    101

    102

    103

    104

    105

    106

    107

    108

    109

    110

    111

    112

    113

    114

    115

    116

    117

    118

    119

    120

    121

    122

    123

    124

    125

    126

    127

    128

    129

    130

    131

    132

    展开全文
  • % 打开网格图块选择器 %2)交互选择应将哪些图块用于子图 % 3) 检索子图排列矩阵: % 将其复制到剪贴板(通过 GUI 中的按钮)或调用: p = sbh.p; %%子图布置的工作流程: %1)定义子图尺寸m = 4; 行数n = 6;...
  • MATLAB——网格图画法

    千次阅读 2022-01-05 20:16:34
    相信工科生都会遇到需要画网格图的烦恼,怎么画出好看的网格图呢? 想要什么样的网格图,需要自己设计目标函数。 clc; clear; a = -2:0.1:2; [x ,y] = meshgrid(a);%% 表示区域网格设置,目的是为了让x,y成为矩阵格点...
  • matlab绘制网格图

    2021-04-18 05:04:19
    meshgrid函数用来生成坐标网格。eg. [X Y]=meshgrid(1:3, 10:...surf函数用来绘制三维曲面。[X Y]=meshgrid(-2:0.2:2, -2:0.2:2);Z=X.*exp(-X.^2 - Y.^2);surf(X, Y, Z)colorbarimage.png调用原型为:surf(x, y, ...
  • MATLAB绘图—三维网格绘图(mesh)

    千次阅读 2021-04-17 22:14:18
    MATLAB绘图—三维网格绘图-II 原创不易,路过的各位大佬请点个赞 《MATLAB绘图—三维绘图-I》博客主要讲了三维图的绘制,本博客主要讲 三维网格图 曲面图 柱面和球面图 三维图形等值线
  • jquery网格图片拖动是一款基于jQuery实现的可拖动的网格显示缩略全屏效果。 jquery网格图片拖动效果
  • jQuery网格图片轮播插件制作4x4方格内单个图片放大其他图片重新排列,网格图片缩放轮播特效,鼠标滑过哪个图片,那个图片就放大展示,其他图片压缩,源码里替换图片即可
  • 画带有坐标系的网格图,坐标网格图怎么画,matlab源码
  • 研究了3种网格图的剖分图的强边着色 .网格图的剖分图是指用一个长为2的路去替换网格图的每条边 .具体给出了六边形、四边形、三角形的网格剖分图的一种着色方法 ,以此为基础证明了 Sχ′(Γ6s ) = 4 ,Sχ′(Γ4s ) = ...
  • MATLAB 画颜色网格图

    2021-04-18 07:16:42
    作图代码clear;clc;%%%%%%%%画网格%%%%%%%%[m,n]=...%100*100的网格%%%%%%%%作图%%%%%%%%A=load('D:\Seminar\8_Tencent20160608\FuzzyLogicMike_UnityProject\expectationData_101X101.txt');surf(m,n,A);%%%%%%%%设...
  • grid_slam 基于网格图的同步定位与建图(SLAM)算法的matlab代码
  • python显示3D网格图

    千次阅读 2020-10-30 17:46:58
    from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np def himmelbau(x): return (x[0]**2 + x[1] - 1)**2 + (x[0] + x[1] **2 -7)**2 x = np.arange(-6,6,0.1) ...
  • Unity_创建平铺网格地图

    千次阅读 2021-10-31 15:17:21
    创建预制件 先拖进场景,再从层级拖回资源 选中源图像文件,设置每单位像素可以不改变组件缩放修改显示大小 脚本编辑 创建一个空对象和脚本文件 挂载脚本到空对象 双击脚本进入编辑 ... [Ser...
  • matlab 创建网格图和曲面图

    千次阅读 2019-07-02 21:17:00
    创建网格图和曲面图 关于网格图和曲面图 MATLAB®在x-y平面中的网格上方使用点的z坐标来定义曲面图,并使用直线连接相邻的点。mesh和surf函数以三维形式显示曲面图。 mesh生成仅使用颜色来标记连接定义点的线条...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 214,346
精华内容 85,738
关键字:

网格图