精华内容
下载资源
问答
  • 四边形网格

    千次阅读 2019-10-28 08:03:11
    有时候,四边形网格里会掺杂一些三角形面片,我们把这类网格也都叫做四边形网格。三角形网格常见于逆向建模领域,比如通过三维扫描仪扫描得到的网格。四边形网格常见于正向建模系统,如3dsMax,ZBrush等。这主要是...

    原文链接

    四边形网格定义

    • 四边形网格,顾名思义,它的每个网格面片是一个四边形。有时候,四边形网格里会掺杂一些三角形面片,我们把这类网格也都叫做四边形网格。三角形网格常见于逆向建模领域,比如通过三维扫描仪扫描得到的网格。四边形网格常见于正向建模系统,如3dsMax,ZBrush等。这主要是因为点云或者三角形网格转成四边形网格有一定的难度,特别是高质量的四边形网格。
    • 正则点:内点-度数为4;边界点(非拐点(Corner))-度数为3;边界点(凸拐点)-度数为2;边界点(凹拐点)-度数为4
    • 分类:主要是根据顶点的正则度来进行分类。如下图所示,第一类网格为正则网格,所有顶点度数为4,只有特殊拓扑结构的网格能达到正则;第二类是半正则网格,它是分片正则的;第三类是度数半正则网格,它的顶点度数绝大部分是4;最后一类是无序的四边形网格,它有很多非正则点。
      quad_category

    四边形网格的优缺点

    与三角形网格相比,四边形网格有一些优点:

    • 特征边对齐:四边形网格的边可以很自然的与特征边进行对齐,边走向也可以很自然的与模型的几何特征走向对齐。
    • 样条曲面和细分曲面:样条曲面和Catmull-Clark细分曲面常见的定义域就是四边形
    • 纹理贴图:半正则的四边形网格,每个正则片可以很好的与图片对齐,有利于图片的采样精确性
      同时四边形网格也有一些缺点:
    • 四边形可能不共面

    高质量的四边形网格

    • 奇异点个数尽量少,布局合理
    • 面片的边走向要与几何特征走向对齐
    • 边长尽量均匀化,或者自适应几何特征

    生成四边形网格的方法

    正向建模软件可以直接创建四边形网格。逆向建模的网格一般是三角形网格,需要方法把三角形网格转成四边形网格

    • Catmull-Clark细分三角形可以得到一个四边形网格,它的质量比较低,奇异点多,边走向不好。后续可以应用一些四边形网格优化的方法
    • 参数化方法
    • Morse-Smale complex 方法
    • 网格分割后,分片参数化的方法

    四边形网格的处理

    • 网格简化
    • 几何优化
    • 高阶曲面拟合,细分曲面拟合
    • 网格拓扑优化

    有兴趣的读者,欢迎参考视频版本

    展开全文
  • 四边形网格的统一插值细分方案
  • 提出了四边形网格的三分细分模式.对于正则和非正则四边形网格,分别采用不同的细分模板获得新的细分顶点.从双三次B样条中推导出正则四边形网格的三分细分模板,极限曲面C~2连续;对细分矩阵进行傅里叶变换,推导出非正则...
  • 在不规则四边形网格上构造C〜1连续曲面
  • 研究了基于背景三角网格的四边形网格间接生成算法,并针对三角形合并过程中容易残留三角形的缺陷提出了确定侧边的详细算法,该算法主要是依据背景三角网格中边的位置和前沿边的情形,通过背景三角网格中已存在的边、...
  • 高级图形学 四边形网格模型转换为三角形网格模型 c++代码及海豚模型示例 打开release文件夹中Tool.exe导入海豚模型即可
  • 2.2 背景三角形网格划分 目前流行的二维网格生成算法是推进波前法和 Delaunay 三角划分法。 2.2.1 边界输入 2.2.2 边界节点生成 2.2.3 内部节点生成 ...一般来说,网格质量是内部节点...2.3 四边形网格划分 2.3.1 三

    2.2 背景三角形网格划分

    目前流行的二维网格生成算法是推进波前法和 Delaunay 三角划分法。

    2.2.1 边界输入

    2.2.2 边界节点生成

    2.2.3 内部节点生成

    一般来说,网格质量是内部节点分布的函数,因此,网格划分过程中这个
    阶段是非常重要的,本文采用推进波前法生成内部节点

    2.2.4 三角形网格划分
    生成内部节点之后,用 Delaunay 法来划分三角形单元,检查每条线段试
    图选择一个节点,以使三角形的外接圆最小,且三角形不与前沿相交。

    2.3 四边形网格划分
    2.3.1 三角形网格转化为四边形网格

    2.3.2 残余三角形消除

    2.3.3 凹四边形消除

    Q:就不能把节点动一动吗?一定要在原来的节点上变来变去?

    2.4 光顺处理

    当网格划分后,可以通过光顺处理,协调网格疏密分布,减少畸形单元的
    数量。本文中选用拉普拉斯光顺算法,在保证单元拓扑结构不变的情况下,通
    过调整内部节点的位置来提高网格的质量,将与某节点相连的所有节点构成的
    多边形的形心取代该节点。

    光顺处理是移动节点。

    2.5 节点编号优化

     

    有价值的也就第二章,其他都是应用。

     

     

     

     

     

    展开全文
  • 四边形网格等值线追踪,数据文件格式为surfer 的grd格式
  • 船舶板架结构四边形网格自动生成方法及关键算法研究
  • 不知何故,生成的四边形网格不会填充整个轴,而是在网格的上方和右侧留下空间。在第二个问题是,虽然我调用autofmt_xdata(),但x轴标签没有旋转。以下是相关代码:class MyCanvas(FigureCanvas):def __...

    我使用matplotlib的Qt5后端,并尝试在figurecavas中嵌入一个绘图。现在我有一个用pcolormesh将大矩阵绘制到图形的axis对象中的问题。不知何故,生成的四边形网格不会填充整个轴,而是在网格的上方和右侧留下空间。在

    第二个问题是,虽然我调用autofmt_xdata(),但x轴标签没有旋转。以下是相关代码:class MyCanvas(FigureCanvas):

    def __init__(self, parent=None):

    self.figure = Figure()

    self.figure.set_tight_layout(True)

    self.matrix_axes = self.figure.add_subplot(111)

    divider = make_axes_locatable(self.matrix_axes)

    self.color_axes = divider.append_axes("right", size=0.1, pad=0.05)

    self.matrix_axes.hold(False)

    self.color_axes.hold(False)

    def build_connectivity_matrix(self, source_neurons, target_neurons):

    # plot the data,

    # data is a 2d numpy array

    color_mesh = self.matrix_axes.pcolormesh(data, cmap=color_map)

    # add tick labels

    self.matrix_axes.set_yticklabels(labels_y)

    self.matrix_axes.set_xticklabels(labels_x)

    self.figure.autofmt_xdate(rotation=30) # rotate x axis labels to fit more

    # plot color bar

    colorbar = self.figure.colorbar(color_mesh, cax=self.color_axes, orientation='vertical')

    canvas = MyCanvas()

    canvas.build_connectivity_matrix()

    有什么想法吗?在

    展开全文
  • unity 四边形网格下的移动范围显示 先上效果图,移动力三点,绿色格子消耗一点,棕色格子消耗两点,浅白色是移动范围。 移动力和消耗点数都可以自定义,下面就开始程序部分的说明,格子是用unity的tilemap...

     

    unity 四边形网格下的移动范围显示

    先上效果图,移动力三点,绿色格子消耗一点,棕色格子消耗两点,浅白色是移动范围。

    移动力和消耗点数都可以自定义,下面就开始程序部分的说明,格子是用unity的tilemap去做的,至于怎么刷格子,这里就不说了。

     

    定义一个List,用来存放移动方向。

     

        private static readonly List<Vector3Int> tileOffset = new List<Vector3Int>()
        {
            Vector3Int.down,Vector3Int.right,Vector3Int.up,Vector3Int.left
        };

     

    定义一个Dictionary,用来存格子的消耗点数。

        private static readonly Dictionary<string, int> tileMoveCostDictionary = new Dictionary<string, int>()
        {
            { "Base_Green",1},{"Base_Brown",2 }
        };

    定义三个List,分别用来储存移动范围内格子的tilemap坐标、高于一点消耗的格子的tilemap坐标、高消耗格子当前已经消耗点数(每回合+1点)。

        private List<Vector3Int> movePointRangeList;
        private List<Vector3Int> blockingPointList;
        private List<int> blockingRemainList;

     tilemap坐标如下。

     

     

    先初始化List,还有定义一个Camera并初始化,用于后面2D射线检测格子。

        void Start()
        {
            mainCamera = Camera.main;
            movePointRangeList = new List<Vector3Int>();
            blockingPointList = new List<Vector3Int>();
            blockingRemainList = new List<int>();
        }

     

    给白色格子加上BoxCollider2D并加上tag “Infantry”,给Tilemap加上TilemapCollider2D并加上tag “TileMap”,下面是在update里2D射线检测点击的是白色格子还是地图上的格子。

        // Update is called once per frame
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                raycastHit2D = Physics2D.Raycast(mainCamera.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
    
                if (raycastHit2D.collider != null)
                {
                    switch (raycastHit2D.transform.tag)
                    {
                        case "Infantry":
                            currentSelect = raycastHit2D.transform;
    
                            if (movePointObjParent.childCount == 0)
                            {
                                DisplayMovementRange(gridLayout.WorldToCell(raycastHit2D.point));
                            }
                            else
                            {
                                currentSelect = null;
    
                                CleanMovementRangeObj();
                            }
                            break;
                        case "TileMap":
                            if (currentSelect != null)
                            {
                                currentSelect.localPosition = gridLayout.CellToLocal(gridLayout.WorldToCell(raycastHit2D.point));
    
                                currentSelect = null;
    
                                CleanMovementRangeObj();
                            }
                            break;
                    }
                }
            }
        }

     

    再定义一些变量,tilemap和gridlayout就不说了即当前使用的tilemap,movePointPrefab是浅白色格子的prefab,其实就是一个sprite然后做成预制体,movePointObjParent是存放移动范围的GameObject,movementPoints表示移动点数,currentSelect表示当前选中的白色格子,考虑到可能有多个移动对象,所以这里这么处理。

        public Tilemap tilemap;
        public GridLayout gridLayout;
    
        public GameObject movePointPrefab;
        public Transform movePointObjParent;
    
        public int movementPoints;
    
        private Transform currentSelect;

     

    获取移动范围内的格子的函数如下,遇到高消耗格子就存到blockingPointList里面,然后下一次点数计算时,就把该格子对应响应点数+1,如果小于前面Dictionary里定义的消耗点数,继续放进队列里,直到不满足条件,才让该格子的四个方向进行探索。

        private void DisplayMovementRange(Vector3Int startPos)
        {
            Queue<Vector3Int> currentQueue = new Queue<Vector3Int>();
            Queue<Vector3Int> nextQueue = new Queue<Vector3Int>();
    
            Vector3Int currentPoint;
            Vector3Int nextPoint;
            int value;
    
            nextQueue.Enqueue(startPos);
    
            for (int i = 0; i < movementPoints; i++)
            {
                currentQueue = new Queue<Vector3Int>(nextQueue);
                nextQueue.Clear();
    
                while (currentQueue.Count > 0)
                {
                    currentPoint = currentQueue.Dequeue();
    
                    if (blockingPointList.Contains(currentPoint))
                    {
                        int index = blockingPointList.IndexOf(currentPoint);
                        value = GetTileCost(currentPoint);
    
                        blockingRemainList[index]++;
                        if (blockingRemainList[index] < value)
                        {
                            nextQueue.Enqueue(currentPoint);
                            continue;
                        }
                    }
    
                    //4 Direction
                    for (int j = 0; j < 4; j++)
                    {
                        nextPoint = currentPoint + tileOffset[j];
    
                        if (IsNextPointInRange(nextPoint))
                        {
                            if (!movePointRangeList.Contains(nextPoint))
                            {
                                value = GetTileCost(nextPoint);
    
                                movePointRangeList.Add(nextPoint);
                                nextQueue.Enqueue(nextPoint);
    
                                if (value > 1 && !blockingPointList.Contains(nextPoint))
                                {
                                    blockingPointList.Add(nextPoint);
                                    blockingRemainList.Add(0);
                                }
                            }
                        }
                    }
                }
            }
    
            CreateMovementRangeObj();
        }

     

    其他的辅助函数如下。

        private int GetTileCost(Vector3Int tilePos)
        {
            int value;
            if (tileMoveCostDictionary.TryGetValue(tilemap.GetTile(tilePos).name, out value))
            {
                return value;
            }
            else
            {
                print("Cannot Find Tile Cost");
                return -1;
            }
        }
    
        private bool IsNextPointInRange(Vector3Int nextPoint)
        {
            return nextPoint.x >= 0 && nextPoint.x < 16 && nextPoint.y >= 0 && nextPoint.y < 16;
        }
    
        private void CreateMovementRangeObj()
        {
            foreach (Vector3Int item in movePointRangeList)
            {
                GameObject obj = Instantiate(movePointPrefab, movePointObjParent);
                obj.transform.localPosition = gridLayout.CellToLocal(item);
            }
    
            movePointRangeList.Clear();
        }
    
        private void CleanMovementRangeObj()
        {
            if (movePointObjParent.childCount == 0)
                return;
    
            for (int i = 0; i < movePointObjParent.childCount; i++)
            {
                Destroy(movePointObjParent.GetChild(i).gameObject);
            }
    
            blockingPointList.Clear();
            blockingRemainList.Clear();
        }

     

    欢迎交流,转载注明出处:)

    转载于:https://www.cnblogs.com/JinT-Hwang/p/10043425.html

    展开全文
  • 有限元网格生成极大程度上影响着计算效率,其中四边形优于三角形
  • 整,可以在区域内生成结构化四边形网格。 第一章绪论 某汽车轮胎企业开发了一款轮胎产品设计和分析软件,需要对轮胎表面的纹 理进行网格生成。图l—l是轮胎表面的纹理形状。对于这类数值分析,结构化网 格是比较...
  • matlab实现封闭四边形网格的Catmull-Clark细分(CC细分)
  • 四边形网格在有限元分析中应用的非常广泛,它的每个面都是四边形,绝大多数顶点的度都是4,这样的顶点成为奇异点。 四边形网格任何不包括奇异点的单连通区域内都可以与平面直角坐标系的一部分建立同胚映射,使得...
  • (opencv)任意四边形网格划分

    千次阅读 2020-02-06 16:45:47
    算法功能:用于对任意四边形进行网格化处理 输入:四边形的四个角点(类型为cv::Point),网格行数,网格列数 输出:网格交叉点点集或网格中心点点集(类型为std::vector< cv::Point > ) 效果如下: vector ...
  • 六面体生成技术文献(从表面四边形网格生成空间六面体进行有限元分析的文献)
  • //计算网格线 fixed x1 = 1 - smoothstep(0,_GirdlLineWidth / _ScreenParams.x * 0.5, frac(uv.x * _GridCount)); fixed x2 = smoothstep(1 - _GirdlLineWidth / _ScreenParams.x * 0.5, 1,frac(uv.x ...
  • https://blog.csdn.net/Sun_tian/article/details/104197446 ...utm_source=distribute.pc_...
  • 1) 学位申请人王刘彭 导师姓名及职称黄云清教授 ...网格生成已经有非常成熟的理论以及算法,如二维约束Delaunay三角形网 格(Constained Delaunay Triangulation,CDT)生成,一些学者提出了多 种算法–两种边交换算法
  • hello,大家晚上好。今天是2020-12-11,马上就到了双十二了,又是一天剁手节。大家都买了什么好东西啊。...等我的货到了,我跟你们说我买了什么,哈哈。下面就说一下今天的内容吧。...大家如果做分析画网格...
  • 大家如果做分析画网格的时候,一般都是画出下面这种样子的: 这种网格也还可以的,好歹还是四边形的。但是对于三维的情况,三维的模型只能画四面体网格。按正常的画网格的方法是很难很难画成六面体网格的。不信大家...
  • 提出了一种自动的四边形网格生成法, 其实质是把被划分区域无限地分割, 直到整个区域全部由四边形单元组成。文中对关键技术最优分割线确定作了改进。实例表明该方法适用性强, 可以用于有限元网格的初始划分和 网格重...
  • 四边形和三角形布网格的各向异性应变极限
  • 四边形网格交互式编辑:实现四边形扫描转化算法,以此为基础,实现四边形网格中所有四边形的扫描转化、颜色添充;并可通过交互改变四边形顶点位置。
  • Maya: 菜单 网格 >四边形

    千次阅读 2014-06-30 10:15:21
    网格 >四边形化 可以将多边形物体的三边面转换为四边面。
  • 网格剖分算法,,自动生成三角网格及四边形网格。。有限
  • 网格工具

    2013-05-09 15:14:00
    如果是结构四边形网格,相对容易些,你可以先把区域剖分成直角的矩形网(前提是计算区域也相对规则 些),然后对内部节点做一定范围内的随机扰动,做小扰动 的目的是保持原来网格的拓扑结构不改变。这样得到的...
  • 网格的质量(网格数量、网格疏密程度、单元阶次、网格几何质量、网格布局 等[1])的影响。 结构化网格有许多优点:1.它可以保证边界附近的单元与边界对齐,适用 于流体力学和表面应力集中等对边界较为敏感的问题的...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 262
精华内容 104
关键字:

四边形网格