精华内容
下载资源
问答
  • Android 中自定义View 裁剪扇形图片 当需要裁剪图片扇形区域时,使用Canvas.clipPath(path)方法可以裁剪为扇形区域 ps:此方法会导致绘制图片边缘有锯齿,暂无解决方法(知道怎么解决可以告知我) ...

    Android 中自定义View 裁剪扇形图片

    当需要裁剪图片为扇形区域时,使用Canvas.clipPath(path)方法可以裁剪为扇形区域

    ps:此方法会导致绘制图片边缘有锯齿,暂无解决方法(知道怎么解决可以告知我)

    展开全文
  • [Unity]利用Mesh在Unity中绘制扇形图片

    千次阅读 2016-12-31 22:46:56
    背景最近碰到个功能, 要画一个扇形图案, 如下: 美术原: 需求是这个图形跟随角色, 在角色背后, 并且每个角色的扇形角度可能不同。 So, NGUI和UGUI很好用的FilledType是用不了了..解决过程去网上搜了下Unity...

    背景

    最近碰到个功能, 要画一个扇形图案, 如下图:
    角色背后的攻击范围标识
    美术原图:
    美术原图

    需求是这个图形跟随角色, 在角色背后, 并且每个角色的扇形角度可能不同。
    So, NGUI和UGUI很好用的FilledType是用不了了..

    解决过程

    去网上搜了下Unity绘制扇形
    找到这么篇文章http://blog.csdn.net/awnuxcvbn/article/details/44039819
    很好, 前人已经造好了轮子, 我拿来用就好
    结果:
    游戏场景
    Scene

    网格的扇形是有了, 但是游戏里的显示是什么鬼!所以说人是不能偷懒的, 还是老老实实的看看前人的轮子是怎么造的吧.

    我的理解与改造

    既然看了, 就为自己的需求做了些改造, 加了起始角度, 并把源代码画在x,z轴平面的扇形改到了x,y轴平面
    还是上代码:

    using UnityEngine;
    using System.Collections;
    
    [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
    public class SectorProgressBar : MonoBehaviour
    {
    
    
        public float radius = 2;
        public float startAngleDegree = 0;
        public float angleDegree = 100;
        public int segments = 10;
        public int angleDegreePrecision = 1000;
        public int radiusPrecision = 1000;
    
        private MeshFilter meshFilter;
    
        private SectorMeshCreator creator = new SectorMeshCreator();
    
        [ExecuteInEditMode]
        private void Awake()
        {
            meshFilter = GetComponent<MeshFilter>();
        }
    
        private void Update()
        {
            meshFilter.mesh = creator.CreateMesh(radius, startAngleDegree, angleDegree, segments, angleDegreePrecision, radiusPrecision);
        }
    
        //在Scene界面画辅助线
        void OnDrawGizmos()
        {
            Gizmos.color = Color.gray;
            DrawMesh();
        }
    
        //在Scene界面画辅助线
        void OnDrawGizmosSelected()
        {
            Gizmos.color = Color.green;
            DrawMesh();
        }
    
        private void DrawMesh()
        {
            Mesh mesh = creator.CreateMesh(radius, startAngleDegree, angleDegree, segments, angleDegreePrecision, radiusPrecision);
            int[] tris = mesh.triangles;
            for (int i = 0; i < tris.Length; i += 3)
            {
                Gizmos.DrawLine(convert2World(mesh.vertices[tris[i]]), convert2World(mesh.vertices[tris[i + 1]]));
                Gizmos.DrawLine(convert2World(mesh.vertices[tris[i]]), convert2World(mesh.vertices[tris[i + 2]]));
                Gizmos.DrawLine(convert2World(mesh.vertices[tris[i + 1]]), convert2World(mesh.vertices[tris[i + 2]]));
            }
        }
    
        private Vector3 convert2World(Vector3 src)
        {
            return transform.TransformPoint(src);
        }
    
        private class SectorMeshCreator
        {
            private float radius;
            private float startAngleDegree;
            private float angleDegree;
            private int segments;
    
            private Mesh cacheMesh;
    
            /// <summary>  
            /// 创建一个扇形Mesh  
            /// </summary>  
            /// <param name="radius">扇形半径</param>  
            /// <param name="startAngleDegree">扇形开始角度</param> 
            /// <param name="angleDegree">扇形角度</param>  
            /// <param name="segments">扇形弧线分段数</param>  
            /// <param name="angleDegreePrecision">扇形角度精度(在满足精度范围内,认为是同个角度)</param>  
            /// <param name="radiusPrecision">  
            /// <pre>  
            /// 扇形半价精度(在满足半价精度范围内,被认为是同个半价)。  
            /// 比如:半价精度为1000,则:1.001和1.002不被认为是同个半径。因为放大1000倍之后不相等。  
            /// 如果半价精度设置为100,则1.001和1.002可认为是相等的。  
            /// </pre>  
            /// </param>  
            /// <returns></returns>  
            public Mesh CreateMesh(float radius, float startAngleDegree, float angleDegree, int segments, int angleDegreePrecision, int radiusPrecision)
            {
                if (checkDiff(radius, startAngleDegree, angleDegree, segments, angleDegreePrecision, radiusPrecision))
                {//参数有改变才需要重新画mesh
                    Mesh newMesh = Create(radius, startAngleDegree, angleDegree, segments);
                    if (newMesh != null)
                    {
                        cacheMesh = newMesh;
                        this.radius = radius;
                        this.startAngleDegree = startAngleDegree;
                        this.angleDegree = angleDegree;
                        this.segments = segments;
                    }
                }
                return cacheMesh;
            }
    
            private Mesh Create(float radius, float startAngleDegree, float angleDegree, int segments)
            {
                if (segments == 0)
                {
                    segments = 1;
    #if UNITY_EDITOR
                    Debug.Log("segments must be larger than zero.");
    #endif
                }
    
                Mesh mesh = new Mesh();
                Vector3[] vertices = new Vector3[3 + segments - 1];
                vertices[0] = new Vector3(0, 0, 0);//第一个点是圆心点
    
                //uv是网格上的点对应到纹理上的某个位置的像素, 纹理是一张图片, 所以是二维
                //理解以后才发现, 之前显示出错的原因是原来的代码uv很随意的拿了顶点的计算结果
                Vector2[] uvs = new Vector2[vertices.Length];
                uvs[0] = new Vector2(0.5f, 0.5f);//纹理的圆心在中心
    
                float angle = Mathf.Deg2Rad * angleDegree;
                float startAngle = Mathf.Deg2Rad * startAngleDegree;
                float currAngle = angle + startAngle; //第一个三角形的起始角度
                float deltaAngle = angle / segments; //根据分段数算出每个三角形在圆心的角的角度
                for (int i = 1; i < vertices.Length; i++)
                {   
                    //圆上一点的公式: x = r*cos(angle), y = r*sin(angle)
                    //根据半径和角度算出弧度上的点的位置
                    float x = Mathf.Cos(currAngle);
                    float y = Mathf.Sin(currAngle);
                    //这里为了我的需求改到了把点算到了(x,y,0), 如果需要其他平面, 可以改成(x,0,y)或者(0,x,y)
                    vertices[i] = new Vector3(x  * radius, y * radius, 0);
                    //纹理的半径就是0.5, 圆心在0.5f, 0.5f的位置
                    uvs[i] = new Vector2(x * 0.5f + 0.5f, y * 0.5f + 0.5f);
                    currAngle -= deltaAngle;
                }
    
                int[] triangles = new int[segments * 3];
                for (int i = 0, vi = 1; i < triangles.Length; i += 3, vi++)
                {//每个三角形都是由圆心点+两个相邻弧度上的点构成的
                    triangles[i] = 0;
                    triangles[i + 1] = vi;
                    triangles[i + 2] = vi + 1;
                }
    
                mesh.vertices = vertices;
                mesh.triangles = triangles;
                mesh.uv = uvs;
    
                return mesh;
            }
    
            private bool checkDiff(float radius, float startAngleDegree, float angleDegree, int segments, int angleDegreePrecision, int radiusPrecision)
            {
                return segments != this.segments || (int)(startAngleDegree - this.startAngleDegree) != 0 || (int)((angleDegree - this.angleDegree) * angleDegreePrecision) != 0 ||
                       (int)((radius - this.radius) * radiusPrecision) != 0;
            }
        }
    }

    后记

    基本功能实现了~
    其实还有个问题, 半径(radius)比较大的情况, 会发现图片失真.
    这种图其实是可以做到不失真的, 因为, 内部是纯透明的, 只有外围一圈有颜色, 所以如果只缩放内部半段, 保持外部半段的半径, 就可以实现.
    示意图:
    这里写图片描述

    不过这次的需求并不需要放大图片, 以后需要的时候再实现吧~

    =========================
    这篇文章出来后,和同事讨论以后,对扇形绘制又做了优化:[Unity]利用Mesh在Unity中绘制扇形图片2

    展开全文
  • 扇形图

    2020-10-08 09:06:02
    首先我们要知道,图表该怎么做,下面我引用 echarts 来做一个扇形图表 首先,我们要引用 echarts,的 js. 然后 在事件中绑定所获取的 ID,为下面的图表展示做准备. 绑定一个点击事件,用来生产图表 前面是数据的获取...

    在正常的项目开发中,图表是必不可少的,基础图表是一些作为复杂图表的基础.
    首先我们要知道,图表该怎么做,下面我引用 echarts 来做一个扇形图表
    首先,我们要引用 echarts,的 js.

    在这里插入图片描述
    然后
    在这里插入图片描述
    在这里插入图片描述
    在事件中绑定所获取的 ID,为下面的图表展示做准备.
    在这里插入图片描述
    绑定一个点击事件,用来生产图表
    在这里插入图片描述
    前面是数据的获取和验证并且转到控制器中并查询
    后面的则是生产图表的一些参数
    在这里插入图片描述
    待到控制器查询的数据传递到页面中就可以了
    在这里插入图片描述
    完成了一个扇形图表了
    在这里插入图片描述

    展开全文
  • //uv是网格上的点对应到纹理上的某个位置的像素, 纹理是一张图片, 所以是二维 Vector2[] uvs = new Vector2[vertices.Length]; for (int i = 0; i ; ++i) { //之前是按半径为单位长度1计算的顶点, 实际顶点是要算上...

    直接上脚本,挂空物体上就行:

     

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;

    [RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
    public class TestProgressBar : MonoBehaviour
    {   
        public float radius = 2;
        [Range(0,360)]//把角度限制在0-360
        public float startAngleDegree = 0;
        [Range(0,360)]//把角度限制在0-360
        public float angleDegree = 100;
        public int angleDegreePrecision = 1000;
        public int radiusPrecision = 1000;
        //与之前的代码相比, 已经不需要分割的三角形数了

        private MeshFilter meshFilter;

        private SectorMeshCreator creator = new SectorMeshCreator();

        [ExecuteInEditMode]
        private void Awake()
        {
            meshFilter = GetComponent<MeshFilter>();
        }

        private void Update()
        {
            meshFilter.mesh = creator.CreateMesh(radius, startAngleDegree, angleDegree, angleDegreePrecision, radiusPrecision);
        }

        //在Scene界面画辅助线
        void OnDrawGizmos()
        {
            Gizmos.color = Color.gray;
            DrawMesh();
        }

        //在Scene界面画辅助线
        void OnDrawGizmosSelected()
        {
            Gizmos.color = Color.green;
            DrawMesh();
        }

        private void DrawMesh()
        {
            Mesh mesh = creator.CreateMesh(radius, startAngleDegree, angleDegree, angleDegreePrecision, radiusPrecision);
            int[] tris = mesh.triangles;
            for (int i = 0; i < tris.Length; i += 3)
            {
                Gizmos.DrawLine(convert2World(mesh.vertices[tris[i]]), convert2World(mesh.vertices[tris[i + 1]]));
                Gizmos.DrawLine(convert2World(mesh.vertices[tris[i]]), convert2World(mesh.vertices[tris[i + 2]]));
                Gizmos.DrawLine(convert2World(mesh.vertices[tris[i + 1]]), convert2World(mesh.vertices[tris[i + 2]]));
            }
        }

        private Vector3 convert2World(Vector3 src)
        {
            return transform.TransformPoint(src);
        }

        private class SectorMeshCreator
        {
            private float radius;
            private float startAngleDegree;
            private float angleDegree;

            private Mesh cacheMesh;

            /// <summary>  
            /// 创建一个扇形Mesh  
            /// </summary>  
            /// <param name="radius">扇形半径</param>  
            /// <param name="startAngleDegree">扇形开始角度</param> 
            /// <param name="angleDegree">扇形角度</param>  
            /// <param name="angleDegreePrecision">扇形角度精度(在满足精度范围内,认为是同个角度)</param>  
            /// <param name="radiusPrecision">  
            /// <pre>  
            /// 扇形半价精度(在满足半价精度范围内,被认为是同个半价)。  
            /// 比如:半价精度为1000,则:1.001和1.002不被认为是同个半径。因为放大1000倍之后不相等。  
            /// 如果半价精度设置为100,则1.001和1.002可认为是相等的。  
            /// </pre>  
            /// </param>  
            /// <returns></returns>  
            public Mesh CreateMesh(float radius, float startAngleDegree, float angleDegree, int angleDegreePrecision, int radiusPrecision)
            {
                if (checkDiff(radius, startAngleDegree, angleDegree, angleDegreePrecision, radiusPrecision))
                {//参数有改变才需要重新画mesh
                    Mesh newMesh = Create(radius, startAngleDegree, angleDegree);
                    if (newMesh != null)
                    {
                        cacheMesh = newMesh;
                        this.radius = radius;
                        this.startAngleDegree = startAngleDegree;
                        this.angleDegree = angleDegree;
                    }
                }
                return cacheMesh;
            }

            private Vector3 CalcPoint(float angle)
            {//这个函数计算了非特殊角度射线在正方形上的点
                angle = angle % 360;
                if (angle == 0) {
                    return new Vector3 (1, 0, 0);
                } else if (angle == 180) {
                    return new Vector3(-1,0,0);
                }
                //这里分别对应这个射线处于上图哪个三角形中, 分别计算
                if (angle <= 45 || angle > 315) {
                    return new Vector3(1,Mathf.Tan(Mathf.Deg2Rad*angle), 0);
                } else if (angle <= 135) {
                    return new Vector3(1/Mathf.Tan(Mathf.Deg2Rad*angle), 1, 0);
                } else if (angle <= 225) {
                    return new Vector3(-1, -Mathf.Tan(Mathf.Deg2Rad*angle), 0);
                } else {
                    return new Vector3(-1/Mathf.Tan(Mathf.Deg2Rad*angle), -1, 0);
                }
            }

            private Mesh Create(float radius, float startAngleDegree, float angleDegree)
            {
                if (startAngleDegree == 360) {
                    startAngleDegree = 0;
                }
                Mesh mesh = new Mesh();
                List<Vector3> calcVertices = new List<Vector3> ();
                calcVertices.Add (Vector3.zero);//第一个点是圆心点
                calcVertices.Add (CalcPoint (startAngleDegree));//第二个点是起始角度对应的点

                float [] specialAngle = new float[]{45, 135, 225, 315};//上图正方形4个顶点对应的角度和点
                Vector3 [] specialPoint = new Vector3[] {new Vector3(1,1,0), 
                    new Vector3(-1,1,0), 
                    new Vector3(-1,-1,0),
                    new Vector3(1,-1,0)};
                //计算正方形四个点是不是在要画的扇形范围内, 如果是, 则是要画出来的顶点
                for (int i = 0; i < specialAngle.Length; ++i) {
                    if(startAngleDegree < specialAngle[i] && specialAngle[i] - startAngleDegree < angleDegree)
                    {
                        calcVertices.Add(specialPoint[i]);
                    }
                }
                //这里为什么要第二个for循环? 扇形的角度+起始角度就可能超过360, 所以要计算到720
                for (int i = 0; i < specialAngle.Length; ++i) {
                    if(startAngleDegree < specialAngle[i]+360 && specialAngle[i]+360 - startAngleDegree < angleDegree)
                    {
                        calcVertices.Add(specialPoint[i]);
                    }
                }
                calcVertices.Add (CalcPoint (startAngleDegree + angleDegree));

                Vector3[] vertices = new Vector3[calcVertices.Count];

                //uv是网格上的点对应到纹理上的某个位置的像素, 纹理是一张图片, 所以是二维
                Vector2[] uvs = new Vector2[vertices.Length];

                for (int i = 0; i < vertices.Length; ++i) {
                    //之前是按半径为单位长度1计算的顶点, 实际顶点是要算上实际半径
                    vertices[i] = calcVertices[i]*radius;
                    //纹理的半径就是0.5, 圆心在0.5f, 0.5f的位置
                    uvs[i] = new Vector2(calcVertices[i].x*0.5f+0.5f,calcVertices[i].y*0.5f+0.5f);
                }

                int[] triangles = new int[(vertices.Length-2)*3];
                for (int i = 0, vi = 1; i < triangles.Length; i += 3, vi++)
                {//每个三角形都是由圆心点+两个相邻弧度上的点构成的
                    triangles[i] = 0;
                    triangles[i + 2] = vi;
                    triangles[i + 1] = vi + 1;
                }           
                mesh.vertices = vertices;
                mesh.triangles = triangles;
                mesh.uv = uvs;

                return mesh;
            }

            private bool checkDiff(float radius, float startAngleDegree, float angleDegree, int angleDegreePrecision, int radiusPrecision)
            {
                return (int)(startAngleDegree - this.startAngleDegree) != 0 || (int)((angleDegree - this.angleDegree) * angleDegreePrecision) != 0 ||
                    (int)((radius - this.radius) * radiusPrecision) != 0;
            }
        }
    }

    展开全文
  • 此函数生成扇形图扇形图旨在可视化围绕一系列点预测的不确定性。 该功能可以提供一系列的密度预测和历史数据。 中央银行(例如英格兰银行)使用扇形图来可视化其对价格通胀的预测。
  • [Unity]利用Mesh在Unity中绘制扇形图片2

    千次阅读 2017-01-08 22:50:37
    之前那篇文章后,和同事又就这个问题讨论了一下,发现,其实不需要那么死心眼画n个三角形,因为图片本身除了圆以外的地方都是透明的, 画出来也没事。 这样的话, 其实可以把正方形的图片分成4个三角形,这样的话,...
  • android 饼形图 扇形图统计 简单实现自定义viwe 动画绘制扇形图形 android 饼形图 扇形图统计 简单实现自定义viwe 动画绘制扇形图形
  • WPF画扇形图柱状图折线图源码
  • 彩色放射状PPT扇形图

    2021-07-16 17:51:21
    这是一张彩色放射状PPT扇形图,左侧带有数据分析文本说明。.PPTX格式;
  • 绘制直方图和扇形图

    2013-08-09 12:00:34
    直方图、扇形图、onpaint、MFC图形设计等
  • C#chart控件扇形图

    2021-06-17 23:56:17
    C#窗体chart控件扇形图当数据变大的时候,扇形图为什会变小?需要设置什么属性吗?chart扇形图的常用的属性是哪几个?
  • 这是一张彩色放射状PPT扇形图,左侧带有数据分析文本说明。.PPTX格式;
  • 自定义扇形图

    2018-10-24 17:00:31
    自定义扇形图 /** * 描述: * 绘制扇形图 * * @outhor zhengqian * @create 2018-10-09 16:37 */ public class PieView extends View { private Paint mPaint;//画笔 private ArrayList&amp;lt;FanBean&...
  • echarts扇形图

    千次阅读 2018-08-22 17:25:04
    echarts扇形图 根据男女比例制作一个扇形图 这里初步学习echarts,看了很久的api,把主要代码放在下面。 &lt;script type="text/javascript"&gt; // 路径配置 require.config({ paths: { ...
  • DEV版本 12.1。根据预先设定的数据动态展示柱状图和扇形图,柱状图有个特殊的地方就是每条柱子上面显示两段,例如:一个工单不同工序的良品和不良品数量,希望对大家有帮助
  • 功能说明: 柱状图 扇形图 技术要点 自绘组件
  • View绘制扇形图

    2019-05-23 11:14:57
    我们在做类似报表类的app需求的时候,有时候我们需要绘制扇形图来直观的表达各个数据。因为通过Android原生的控件我们是无法直接使用然后绘出一个扇形图的,但是通过继承View我们却可以做到。 下面一步一步介绍如何...
  • Echarts实现扇形图

    2019-12-17 09:50:41
    链接:Echarts实现扇形图
  • 主要介绍了IOS 开发中画扇形图实例详解的相关资料,需要的朋友可以参考下
  • jqChart扇形图下载

    2014-10-17 11:25:36
    jqChart扇形图下载,直接打开htm(html)文件就可看到效果
  • 扇形图幻灯片素材下载,关键词:扇形图、PPT图表素材,PPTX格式;
  • Wyn Enterprise-扩展扇形图
  • Matplotlib之扇形图绘制

    2020-08-27 12:24:10
    1 扇形图介绍 扇形图用整个圆表示总数,用圆内各个扇形的大小表示各部分数量占总数的百分数。 2 扇形图绘制 扇形图通过pie()函数绘制 plt.pie(x, explode=None, labels=None) x 扇形数据 explode 设置某几个分块...
  • 本篇文章介绍了C# 绘制统计图大全,其中包括状图, 折线图, 扇形图,有需要的同学可以了解一下。
  • java后端扇形图实现

    2019-11-22 13:34:13
    最近在项目中,需要后端提供扇形图的接口,因为业务比较复杂,有的数据不只是在一张表,需要我们自己组装后返给前端,其实扇形图的接口就是一个map集合的数据。 接口返回数据 接口返回参数Map<String,Object>,而...
  • 扇形图色问题

    2018-03-14 15:04:00
    解法转自扇形图色问题 题目描述 将一个圆形等分成N个小扇形,将这些扇形标记为1,2,3,…,N。现在使用M种颜色对每个扇形进行涂色,每个扇形涂一种颜色,且相邻的扇形颜色不同。 求:有多少种涂色方法。 分析 ...
  • 导出扇形图的代码

    2013-01-25 13:56:23
    该代码可以将所需要的资源导成扇形图,毕竟可以保存到指定的路径!
  • java编译扇形图与柱状图(代码放在Servlet)
  • MFC直方图 通过数据输入用扇形图和直方图根据比例表示

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,251
精华内容 7,700
关键字:

扇形图