通过两点构建圆弧

由于在计算中缺少了一个点,来构建唯一的三角形,用以确定内切圆,故默认过这两个点的内切圆点切线相互垂直

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

public class Test : MaskableGraphic
{
    [SerializeField]
    private Vector3 start, end;

    [SerializeField]
    private float size,angle;
    
    [SerializeField]
    private int count;

    [SerializeField]
    private Color32 color1,color2,color3;

    [SerializeField]
    private Vector3 n1,n2,target;

    protected override void OnPopulateMesh(VertexHelper vh)
    {
        vh.Clear();

        //  计算两点连线的中点
        Vector3 line = end - start;

        Vector3 midPoint = start + line.normalized * line.magnitude / 2;

        //  计算两点连线的法线垂直于外
        Vector3 midPointNormal = Vector3.Cross(Vector3.forward, line).normalized;

        //  构建等腰直角三角形,确定内接圆切线方向 上方定点
        Vector3 topPoint = midPoint + midPointNormal * line.magnitude / 2;

        //  圆心
        Vector3 center = midPoint - midPointNormal * line.magnitude / 2;

        Vector3 lastStart = start ;
        //  角度
        float degree = 90.0f / count;
        for(int i = 1; i <= count;++i)
        {
            Vector3 end = Quaternion.AngleAxis(-degree * i, Vector3.forward) * (start - center) + center;
            DrawLine(vh, lastStart, end, 2, color1);
            lastStart = end;
        }
        //  绘制两条线
        DrawLine(vh, start, topPoint, 1, color2);
        DrawLine(vh, topPoint, end, 1, color2);
        //  两条半径
        DrawLine(vh, start, center, 1, color3);
        DrawLine(vh, center, end, 1, color3);
        //ChartDrawer.DrawLine(vh, mid + (n1 + n2).normalized * 20, end, 2, color2);
    }


    private void DrawLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size, Color32 color)
    {
        UIVertex[] vertex = new UIVertex[4];
        if (p1 == p2) return;
        Vector3 v = Vector3.Cross(p2 - p1, Vector3.forward).normalized * size;
        vertex[0].position = p1 - v;
        vertex[1].position = p2 - v;
        vertex[2].position = p2 + v;
        vertex[3].position = p1 + v;

        for (int j = 0; j < 4; j++)
        {
            vertex[j].color = color;
            vertex[j].uv0 = Vector2.zero;
        }
        vh.AddUIVertexQuad(vertex);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 题1 过定点的直线与圆相交于两点(相切则重合),根据割线定理、相交弦定理与切割线定理,的乘积是定值,称这个定值为点...
    备考999天阅读 12,685评论 0 1
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 11,312评论 0 4
  • 公元:2019年11月28日19时42分农历:二零一九年 十一月 初三日 戌时干支:己亥乙亥己巳甲戌当月节气:立冬...
    石放阅读 11,823评论 0 2

友情链接更多精彩内容