亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

UGUI繪制多點連續的平滑曲線

2019-10-29 19:41:04
字體:
來源:轉載
供稿:網友

本文實例為大家分享了UGUI繪制平滑曲線的具體代碼,供大家參考,具體內容如下

繪制

實現自定義的MaskableGraphic掛載在UGUI的UI節點上

public class UGUIObjectRender : MaskableGraphic{  /**  * points 為需要穿過的點  * segments 為曲線細分度  * linewidth 為曲線粗細  */  protected override void OnPopulateMesh(VertexHelper vh)  {    vh.DrawBeziers(points,segments,linewidth);  }}

需要時用的工具類在后面

二次貝塞爾工具類

using UnityEngine;namespace ViVi.UIExtensions{/** * Created by vivi on 16/5/11. */  public class BezierUtils {    public float P0x;    public float P1x;    public float P2x;    public float P3x;    public float P0y;    public float P1y;    public float P2y;    public float P3y;    public BezierUtils(float p0x,float p0y,float p1x,float p1y,float p2x,float p2y,float p3x,float p3y) {      P0x = p0x;      P0y = p0y;      P1x = p1x;      P1y = p1y;      P2x = p2x;      P2y = p2y;      P3x = p3x;      P3y = p3y;    }    public BezierUtils(Vector2 p0,Vector2 p1,Vector2 p2,Vector2 p3) {      P0x = p0.x;      P0y = p0.y;      P1x = p1.x;      P1y = p1.y;      P2x = p2.x;      P2y = p2.y;      P3x = p3.x;      P3y = p3.y;    }    public float beze_x(float t){      float it = 1-t;      return it*it*it*P0x + 3*it*it*t*P1x + 3*it*t*t*P2x + t*t*t*P3x;    }    public float beze_y(float t){      float it = 1-t;      return it*it*it*P0y + 3*it*it*t*P1y + 3*it*t*t*P2y + t*t*t*P3y;    }    //-------------------------------------------------------------------------------------    public float beze_speed_x(float t)    {      float it = 1-t;      return -3*P0x*it*it + 3*P1x*it*it - 6*P1x*it*t + 6*P2x*it*t - 3*P2x*t*t + 3*P3x*t*t;    }    public float beze_speed_y(float t)    {      float it = 1-t;      return -3*P0y*it*it + 3*P1y*it*it - 6*P1y*it*t + 6*P2y*it*t - 3*P2y*t*t + 3*P3y*t*t;    }    private float beze_speed(float t)    {      float sx = beze_speed_x(t);      float sy = beze_speed_y(t);      return (float) Mathf.Sqrt(Mathf.Pow(sx,2)+Mathf.Pow(sy,2));    }    //-------------------------------------------------------------------------------------    private float beze_length(float t)    {      float LATESTCOUNT = 10000;      int steps = (int) Mathf.Ceil(LATESTCOUNT * t);      if (steps == 0)        return 0;      if (steps % 2 != 0)        steps++;      float halfSteps = steps * .5f;      float nSum = 0;      float n1Sum = 0;      float disStep = t / steps;      for (int i = 0; i < halfSteps; i++ ) {        n1Sum += beze_speed((2 * i + 1) * disStep);        nSum += beze_speed(2 * i * disStep);      }      return (beze_speed(0) + beze_speed(1) + 2 * n1Sum + 4 * nSum) * disStep / 3;    }    //-------------------------------------------------------------------------------------    private float beze_even(float t)    {      float len = t * beze_length(1);      float uc = 0;      do {        float ulen = beze_length(t);        float uspeed = beze_speed(t);        uc = t - (ulen - len) / uspeed;        if (Mathf.Abs(uc - t) < 0.0001)          break;        t = uc;      }while(true);      return uc;    }    private float totallength = -1;    public float getTotalLength(){      if(totallength<0)        totallength = beze_length(1);      return totallength;    }    public Vector2 getPosition(float t){      return new Vector2(beze_x(t),beze_y(t));    }  }}

UGUI 繪圖工具類

using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;namespace ViVi.UIExtensions{  public static class PolygonHelper  {    public static void AddUIVertexTriangles(this VertexHelper vh,UIVertex[] verts)    {      for (int i = 0; i < verts.Length; i += 3)      {        int currentVertCount = vh.currentVertCount;        for (int index = i; index < i+3; index++)        {          vh.AddVert(verts[index].position, verts[index].color, verts[index].uv0, verts[index].uv1, verts[index].normal, verts[index].tangent);        }        vh.AddTriangle(currentVertCount, currentVertCount + 1, currentVertCount + 2);      }    }    public static void AddUIVertexTriangle(this VertexHelper vh,UIVertex[] verts)    {      int currentVertCount = vh.currentVertCount;      for (int index = 0; index < 3; ++index)        vh.AddVert(verts[index].position, verts[index].color, verts[index].uv0, verts[index].uv1, verts[index].normal, verts[index].tangent);      vh.AddTriangle(currentVertCount, currentVertCount + 1, currentVertCount + 2);    }    private static void vertex(this List<UIVertex> vertices,float x, float y , Color color)    {      UIVertex v = UIVertex.simpleVert;      v.color = color;      v.position = new Vector2(x,y);      v.uv0 = Vector2.zero;    }    //畫圓形    public static void circle (this VertexHelper vh, Vector2 pos, float radius,Color color,bool filled = false) {      circle(vh,pos.x, pos.y, radius, Mathf.Max(1, (int)(6 * Mathf.Pow(radius,1/3f))),color,filled);    }    public static void circle (this VertexHelper vh, float x, float y, float radius,Color color,bool filled = false) {      circle(vh,x, y, radius, Mathf.Max(1, (int)(6 * Mathf.Pow(radius,1/3f))),color,filled);    }    public static void circle (this VertexHelper vh, float x, float y, float radius, int segments ,Color color,bool filled = false) {      if (segments > 0){        float angle = 2 * Mathf.PI / segments;        float cos = Mathf.Cos(angle);        float sin = Mathf.Sin(angle);        float cx = radius, cy = 0;        List<UIVertex> vs = new List<UIVertex>();        segments--;        for (int i = 0; i < segments; i++) {          vs.vertex(x, y, color);          vs.vertex(x + cx, y + cy, color);          float temp = cx;          cx = cos * cx - sin * cy;          cy = sin * temp + cos * cy;          vs.vertex(x + cx, y + cy, color);        }        vs.vertex(x, y, color);        vs.vertex(x + cx, y + cy, color);        cx = radius;        cy = 0;        vs.vertex(x + cx, y + cy, color);        vh.AddUIVertexTriangles(vs.ToArray());      }    }    public static void DrawBeziers(this VertexHelper vh,List<Vector2> points,float segment,float width)    {      List<BezierUtils> beziers = CreateBeziers(points);      if (beziers != null) {         for (int i = 0; i < beziers.Count; i++) {          BezierUtils bezier = beziers[i];          DrawBezier(vh ,bezier,segment,width);        }      }    }    public static Vector2 nor (this Vector2 vec) {      float len = vec.magnitude;      if (len != 0) {        vec.x /= len;        vec.y /= len;      }      return vec;    }    public static Vector2 rotate90 (this Vector2 vec, int dir) {      float x = vec.x;      if (dir >= 0) {        vec.x = -vec.y;        vec.y = x;      } else {        vec.x = vec.y;        vec.y = -x;      }      return vec;    }    public static Vector2 cpy (this Vector2 vec) {      return new Vector2(vec.x,vec.y);    }    private static void DrawBezier(VertexHelper vh,BezierUtils bezier,float segment,float width)    {      List<Vector2> lpos = new List<Vector2>();      List<Vector2> rpos = new List<Vector2>();      for (int i = 0; i <= segment; i++)      {        Vector2 bezierPos = new Vector2(bezier.beze_x((float)i/(float)segment),bezier.beze_y((float)i/(float)segment));        Vector2 bezierSpeed = new Vector2(bezier.beze_speed_x((float)i/(float)segment),bezier.beze_speed_y((float)i/(float)segment));        Vector2 offseta = bezierSpeed.normalized.rotate90(1) * (0.5f * width);        Vector2 offsetb = bezierSpeed.normalized.rotate90(-1) * (0.5f * width);        lpos.Add(bezierPos.cpy() + offseta);         rpos.Add(bezierPos.cpy() + offsetb);       }      for (int j = 0; j < segment; j++)      {        vh.AddUIVertexQuad(GetQuad(lpos[j], lpos[j+1], rpos[j+1], rpos[j]));      }    }    private static UIVertex[] GetQuad (params Vector2[] vertPos) {      UIVertex[] vs = new UIVertex[4];      Vector2[] uv = new Vector2[4];      uv[0] = new Vector2(0, 0);      uv[1] = new Vector2(0, 1);      uv[2] = new Vector2(1, 0);      uv[3] = new Vector2(1, 1);      for (int i = 0; i < 4; i++) {        UIVertex v = UIVertex.simpleVert;        v.color = Color.blue;        v.position = vertPos[i];        v.uv0 = uv[i];        vs[i] = v;      }      return vs;    }    private static List<BezierUtils> CreateBeziers(List<Vector2> points)    {      float scale = 0.6f;      List<BezierUtils> beziers = new List<BezierUtils>();      int originCount = points.Count - 1;      List<Vector2> midpoints = new List<Vector2>();      for (int i = 0; i < originCount; i++) {        midpoints.Add(new Vector2(          Mathf.Lerp(points[i].x,points[i+1].x,0.5f),          Mathf.Lerp(points[i].y,points[i+1].y,0.5f))        );      }      List<Vector2> ctrlPoints = new List<Vector2>();      float offsetx;      float offsety;      ctrlPoints.Add(new Vector2(        points[0].x,        points[0].y      ));      for (int i = 0; i < originCount - 1; i++) {        Vector2 orginPoint = points[i + 1];        offsetx = orginPoint.x - Mathf.Lerp(midpoints[i].x, midpoints[i + 1].x, 0.5f);        offsety = orginPoint.y - Mathf.Lerp(midpoints[i].y, midpoints[i + 1].y, 0.5f);        ctrlPoints.Add(new Vector2(          midpoints[i].x + offsetx,          midpoints[i].y + offsety        ));        ctrlPoints.Add(new Vector2(          midpoints[i+1].x + offsetx,          midpoints[i+1].y + offsety        ));        ctrlPoints[i * 2 + 1] = Vector2.Lerp(orginPoint, ctrlPoints[i * 2 + 1], scale);        ctrlPoints[i * 2 + 2] = Vector2.Lerp(orginPoint, ctrlPoints[i * 2 + 2], scale);       }      ctrlPoints.Add(new Vector2(        points[points.Count - 1].x,        points[points.Count - 1].y      ));      for (int i = 0; i < originCount; i++) {        BezierUtils bezier = getBezier(points[i], ctrlPoints[i * 2], ctrlPoints[i * 2 + 1],points[i + 1]);        beziers.Add(bezier);      }      return beziers;    }    public static BezierUtils getBezier(Vector2 p0,Vector2 p1 ,Vector2 p2,Vector2 p3){      return new BezierUtils( p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y);    }  }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一福利网站| 亚洲视频在线视频| 亚洲一区二区久久久久久久| 亚洲新声在线观看| 亚洲成年人在线| 日韩av最新在线观看| 91av在线不卡| 亚洲国产成人久久综合| 亚洲国产精品成人av| 国产视频精品一区二区三区| 一本一道久久a久久精品逆3p| 久久久久久久久久国产精品| 国产日韩欧美综合| 久久精品99久久香蕉国产色戒| 九九久久精品一区| 少妇高潮久久77777| 国模吧一区二区| 日韩av综合网| 日韩精品在线视频美女| 精品女同一区二区三区在线播放| 亚洲一区二区久久久久久久| 狠狠综合久久av一区二区小说| 亚洲美女动态图120秒| 一本一本久久a久久精品综合小说| 亚洲精品国产精品国产自| 91在线看www| 欧美电影在线观看| 91老司机在线| 亚洲成人免费网站| 日韩av综合中文字幕| 欧美一级视频在线观看| 亚洲欧洲偷拍精品| 91久久久久久久久| 日韩av男人的天堂| 97高清免费视频| 亚洲福利影片在线| 国产午夜精品免费一区二区三区| 日韩欧美在线观看| 精品久久久久久久久中文字幕| 国产精品三级久久久久久电影| 中文字幕久久精品| 国产乱肥老妇国产一区二| 在线成人免费网站| 欧美激情精品久久久久久蜜臀| 久久香蕉精品香蕉| 久久精品国产亚洲精品2020| 91在线视频成人| 亚洲社区在线观看| 国内自拍欧美激情| 国产suv精品一区二区三区88区| 欧美精品videofree1080p| 国产不卡精品视男人的天堂| 久久人人爽国产| 亚洲精品美女久久| 中文字幕视频一区二区在线有码| 国产一区二区美女视频| 美女性感视频久久久| 亚洲性av在线| 久久在线免费视频| 97视频国产在线| 欧美日韩在线免费观看| 亚洲成人精品在线| 青青久久av北条麻妃海外网| 91久久久久久久久久久| 久久成人免费视频| 欧美日韩性视频在线| 97视频网站入口| 中文字幕精品影院| 在线精品高清中文字幕| 国产不卡av在线| 不卡在线观看电视剧完整版| 一区二区三区在线播放欧美| 国产91精品最新在线播放| 精品久久久久国产| 日本欧美一二三区| 国产精品视频久| 一本色道久久88亚洲综合88| 亚洲视频免费一区| 欧美一级片在线播放| 亚洲精品美女久久| 国产精品欧美亚洲777777| 国产精品旅馆在线| 欧美华人在线视频| 国产午夜精品理论片a级探花| 91在线播放国产| 国产精品三级久久久久久电影| 亚洲欧美福利视频| 欧美另类69精品久久久久9999| 国产一区二区三区在线视频| 欧美中文字幕在线视频| 成人午夜在线观看| 国产精品观看在线亚洲人成网| 亚洲在线免费观看| 精品久久久久久中文字幕一区奶水| 国产精品99久久久久久白浆小说| 国产精品中文字幕久久久| 国产91在线播放| 日本精品久久电影| 欧美电影免费看| 91日韩在线视频| 欧美日韩亚洲视频一区| 亚洲午夜精品久久久久久性色| 国产人妖伪娘一区91| 久久99精品久久久久久琪琪| 国产精品v片在线观看不卡| 久久精品国产亚洲| 欧美成人黑人xx视频免费观看| 亚洲美女av电影| 国产一级揄自揄精品视频| 欧美大秀在线观看| 在线播放国产精品| 久久人人97超碰精品888| 久久亚洲精品一区| 91中文字幕在线| 欧美电影在线观看高清| 国产精品成av人在线视午夜片| 亚洲www在线| 中文字幕日韩在线视频| 欧美精品18videos性欧美| 91精品国产91久久久久久| 第一福利永久视频精品| 欧美日韩美女视频| 日韩激情av在线播放| 亚洲精品98久久久久久中文字幕| 日韩亚洲成人av在线| 日本乱人伦a精品| 欧美在线视频免费| 国产精品吊钟奶在线| 国产女同一区二区| 国产91精品高潮白浆喷水| 久久av红桃一区二区小说| 亚洲色图av在线| 亚洲va国产va天堂va久久| 亚洲美女免费精品视频在线观看| 亚洲精品美女网站| zzijzzij亚洲日本成熟少妇| 国产精品福利无圣光在线一区| 日韩在线观看免费高清完整版| 日韩精品视频在线| 欧美风情在线观看| 国产精品欧美激情| 亚洲精品中文字幕有码专区| 久久久国产精品x99av| 亚洲日本成人网| 欧美精品在线免费观看| 亚洲视频在线观看视频| 欧美激情18p| 奇米成人av国产一区二区三区| 色婷婷**av毛片一区| 日韩精品免费看| 久久久久国色av免费观看性色| 欧美激情第99页| 久久综合伊人77777尤物| 精品国产一区二区在线| 亚洲另类欧美自拍| 国产精品久久久久久影视| 亚洲视频在线观看网站| 亚洲第一视频网站| 国产精品午夜国产小视频| 亚洲自拍小视频免费观看| 亚洲精品视频在线播放| 亚洲国产精品久久精品怡红院| 久久成人在线视频| 欧美日韩精品在线观看|