예제 #1
0
    /// <summary>
    /// 図の更新
    /// </summary>
    private void UpdateDiagram(List <Vector2> sites)
    {
        //ボロノイ図の作成
        areaPolygon      = ConvexPolygon.SquarePolygon(10f);
        voronoiGenerator = new VoronoiDiagramGenerator();
        regions          = voronoiGenerator.Execute(areaPolygon, sites);

        //線の削除
        for (int i = 0; i < lines.Count; ++i)
        {
            lineFactory.DeleteLine(lines[i]);
        }
        lines.Clear();

        for (int i = 0; i < regions.Count; ++i)
        {
            ConvexPolygon region = regions[i];

            //線の描画
            if (drawRegionLine)
            {
                List <Vector3> vertices = region.GetVertices3Copy();
                vertices.Add(vertices[0]);
                lines.Add(lineFactory.CreateLine(vertices));
            }

            //メッシュ
            meshes[i] = region.Scale(sites[i], 0.5f).ToMesh();            //AngleSubdivisionOperation.Execute(region, 170f).Scale(sites[i], 1f).ToMesh();

            //あたり判定の設定
            colliders[i].sharedMesh = meshes[i];
        }
    }
예제 #2
0
    private void Update()
    {
        List <Vector2> sites = new List <Vector2>(siteTranses.Select(elem => (Vector2)elem.position));

        //ボロノイ図の作成
        areaPolygon      = ConvexPolygon.SquarePolygon(10f);
        voronoiGenerator = new VoronoiDiagramGenerator();
        List <ConvexPolygon> regions = voronoiGenerator.Execute(areaPolygon, sites);

        List <Vector3> vertices;

        for (int i = 0; i < lines.Count; ++i)
        {
            lineFactory.DeleteLine(lines[i]);
        }
        //lines.Clear();

        for (int i = 0; i < regions.Count; ++i)
        {
            ConvexPolygon region = regions[i];
            if (drawRegionLine)
            {
                vertices = region.GetVertices3Copy();
                vertices.Add(vertices[0]);
                lines.Add(lineFactory.CreateLine(vertices));
            }
            //描画
            Mesh mesh = null;
            if (angled)
            {
                mesh = AngleSubdivisionOperation.Execute(region, 170f).Scale(sites[i], 0.9f).ToAltMesh();
            }
            else
            {
                mesh = LerpSubdivisionOperation.Execute(region, i, lerpT).Scale(sites[i], 0.9f).ToAltMesh();
            }
            UnityEngine.Graphics.DrawMesh(mesh, Matrix4x4.identity, mat, 0);
        }
    }
예제 #3
0
    private ConvexPolygon areaPolygon;              //範囲用のポリゴン

    #region UnityEvent

    private void Start()
    {
        areaPolygon = ConvexPolygon.SquarePolygon(10f);
        //areaPolygon.DrawLine(new GameObject().AddComponent<LineRenderer>());

        voronoiDiagram = new VoronoiDiagramGenerator();

        List <Vector2> list = new List <Vector2>(sites.Select(elem => (Vector2)elem.position));

        List <ConvexPolygon> regions = voronoiDiagram.Execute(areaPolygon, list);

        if (regions == null)
        {
            return;
        }

        foreach (var r in regions)
        {
            var obj = new GameObject("Region Line");
            obj.transform.SetParent(transform);
            //r.DrawDebugLine(obj.AddComponent<LineRenderer>());
        }
    }