精华内容
下载资源
问答
  • 我们要做的就是CPU中将图片的矩形顶点数据修改成圆角矩形的顶点信息,之后Unity会将修改后的顶点数据发到GPU,并设置对应的shader,GPU就会根据我们发送的顶点数据将图片渲染成我们所要的圆角矩形图片。...

    1.一张图片是如何显示在屏幕上的

    一张图片渲染到unity界面中的大致流程。

    1362861-20180823000054062-1420498570.png

    2.我们要做什么

    我们要做的就是在CPU中将图片的矩形顶点数据修改成圆角矩形的顶点信息,之后Unity会将修改后的顶点数据发到GPU中,并设置对应的shader,GPU就会根据我们发送的顶点数据将图片渲染成我们所要的圆角矩形图片。

    3.怎么做

    由于Unity已经帮我们做了将数据发送到GPU的工作,我们只需要在代码中去修改要传送顶点数据就可以了。
    Unity的Image组件提供了OnPopulateMesh接口。这个接口就是用来更新渲染时用的renderer mesh的顶点信息的的。我们直接重写这个函数,来修改顶点数据。

    <1>我们先来看一下一张Simple类型的图片的顶点信息是如何组织的。

    /// <summary>
    /// Update the UI renderer mesh.
    /// </summary>
    protected override void OnPopulateMesh(VertexHelper toFill)
    {   
        if (activeSprite == null)
        {
            base.OnPopulateMesh(toFill);
            return;
        }
    
        switch (type)
        {
            case Type.Simple:
                GenerateSimpleSprite(toFill, m_PreserveAspect);
                break;
            case Type.Sliced:
                GenerateSlicedSprite(toFill);
                break;
            case Type.Tiled:
                GenerateTiledSprite(toFill);
                break;
            case Type.Filled:
                GenerateFilledSprite(toFill, m_PreserveAspect);
                break;
        }
    }
    /// <summary>
    /// Generate vertices for a simple Image.
    /// </summary>
    void GenerateSimpleSprite(VertexHelper vh, bool lPreserveAspect)
    {
        Vector4 v = GetDrawingDimensions(lPreserveAspect);
        var uv = (activeSprite != null) ? Sprites.DataUtility.GetOuterUV(activeSprite) : Vector4.zero;
    
        var color32 = color;
        vh.Clear();
        vh.AddVert(new Vector3(v.x, v.y), color32, new Vector2(uv.x, uv.y));
        vh.AddVert(new Vector3(v.x, v.w), color32, new Vector2(uv.x, uv.w));
        vh.AddVert(new Vector3(v.z, v.w), color32, new Vector2(uv.z, uv.w));
        vh.AddVert(new Vector3(v.z, v.y), color32, new Vector2(uv.z, uv.y));
    
        vh.AddTriangle(0, 1, 2);
        vh.AddTriangle(2, 3, 0);
    }

    v是顶点坐标信息,uv是贴图坐标信息,vh是用来存储这些信息的变变量。
    每个点的位置信息(相对中轴线的位置),默认颜色,uv坐标组成了一个顶点信息放到了vh中,然后再告诉vh如何去画三角行,就可以了。
    之后unity会将vh中的信息传到GPU,然后将图片展示在屏幕上。

    1362861-20180823000106332-1045716590.png

    <2>我们如何将一张图片的顶点信息和三角形信息改成我们要的圆角矩形

    首先,我们将一张图分成6个三角形和四个90°的扇形。每个扇形用若干个三角形来模拟。这样我们就将一个圆角矩形,划分成了GPU能认识的三角形了。
    我们以扇形的半径,构成扇形的三角形的数量作为变量,就可以算出每个我们需要的顶点的坐标了。具体的实现见代码。

    1362861-20180823000113642-1224140314.png
    1362861-20180823000120089-60237297.png

    实现代码:

    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    using UnityEngine.Sprites;
    using System.Collections.Generic;
    
    namespace GFramework
    {
        public class SimpleRoundedImage : Image
        {
    
            //每个角最大的三角形数,一般5-8个就有不错的圆角效果,设置Max防止不必要的性能浪费
            const int MaxTriangleNum = 20;
            const int MinTriangleNum = 1;
    
            public float Radius;
            //使用几个三角形去填充每个角的四分之一圆
            [Range(MinTriangleNum, MaxTriangleNum)]
            public int TriangleNum;
    
            protected override void OnPopulateMesh(VertexHelper vh)
            {
                Vector4 v = GetDrawingDimensions(false);
                Vector4 uv = overrideSprite != null ? DataUtility.GetOuterUV(overrideSprite) : Vector4.zero;
    
                var color32 = color;
                vh.Clear();
                //对radius的值做限制,必须在0-较小的边的1/2的范围内
                float radius = Radius;
                if (radius > (v.z - v.x) / 2) radius = (v.z - v.x) / 2;
                if (radius > (v.w - v.y) / 2) radius = (v.w - v.y) / 2;
                if (radius < 0) radius = 0;
                //计算出uv中对应的半径值坐标轴的半径
                float uvRadiusX = radius / (v.z - v.x);
                float uvRadiusY = radius / (v.w - v.y);
    
                //0,1
                vh.AddVert(new Vector3(v.x, v.w - radius), color32, new Vector2(uv.x, uv.w - uvRadiusY));
                vh.AddVert(new Vector3(v.x, v.y + radius), color32, new Vector2(uv.x, uv.y + uvRadiusY));
    
                //2,3,4,5
                vh.AddVert(new Vector3(v.x + radius, v.w), color32, new Vector2(uv.x + uvRadiusX, uv.w));
                vh.AddVert(new Vector3(v.x + radius, v.w - radius), color32, new Vector2(uv.x + uvRadiusX, uv.w - uvRadiusY));
                vh.AddVert(new Vector3(v.x + radius, v.y + radius), color32, new Vector2(uv.x + uvRadiusX, uv.y + uvRadiusY));
                vh.AddVert(new Vector3(v.x + radius, v.y), color32, new Vector2(uv.x + uvRadiusX, uv.y));
    
                //6,7,8,9
                vh.AddVert(new Vector3(v.z - radius, v.w), color32, new Vector2(uv.z - uvRadiusX, uv.w));
                vh.AddVert(new Vector3(v.z - radius, v.w - radius), color32, new Vector2(uv.z - uvRadiusX, uv.w - uvRadiusY));
                vh.AddVert(new Vector3(v.z - radius, v.y + radius), color32, new Vector2(uv.z - uvRadiusX, uv.y + uvRadiusY));
                vh.AddVert(new Vector3(v.z - radius, v.y), color32, new Vector2(uv.z - uvRadiusX, uv.y));
    
                //10,11
                vh.AddVert(new Vector3(v.z, v.w - radius), color32, new Vector2(uv.z, uv.w - uvRadiusY));
                vh.AddVert(new Vector3(v.z, v.y + radius), color32, new Vector2(uv.z, uv.y + uvRadiusY));
    
                //左边的矩形
                vh.AddTriangle(1, 0, 3);
                vh.AddTriangle(1, 3, 4);
                //中间的矩形
                vh.AddTriangle(5, 2, 6);
                vh.AddTriangle(5, 6, 9);
                //右边的矩形
                vh.AddTriangle(8, 7, 10);
                vh.AddTriangle(8, 10, 11);
    
                //开始构造四个角
                List<Vector2> vCenterList = new List<Vector2>();
                List<Vector2> uvCenterList = new List<Vector2>();
                List<int> vCenterVertList = new List<int>();
    
                //右上角的圆心
                vCenterList.Add(new Vector2(v.z - radius, v.w - radius));
                uvCenterList.Add(new Vector2(uv.z - uvRadiusX, uv.w - uvRadiusY));
                vCenterVertList.Add(7);
    
                //左上角的圆心
                vCenterList.Add(new Vector2(v.x + radius, v.w - radius));
                uvCenterList.Add(new Vector2(uv.x + uvRadiusX, uv.w - uvRadiusY));
                vCenterVertList.Add(3);
    
                //左下角的圆心
                vCenterList.Add(new Vector2(v.x + radius, v.y + radius));
                uvCenterList.Add(new Vector2(uv.x + uvRadiusX, uv.y + uvRadiusY));
                vCenterVertList.Add(4);
    
                //右下角的圆心
                vCenterList.Add(new Vector2(v.z - radius, v.y + radius));
                uvCenterList.Add(new Vector2(uv.z - uvRadiusX, uv.y + uvRadiusY));
                vCenterVertList.Add(8);
    
                //每个三角形的顶角
                float degreeDelta = (float)(Mathf.PI / 2 / TriangleNum);
                //当前的角度
                float curDegree = 0;
    
                for (int i = 0; i < vCenterVertList.Count; i++)
                {
                    int preVertNum = vh.currentVertCount;
                    for (int j = 0; j <= TriangleNum; j++)
                    {
                        float cosA = Mathf.Cos(curDegree);
                        float sinA = Mathf.Sin(curDegree);
                        Vector3 vPosition = new Vector3(vCenterList[i].x + cosA * radius, vCenterList[i].y + sinA * radius);
                        Vector3 uvPosition = new Vector2(uvCenterList[i].x + cosA * uvRadiusX, uvCenterList[i].y + sinA * uvRadiusY);
                        vh.AddVert(vPosition, color32, uvPosition);
                        curDegree += degreeDelta;
                    }
                    curDegree -= degreeDelta;
                    for (int j = 0; j <= TriangleNum - 1; j++)
                    {
                        vh.AddTriangle(vCenterVertList[i], preVertNum + j + 1, preVertNum + j);
                    }
                }
            }
    
            private Vector4 GetDrawingDimensions(bool shouldPreserveAspect)
            {
                var padding = overrideSprite == null ? Vector4.zero : DataUtility.GetPadding(overrideSprite);
                Rect r = GetPixelAdjustedRect();
                var size = overrideSprite == null ? new Vector2(r.width, r.height) : new Vector2(overrideSprite.rect.width, overrideSprite.rect.height);
                //Debug.Log(string.Format("r:{2}, size:{0}, padding:{1}", size, padding, r));
    
                int spriteW = Mathf.RoundToInt(size.x);
                int spriteH = Mathf.RoundToInt(size.y);
    
                if (shouldPreserveAspect && size.sqrMagnitude > 0.0f)
                {
                    var spriteRatio = size.x / size.y;
                    var rectRatio = r.width / r.height;
    
                    if (spriteRatio > rectRatio)
                    {
                        var oldHeight = r.height;
                        r.height = r.width * (1.0f / spriteRatio);
                        r.y += (oldHeight - r.height) * rectTransform.pivot.y;
                    }
                    else
                    {
                        var oldWidth = r.width;
                        r.width = r.height * spriteRatio;
                        r.x += (oldWidth - r.width) * rectTransform.pivot.x;
                    }
                }
    
                var v = new Vector4(
                        padding.x / spriteW,
                        padding.y / spriteH,
                        (spriteW - padding.z) / spriteW,
                        (spriteH - padding.w) / spriteH);
    
                v = new Vector4(
                        r.x + r.width * v.x,
                        r.y + r.height * v.y,
                        r.x + r.width * v.z,
                        r.y + r.height * v.w
                        );
    
                return v;
            }
        }
    }
    

    Editor代码:

    using System.Linq;
    using UnityEngine;
    using UnityEditor.AnimatedValues;
    using UnityEngine.UI;
    using UnityEditor;
    using UnityEditor.UI;
    
    namespace GFramework
    {
        [CustomEditor(typeof(SimpleRoundedImage), true)]
        //[CanEditMultipleObjects]
        public class SimpleRoundedImageEditor : ImageEditor
        {
    
            SerializedProperty m_Radius;
            SerializedProperty m_TriangleNum;
            SerializedProperty m_Sprite;
    
    
            protected override void OnEnable()
            {
                base.OnEnable();
    
                m_Sprite = serializedObject.FindProperty("m_Sprite");
                m_Radius = serializedObject.FindProperty("Radius");
                m_TriangleNum = serializedObject.FindProperty("TriangleNum");
    
            }
            public override void OnInspectorGUI()
            {
                serializedObject.Update();
    
                SpriteGUI();
                AppearanceControlsGUI();
                RaycastControlsGUI();
                bool showNativeSize = m_Sprite.objectReferenceValue != null;
                m_ShowNativeSize.target = showNativeSize;
                NativeSizeButtonGUI();
                EditorGUILayout.PropertyField(m_Radius);
                EditorGUILayout.PropertyField(m_TriangleNum);
                this.serializedObject.ApplyModifiedProperties();
            }
        }
    }
    

    需要注意的点:

    ①UV坐标是[0-1]的,不随image的宽和高变换的,所以在做uv映射的时候要将uv坐标做等比例的处理,不然会出现断层的情况。
    ②在计算顶点信息的时候,要注意Pivot对顶点坐标的影响(直接照搬Image的处理就可以了)
    ③注意没有贴图的时候的处理,要让这张图片显示默认颜色。

    Vector4 uv = overrideSprite != null ? DataUtility.GetOuterUV(overrideSprite) : Vector4.zero;

    ④因为直接继承Image类的类在Inspector面板上不会显示新定义的public变量,所以我们还要写一个SimpleRoundedImageEditor.cs来将新定义的圆角矩形半径和构成一个90°扇形的三角型的展示在面板上,顺便隐藏一下图片的类型,因为只实现了simple类型图片的圆角矩形。

    4.效果

    1362861-20180823000227286-613004611.png
    1362861-20180823000232526-1452135320.png
    1362861-20180823000237842-1819230525.png

    5.关于效率


    Mask SimpleRoundedImage
    DrawCall 3 1
    顶点数 4 30个左右(一般每个扇形由6个三角型组成就可以达到较好的效果),顶点数量可以接受。

    总结:如果在相同mask且之间没有相互遮挡的情况下,unity会对drawCall进行动态批处理,所以Mask数量的增加对drawCall的影响很小,只有在有多个不同mask或mask相互遮挡的情况下,每个mask会额外增加2次DrawCall。对DrawCall数量有较大的影响,但这种情况较少。
    所以SimpleRoundedImage在大多数情况下对效率的提升并不明显。但通过修改顶点的方式实现圆角的方式会比使用遮罩实现圆角更加灵活方便。

    代码链接:https://github.com/blueberryzzz/UIAndShader/tree/master/UIAndShader/Assets/SimpleRoundedImage

    转载于:https://www.cnblogs.com/blueberryzzz/p/9521233.html

    展开全文
  • 图形是产品设计被讨论得最多的元素之一。...其中争议最大,且被更多互联网设计师使用的图形,是圆角矩形。而当中的讨论点是:同样的图形,圆角处理与直角处理所传递的信息有什么不同?为什么...

    https://www.uisdc.com/rounded-rectangle-to-design-trends

    图形是产品设计中被讨论得最多的元素之一。视觉设计师使用不同形状的图形来表达事物的多样性;交互设计师选择不同形状的图形,解决用户在某场景下的诉求问题。其中争议最大,且被更多互联网设计师使用的图形,是圆角矩形。而当中的讨论点是:同样的图形,圆角处理与直角处理所传递的信息有什么不同?为什么圆角成了趋势?

    许多人认为图形外框的多样化趋势是由 CSS 技术的革新开始,但正确的时间点,应该是在 iPhone 4 被发布的那一刻。

    当中的差异是:前者是通过技术参数来改变形状内容以引起用户注意;后者是通过传播真实产品塑造用户对于图形外观的全新认知。认知的转变,需作用于习惯与行为,而当中的核心手段,就是设计。(参考滴滴类产品改变人的出行方式)

    用户对于一款产品的认知,主要依据产品所能解决的实际问题以及外在形式。而设计师需要关注的点会更多,包括产品架构,流程,技术等内容。同时还需要站在用户视角观测产品是否易于使用,我们通常将其称为「用户心理模型」。类比于用户只需了解手表是否正常走动,能否准点报时,设计师则需要理解手表设计框架,结构形式等详细内容。其中最重要的,还是一名设计师对内容的全局认知。

    回到图形外观的话题上,同样的道理,人们对于产品设计中的图形使用已经逐渐理想化,好比图形外观的形式如何已经不重要,重要的是图形所传递的信息本身。这样的认知稍显片面,对于设计师而言,图形以圆角形式呈现的背后逻辑,比表面上它所表达的信息更为重要。理解这一点之后,设计师再使用圆角矩形传递信息,理解上会更显深刻。

    所以我后面会围绕下面这几个问题,来说明圆角矩形的意义:

    • 为什么 iPhone 4 的发布是圆角矩形成为设计趋势的转折点?
    • 圆角矩形传递的信息有什么不同之处?
    • 头像与按钮为什么越来越多地使用圆角?

    圆角矩形为何成为趋势

    虽然在 iPhone 4 发布时,大多数的软件图标都还是拟物风,但它们的图形外框大多是以圆角矩形的方式来处理。在 iOS 系统里,这种圆角矩形的载体已经成了其系统统一承载内容的形式。

    也许有人会问为什么 Apple 选择了这样的呈现方式,而不跟 Android 一样,为了体现内容的丰富性,让图标外框多样化呢?原因有两个。

    其一是乔布斯认为所有物件都有圆角,而相比圆形与椭圆,圆角矩形反而是生活中更为常见的现象。

    Andy Hertzfeld 在 Round Rects Are Everywhere 中讲了关于圆角矩形诞生的故事。

    Apple 的天才程序员 Bill Atkinson 创立了一种能够快速绘制圆形与椭圆的方法,乔布斯认为圆形与椭圆都不错,但是圆角矩形会更好。而 Bill Atkinson 并不这么认为,他觉得圆角矩形更难绘制,且人们也不需要圆角矩形。于是,乔布斯回应道:「到处都是带有圆角的矩形!」他指着房间里的各种物件,几乎所有地方都可以看到圆角矩形。他甚至说服 Bill 和他一起绕着街区走一圈,指出他能找到的每个带有圆角的矩形。当他们看到带有圆角的禁止停车的标示时,Bill 终于被乔布斯说服,第二天就拿出了绘制圆角矩形的方案。

    之后,他们将其命名为「RoundRects」。在接下来的几个月里,Roundrects 逐渐进入用户界面的各个部分,并很快变得不可或缺。

    尤其是在 13 年,iOS 7 对圆角的更新。它已经与我们平时认为的圆角矩形不同,这个圆角的优化过程非常复杂,当中涉及的数学算法如果不是专业的研究学者,可能无法理解其差异。

    简单来说,Apple 采用的圆角曲率所生成的图形,是更圆滑,无明显切角的。这样的圆角矩形在过渡上更平滑,且在视觉上的体验也更融洽。

    其二是,为了打造沉浸式体验,乔布斯认为应该让 iPhone 的各个元素形式统一化。

    与上述圆角图标相似的是 iPhone 机身。

    iPhone 机身所呈现的圆角在制作工艺上,比软件图标的圆角更为复杂。而其内外一致的表现形式就是为了打造沉浸式体验,形成产品的品牌认知。而 iPhone X 的面世,就是为了将这一概念彻底落实。

    前面提到,用户与设计师对于一款产品的认知是不同的。用户认识一款产品,首先关注的是外观表现,其次才是被承载的内容。所以当用户对 iPhone 以及其软件图标的展示形式已经形成认知,那么 iPhone X 的全面屏也就是很自然的一种结果。

    机身形态与软件形式的自然结合,能够让用户更好的接受产品的外在形式,且其全面屏的设计也能更好地被用户认可。甚至被很多人吐槽的 iPhone X 齐刘海也是依据这样的圆角形式来设计的,目的就是为了营造统一的产品形态。

    以至于其他一些产品在机身上的模仿,导致让人误以为类似的工业特性所产生的第一直觉都是「这是一款 iPhone」,仔细一看才知道,噢,原来是……

    当一款真实的产品被人所接受,以普遍使用在生活场景中,其中逐渐营造出用户对圆角矩形的惯性认知,以至于它的可接受度也逐渐提高。

    这也是我在开篇提到说「iPhone 4 的发布奠定了圆角矩形成为设计流行趋势的基调」的原因。

    到这为止还只是背景,下面我们再深入聊聊特性。

    圆角矩形所传递的信息特性

    上节讲述了圆角矩形兴起的背景,当然这只是一部分,圆角矩形成为流行趋势,不能说完全是因为 Apple。还有一点是,它自身本就具备的优势。

    上面提到乔布斯说服比尔,要有圆角矩形,因为生活中到处都是圆角矩形。但是这里有一个问题没有解决,即「为什么生活中到处都是圆角矩形」呢?

    玩 3D 工具的人应该知道,在 C4D 等软件里,想要对一件物体创建圆角通常是选择「倒角」,再控制「段数」,之后通过「平滑」选项,将角度变得更为圆滑(当然还有其它方式)。目的是在渲染的时候不至于让物体看起来太尖锐,色泽也更通透。

    在生活中,物件棱角如果过于锋利,则显得不够安全。工业角度,圆角/倒角可以让物件更好组装。相比棱角过于尖锐以至于让人觉得冰冷,圆角的设计反而让人更能感受到温度。所以对于推崇自然至上的乔布斯,在选择元素时,也会希望能贴近生活。

    从视觉,触感,便捷等因素能了解到真实物件的圆角优势,但优势是否适用于图形元素呢?

    这里有个相通点,即虚拟图形依附于视觉而存在。人眼在接收图形信息时,对圆角矩形的认知会优于直角矩形。因为人眼结构中辨识力最强的部位,会优先识别图形的视觉中心。而圆角与直角矩形的区别就在于内容速度的识别差异。

    之所以存在这样的差异,主要是因为图形存在视觉引导的作用。圆角因为其平滑的四边,将用户的视线过渡到图形中心,而直角矩形因为尖锐的特性,导致人眼在图形识别上容易发散。因此,在图形元素的选择上,为了让用户聚焦,圆角则获得了设计师的青睐。

    所以之后在其它设计系统与设备上,更多圆角类图形也被投入使用。尤其是在各类 App 与网页设计中,圆角矩形更是被广泛应用于头像、按钮等元素上。

    头像与按钮的圆角含义

    随着互联网产品的普及,人们对于产品界面的审美意识与体验意识逐渐提高,界面的视觉呈现也成了互联网公司所重视的对象。头像作为产品界面中用于身份信息识别的主要元素,一直是用户以及设计师最为关注的内容之一。

    因此,对头像外框形状的选择尤其谨慎。当中最为常见的主要有两类:圆形、圆角矩形。所以在进行选择时,设计师除了针对于两类图形依附于界面本身的视觉效果外,还需整体考量图形与界面元素的融合程度进行综合分析。至于直角矩形,目前很少会见到其用于头像的设计上。

    以圆形的表现形式而言,其周围没有任何节点与棱角,给人以灵动、均衡、平滑、优美的感受,通常会在带有设计感或内容元素较为丰富的产品上出现,如 ins、微博、知乎等。相比圆形而言,棱角尖锐的直角矩形给以人沉着、冷静、拘谨、冰冷的感受,所以很少产品会将其作为展示型头像开放给用户使用。而圆角矩形正好中和了这两者的气质,也成了很多产品选其作为头像的原因。通常这类头像会出现在设计较为简约的界面上,如微信首页的用户头像。

    无论是圆形头像,还是圆角矩形头像,其最终目的无非是身份识别以及彰显个性。上节聊过,圆角在识别上会引导用户倾向于图形的视觉中心,而头像作为辨识身份的信息,并不需要仔细审视,只需要快速识别即可。所以只有在点击用户头像时,才会以矩形形式完整呈现。

    这里有一个点是,当圆角矩形以头像形式出现在界面中时,通常是以小图的方式呈现。因此,当小图集中于元素复杂的界面中时,圆角矩形牺牲了构图结构,省略了四边内容背景反而成为了优势,信息与细节明显少于直角矩形,以至于在界面上帮助用户更快识别头像内容,判断图形有用信息。

    所以在头像的形状选择上,圆角矩形的优势会明显高于其他图形。而圆形与圆角矩形的差异就是上述提到的,要根据界面元素的丰富性、设计感等因素进行抉择。

    但是这里还有个思考点,就留个各位自己思考了。如果仔细观察各类产品,去寻找圆形头像与圆角矩形头像的区别,那么在头像尺寸上,也可以看到一些秘密。

    原本我还想再以按钮为例解读圆角直角的差异,不过仔细回顾内容之后自认为已经非常详细,相信各位自己也能去做好分析,所以就不增长篇幅了。有兴趣的同学,可以自己做一波分析。

    小结

    简单总结一下上面的内容:

    • 第一节讲解了圆角矩形在设计上成为流行趋势的背景;
    • 第二节告诉各位圆角矩形在信息传递上的优势;
    • 第三节以头像为例将前面的知识点落地分析。

    圆角本身只是一个很小的元素,就像其他设计理论、方法一样,我们可以忽视它背后的理论,但作为设计师,对于这些细节的追求应该是持续且专注的。

    展开全文
  • cocos2dx 画圆角矩形 lua版@TOC 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 ...

    cocos2dx 画圆角矩形 lua版@TOC

    欢迎使用Markdown编辑器

    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。
    /*

    • @brief 画圆角矩形

    • @param origin 矩形开始点

    • @param destination 矩形结束点

    • @param radius 圆角半径

    • @param segments 圆角等份数,等份越多,圆角越平滑

    • @param bFill 是否填充

    • @param color 填充颜色

    • @attention
      */
      void DrawPrimitivesTest::ccDrawRoundRect( Point origin, Point destination, float radius, unsigned int segments, bool bFill, Color4F color)
      {
      //算出1/4圆

      const float coef = 0.5f * (float)M_PI / segments;
      Point * vertices = new Point[segments + 1];
      Point * thisVertices = vertices;
      for(unsigned int i = 0; i <= segments; ++i, ++thisVertices)
      {
      float rads = (segments - i)*coef;
      thisVertices->x = (int)(radius * sinf(rads));
      thisVertices->y = (int)(radius * cosf(rads));
      }
      //
      Point tagCenter;
      float minX = MIN(origin.x, destination.x);
      float maxX = MAX(origin.x, destination.x);
      float minY = MIN(origin.y, destination.y);
      float maxY = MAX(origin.y, destination.y);

      unsigned int dwPolygonPtMax = (segments + 1) * 4;
      Point * pPolygonPtArr = new Point[dwPolygonPtMax];
      Point * thisPolygonPt = pPolygonPtArr;
      int aa = 0;
      //左上角
      tagCenter.x = minX + radius;
      tagCenter.y = maxY - radius;
      thisVertices = vertices;
      for(unsigned int i = 0; i <= segments; ++i, ++thisPolygonPt, ++thisVertices)
      {
      thisPolygonPt->x = tagCenter.x - thisVertices->x;
      thisPolygonPt->y = tagCenter.y + thisVertices->y;
      ++aa;
      }
      //右上角
      tagCenter.x = maxX - radius;
      tagCenter.y = maxY - radius;
      thisVertices = vertices + segments;
      for(unsigned int i = 0; i <= segments; ++i, ++thisPolygonPt, --thisVertices)
      {
      thisPolygonPt->x = tagCenter.x + thisVertices->x;
      thisPolygonPt->y = tagCenter.y + thisVertices->y;
      ++aa;
      }
      //右下角
      tagCenter.x = maxX - radius;
      tagCenter.y = minY + radius;
      thisVertices = vertices;
      for(unsigned int i = 0; i <= segments; ++i, ++thisPolygonPt, ++thisVertices)
      {
      thisPolygonPt->x = tagCenter.x + thisVertices->x;
      thisPolygonPt->y = tagCenter.y - thisVertices->y;
      ++aa;
      }
      //左下角
      tagCenter.x = minX + radius;
      tagCenter.y = minY + radius;
      thisVertices = vertices + segments;
      for(unsigned int i = 0; i <= segments; ++i, ++thisPolygonPt, --thisVertices)
      {
      thisPolygonPt->x = tagCenter.x - thisVertices->x;
      thisPolygonPt->y = tagCenter.y - thisVertices->y;
      ++aa;
      }

      if(bFill){
      DrawPrimitives::drawSolidPoly(pPolygonPtArr, dwPolygonPtMax, color);
      }else
      {
      DrawPrimitives::setDrawColor4F(color.r, color.g, color.b, color.a);
      DrawPrimitives::drawPoly(pPolygonPtArr, dwPolygonPtMax, true);
      }

      CC_SAFE_DELETE_ARRAY(vertices);
      CC_SAFE_DELETE_ARRAY(pPolygonPtArr);
      }

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    居中的图片: Alt

    居中并且带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block
    var foo = 'bar';
    

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目 Value
    电脑 $1600
    手机 $12
    导管 $1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列 第二列 第三列
    第一列文本居中 第二列文本居右 第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPE ASCII HTML
    Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
    Quotes "Isn't this fun?" “Isn’t this fun?”
    Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to-HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

    Γ(z)=0tz1etdt&ThinSpace;. \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    Mon 06Mon 13Mon 20已完成 进行中 计划一 计划二 现有任务Adding GANTT diagram functionality to mermaid
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    Created with Raphaël 2.2.0开始我的操作确认?结束yesno
    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • 流程图的各个框框代表什么意思1、圆角矩形表示:“开始”与“结束”;2、矩形表示:行动方案、普通工作环节用;3、菱形表示:问题判断或判定(审核/审批/评审)环节;4、用平行四边形表示:输入输出;5、箭头代表:...

    广告位API接口通信错误,查看德得广告获取帮助

    请问在电脑WORD中怎样画流程图?

    1、电脑打开Word文档,然后点击工具栏中的插入。

    7ae153d76f2dc7408ddcc526b21e16a4.png

    流程图的各个框框代表什么意思

    1、圆角矩形表示:“开始”与“结束”;

    2、矩形表示:行动方案、普通工作环节用;

    3、菱形表示:问题判断或判定(审核/审批/评审)环节;

    4、用平行四边形表示:输入输出;

    5、箭头代表:工作流方向。

    一、图示说明

    流程图(FlowChart)是描述进行某一项活动所遵循顺序的一种图示方法。它虽然并不统计学的范畴,但在很多质量专家仍把它纳入统计技术的范围之内,因为在质量管理的过程中,流程图是我们经常使用的一个工具。

    一个好的流程图可以直观地描述整个活动中所有过程的物流、信息流,让人很容易知悉整个过程。质量管理过程中常用的流程图有产品生产流程图、产品检验流程图、服务流程图等。在这里大家可以简单了解一个它的使用方法,以便让日后所做的流程图更为专业化、标准化。

    二、符号

    开始与结束标志,是个椭圆形符号。用来表示一个过程的开始或结束。“开始”或“结束”写在符号内。活动标志,是个矩形符号。用来表示在过程的一个单独的步骤。活动的简要说明写在矩形内。判定标志,是个菱形符号。

    用来表示过程中的一项判定或一个分岔点,判定或分岔的说明写在菱形内,常以问题的形式出现。对该问题的回答决定了判定符号之外引出的路线,每条路线标上相应的回答。流线标志。用来表示步骤在顺序中的进展。流线的箭头表示一个过程的流程方向。

    文件标志。用来表示属于该过程的书面信息。文件的题目或说明写在符号内。

    连接标志,是个圆圈符号。用来表示流程图的待续。圈内有一个字母或数字。在相互联系的流程图内,连接符号使用同样的字母或数字,以表示各个过程是如何连接的。

    04e98b1b11cee44e677cac1630242f38.png

    扩展资料:

    功能

    以特定的图形符号加上说明,表示算法的图,称为流程图或框图。

    流程图是流经一个系统的信息流、观点流或部件流的图形代表。在企业中,流程图主要用来说明某一过程。这种过程既可以是生产线上的工艺流程,也可以是完成一项任务必需的管理过程。

    例如,一张流程图能够成为解释某个零件的制造工序,甚至组织决策制定程序的方式之一。这些过程的各个阶段均用图形块表示,不同图形块之间以箭头相连,代表它们在系统内的流动方向。下一步何去何从,要取决于上一步的结果,典型做法是用“是”或“否”的逻辑分支加以判断。

    流程图是揭示和掌握封闭系统运动状况的有效方式。作为诊断工具,它能够辅助决策制定,让管理者清楚地知道,问题可能出在什么地方,从而确定出可供选择的行动方案。

    流程图有时也称作输入-输出图。该图直观地描述一个工作过程的具体步骤。流程图对准确了解事情是如何进行的,以及决定应如何改进过程极有帮助。这一方法可以用于整个企业,以便直观地跟踪和图解企业的运作方式。

    流程图使用一些标准符号代表某些类型的动作,如决策用菱形框表示,具体活动用方框表示。但比这些符号规定更重要的,是必须清楚地描述工作过程的顺序。流程图也可用于设计改进工作过程,具体做法是先画出事情应该怎么做,再将其与实际情况进行比较。

    参考资料:

    百度百科——流程图符号

    怎样在word中画流程图

    方法/步骤

    1,新建一个word 文档,通过“视图”-“工具栏”-“绘图”,显示“绘图工具栏”;

    47adf4c65433b68153b303fbf203fc0e.png

    怎么在word中绘制流程图

    第1步,打开Word文档窗口,切换到“功能区”。在“插图”分组中单击“形状”按钮,并在打开的菜单中选择“新建绘图画布”命令。 选择“新建绘图画布”命令

    小提示:也可以不使用画布,而只直接在Word文档页面中直接插入形状。

    第2步,选中绘图画布,在“插入”功能区的“插图”分组中单击“形状”按钮,并在“流程图”类型中选择插入合适的流程图。例如选择“流程图:过程”和“流程图:决策”,选择插入流程图形状

    第3步,在Word“插入”功能区的“插图”分组中单击“形状”按钮,并在“线条”类型中选择合适的连接符,例如选择“箭头”和“肘形箭头连接符”,选择连接符

    第4步,将鼠标指针指向第一个流程图图形(不必选中),则该图形四周将出现4个蓝色的连接点。鼠标指针指向其中一个连接点,然后按下鼠标左键拖动至第二个流程图图形,则第二个流程图图形也将出现蓝色的连接点。定位到其中一个连接点并释放左键,则完成两个流程图图形的连接

    第5步,重复步骤3和步骤4连接其他流程图图形,成功连接的连接符两端将显示红色的圆点,

    第6步,根据实际需要在流程图图形中添加文字,完成流程图的制作。

    word里面怎么画流程图

    方法/步骤

    1

    新建一个word 文档,通过“视图”-“工具栏”-“绘图”,显示“绘图工具栏”,

    2

    单击“绘图”工具栏上的“自选图形”,然后选择“流程图”,这里就可以看到众多制作流程图时所用到的形状了,大家可以选择自己喜欢的的形状;

    3

    单击要绘制流程图的位置,此时会出现个虚框;

    在绘图画布上插入你选择的图形,然后插入;

    我们再重复上述步骤,插入多种不同的图形,(如下图,我已经插入了很多种不同的图形);

    接下来,我们要建立各种图形之间的连接了。这里我们使用Word提供的一个非常好用的自选图形——连接符来建立连接。  连接符的选择见下图;

    选择连接符自选图形后,将鼠标指针移动到对象上时,会在其上显示蓝色连接符位置,这些点表示可以附加连接符线的位置;

    我们首先用带箭头的肘形线连接符和直线连接符将图形连接到一起,

    绘制折线箭头;

    接下来,我们需要在图形中添加文字。用鼠标右键单击形状,单击“添加文字”并开始键入。

    我们随便录入文字;

    制作好后,我按住左键不放,框选所有图形,点击右键,组合;

    一个简单的流程图就设计好了,大家可以按照自己的工作需要进行更复杂的设计。

    怎样在Word中画流程图?

    1. 视图(V)→工具栏(T) ,选中"绘图"。

    Word 左下方将出现绘图工具栏,如下所示:

    2. 单击绘图工具栏上的"自选图形(U)"→"流程图(F)" ,选择所需形状。

    3. 选择矩形(流程图:过程) ,在光标处将出现绘图画布:

    在画布上方左键单击,即可将刚才选择的"矩形(流程图:过程) " ,放置于画

    布中,用鼠标调整其为合适大小。

    4. 将其他形状放置于画布中,调整位置和大小得:

    5. 在矩形或菱形上方右键单击→添加文字(X)

    输入文字后得到下图:

    6. 单击绘图工具栏上的"自选图形(U)"→"连接符(N)" ,选择所需连接符。

    选择连接符后,将鼠标移动到对象上方时,会在其上显示蓝色连接符位置,

    这些点表示可以附加连接符线的位置

    连接得到下图:

    7. 插入(I)→文本框(X)→横排(H) ,在文本框中输入"信号采集"。

    8. 双击文本框,弹出对话框,设置如下:以及

    调整文本框大小即有

    9. 余可类推(或按住Ctrl 键拖动"信号采集"文本框复制到新位置,然后更改文本框中文字),最终得到流程图如下:

    怎样在 microsoft word中画流程图

    方法/步骤

    1

    新建一个word 文档,通过“视图”-“工具栏”-“绘图”,如下图1,显示“绘图工具栏”,

    2

    单击“绘图”工具栏上的“自选图形”,然后选择“流程图”,这里就可以看到众多制作流程图时所用到的形状了,大家可以选择自己喜欢的的形状;

    3

    单击要绘制流程图的位置,此时会出现个虚框;

    在绘图画布上插入你选择的图形,然后插入;

    我们再重复上述步骤,插入多种不同的图形,(如下图,我已经插入了很多种不同的图形);

    接下来,我们要建立各种图形之间的连接了。这里我们使用Word提供的一个非常好用的自选图形——连接符来建立连接。 连接符的选择见下图;

    选择连接符自选图形后,将鼠标指针移动到对象上时,会在其上显示蓝色连接符位置,这些点表示可以附加连接符线的位置;

    我们首先用带箭头的肘形线连接符和直线连接符将图形连接到一起,

    绘制折线箭头;

    接下来,我们需要在图形中添加文字。用鼠标右键单击形状,单击“添加文字”并开始键入。

    我们随便录入文字;

    制作好后,我按住左键不放,框选所有图形,点击右键,组合;

    一个简单的流程图就设计好了,大家可以按照自己的工作需要进行更复杂的设计。

    如何在WORD里面画流程图?

    画流程图,其实可以用图形组合,方便简捷。

    在“绘图”工具栏上单击“自选图形/基本形状”,可以选择“矩形”或者“圆角矩形”绘制矩形图形制作文本;用“绘图”工具栏上的“箭头”或者“自选图形/箭头总汇”选择箭头。

    然后排列好图形,并且全部选中右击,执行“组合/组合”命令即可。

    也可以“插入/图片/组织结构图”进行编辑。利用“组织结构”工具栏上的相关命令进行样式调整。

    怎样用word画流程图

    打开word,选项功能卡切换到插入——》SmartArt,如图。

    打开SmartArt图形对话框之后,选择流程,然后,选择你需要的相应的流程图基本模型,如图。

    选择之后,点击,就会在word中出现国你刚选择的流程图的基本模型,如图。

    接下来,在左边的文字处,输入相应的流程节点名称。

    输入完成之后,我们就来设计一下,首先是添加颜色,如图,选择行程图,点击设计下方的更改颜色,如图。

    然后选择你喜欢的颜色。

    更改颜色之后,还可以设计它在其它形状效果。

    另外,如果,你觉得如图所示的5个流程还不够的话,可以点击第上个流程文字在方,回车,

    回车之后,就可以增加一个流程,如图,如此类推,我们还可以增加更多的流程。

    如果你想更其它的形状,如图 ,可以选择流程图,选择上方自己想要更换的形状,如图,各种不同形状供你选择。

    9

    更多的形状供你选择示例。

    在WORD里怎么画流程图?

    方法很多,你可以用文本框或者艺术字都可以解决这个问题.建议使用文本框.具体方法是:插入--文本框--输入文字(工序)--然后用视图--工具--绘图里的箭头,这样一步一步就可以完成了.

    (责任编辑:admin)

    展开全文
  • 今天要做一个带尖角的圆角矩形菜单,大概长下面这个样子: 要求顶上的尖角要对准菜单锚点,菜单项按压反色,菜单背景色和按压色可配置。 最简单的做法就是让UX给个三角形的图片往上一贴,但是转念一想这样是不是太...
  • 流程图

    千次阅读 2018-09-12 17:59:11
    流程图一般是由圆角矩形表示开始与结束,用矩形表示行动方案,普通工作环节使用,菱形表示问题判断或判定环节,平行四边形表示输入输出,箭头表示工作流方向。 三、流程图基本结构 1.顺序结构:只要按照...
  • 前面了解了程序和算法的...通过本课的学习,你将了解到如何用流程图来描述算法前面课程描述算法的步骤,我们使用文字语言来描述算法。描述算法的目的有三个:一是梳理算法的过程和步骤,做到心中有数;二是作为...
  • 流程图怎么画

    万次阅读 多人点赞 2017-12-20 21:14:49
    流程图一般都是用圆角矩形表示“开始”与“结束”,用矩形表示行动方案、普通工作环节,菱形表示判断,平行四边形表示输入输出,箭头表示工作流方向。   例子1   比如说我们要定义两...
  • 1.css3实现圆角矩形,兼容性有问题<divid="round"></div> #round{ padding:10px;width:300px;height:50px; border:5pxsolid#dedede; -moz-border-radius:15px;/*Geckobrowser...
  • 本发明涉及图片处理的技术领域,具体涉及一种将矩形图片处理成圆角图片的方法。背景技术:现有的手机界面大多都是图片显示,一般的图片为矩形图片,图片的矩形直角边框看起来非常生硬,对用户来说具有很差的视觉体验...
  • 流程图其实是表格里面的一种表现方式,是由... 作用:程序流程图中做执行框  2.圆角矩形或者是扁圆。 作用:表示程序的开始或者结束,程序流程图中用作为起始框或者结束框。  3. 菱形 作用:表示决策或判...
  • 作用:一般用作要执行的处理(process),程序流程图中做执行框。Axure中如果是画页面框架图,那么也可以指代一个页面。你可把页面和执行命令放在同一个流程中做说明,这个时候将两类不同的矩形做色彩区别,然后...
  • 数据流程图 状态图 流程图

    万次阅读 多人点赞 2018-04-23 14:43:38
    数据流程图(DFD)提供了通过系统的数据流的图形表示。它逻辑上显示了我们的系统进程和外部接口或数据存储交换了哪些信息,但是它没有明确显示信息交换的时间或顺序。 数据流程图是结构化系统分析和设计方法(SSADM...
  • 流程图常见的四大元素: 圆角矩形、矩形、菱形和箭头。 圆角矩形: 开始和结束 矩形: 执行过程 菱形: 判断 箭头: 指示下一步 流程图: 就是描述一个流程,跟这个流程相关的从开始到结束的所有步骤。 我要描述的...
  • 流程图总结

    2019-08-30 21:30:02
    圆角矩形表示“开始”与“结束”。 矩形表示行动方案、普通工作环节用 菱形表示问题判断或判定(审核/审批/评审)环节 用平行四边形表示输入输出  箭头代表工作流方向 实例1、学生登录界面流程图 学生添加...
  • markdown 中流程图详解

    万次阅读 多人点赞 2018-12-13 17:34:29
    目录Mermaid 流程图示例结构显示方向节点连线Flowchart流程图示例结构节点语法节点定义节点连接连接样式关键字    markdown有不同的插件实现,对应的语法也不太一样,对于插件就是把引用的语法对应成响应的标签,...
  • 流程图图形标准含义

    千次阅读 2019-07-20 11:03:00
    作用:一般用作要执行的处理(process),程序流程图中做执行框。Axure中如果是画页面框架图,那么也可以指代一个页面。你可把页面和执行命令放在同一个流程中做说明,这个时候将两类不同的矩形做色彩区别,然后...
  • 如何Markdown流程图

    千次阅读 2019-06-28 13:59:24
    目录 如何Markdown流程图 如何Markdown流程图 如何Markdown流程图呢?当然是用mermaid了,mermaid支持三种图形的绘制, 分别是流程图, 时序图和甘特图, 本篇文章只介绍了mermaid中流程图在markdown...
  • 流程图里的形状符号的代表意义

    千次阅读 2018-12-13 13:17:24
    作用:一般用作要执行的处理(process),程序流程图中做执行框。axure中如果是画页面框架图,那么也可以指代一个页面。有时候我们会把页面和执行命令放在同一个流程中做说明,这个时候将两类不同的矩形做色彩...
  • 打开axure工具,元件库选择【Flow】,表示切换到流程图的元件库。2.圆角矩形代表开始流程,从元件库拖入一个圆角矩形,双击编辑文字。3.菱形代表判断的条件,从元件库拖入一个菱形,双击编辑文字。4.最后...
  • 流程图是一种表示算法的图,简称流程图或是框图,平时我们会以特定图形...圆角矩形一般表示开始或是结束; 矩形用于行动方案,普通环节可用; 菱形一般是表示问题的判断,也就是我们所说的审批或审核环节; 平行四边...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,126
精华内容 1,650
关键字:

圆角矩形在流程图中表示