首页 > 其他分享 >多边形顶点顺时针排放

多边形顶点顺时针排放

时间:2023-11-28 22:56:02浏览次数:29  
标签:顺时针 多边形 int ++ Length verts var 顶点 public

效果

 

//凹多边形,凸多边形都能判断
public static bool IsVertsClockwise(Vector2[] verts)
{
    if (verts.Length < 3)
        return false;

    //劣角数量比优角数量多
    //假设是顺时针, 那叉乘结果为正的次数比负多
    int positionNum = 0;
    int negativeNum = 0;
    for (int i = 0; i < verts.Length; ++i)
    {
        var a = verts[i];
        var b = verts[(i + 1) % verts.Length];
        var c = verts[(i + 2) % verts.Length];
        var ba = a - b;
        var bc = c - b;
        float cross = V2Cross(ref ba, ref bc);
        if (cross > 0)
            positionNum++;
        else
            negativeNum++;
    }
    var result = positionNum > negativeNum;
    return result;
}

//多边形顶点按顺时针排列
public static bool SortVertsClockwise(Vector2[] verts)
{
    if (!IsVertsClockwise(verts))
    {
        for (int i = 0; i < verts.Length / 2; ++i)
        {
            var temp = verts[i];
            int swapIndex = verts.Length - 1 - i;
            verts[i] = verts[swapIndex];
            verts[swapIndex] = temp;
        }
        return true;
    }
    return false;
}

 

测试代码

using System.Collections.Generic;
using UnityEngine;

public class SortVertsClockwiseTest : MonoBehaviour
{
    public Transform[] m_Verts;

    void Start()
    {
        var vertList = new List<Vector2>();
        for (int i = 0; i < m_Verts.Length; ++i)
        {
            var vert = m_Verts[i];
            if (null != vert)
            {
                vertList.Add(vert.position);
                Debug.Log($"{i}: {vert.position}");
            }
        }

        var arr = vertList.ToArray();
        if (Shape2DHelper.SortVertsClockwise(arr))
        {
            Debug.Log($"Sorted");
            for (int i = 0; i < arr.Length; ++i)
            {
                Debug.Log($"{i}: {arr[i]}");
            }
        }
    }


#if UNITY_EDITOR

    public Color m_Edge0Color = Color.red;
    public Color m_Edge1Color = Color.green;

    private void OnDrawGizmos()
    {
        if (null != m_Verts)
        {
            DrawPolyTrans(m_Verts);
        }
    }

    public void DrawPolyTrans(Transform[] verts)
    {
        Transform firstVert = null; //第1个非null顶点
        Transform lastVert = null;
        for (int i = 0; i < verts.Length; ++i)
        {
            if (i <= 1) Gizmos.color = m_Edge0Color;
            else if (2 == i) Gizmos.color = m_Edge1Color;
            else Gizmos.color = Color.white;
            
            var vert = verts[i];
            if (null == vert) continue;

            if (null == lastVert)
            {
                firstVert = vert;
                lastVert = vert;
                continue;
            }
            Gizmos.DrawLine(lastVert.position, vert.position);
            lastVert = vert;
        }
        Gizmos.color = Color.white;
        //首尾相接
        if (null != lastVert && null != firstVert)
        {
            Gizmos.DrawLine(lastVert.position, firstVert.position);
        }
    }

#endif

}

 

参考 

如何判断一个点在多边形内部(二) - 知乎 (zhihu.com)

 

标签:顺时针,多边形,int,++,Length,verts,var,顶点,public
From: https://www.cnblogs.com/sailJs/p/17862115.html

相关文章

  • 在线CAD SDK前端库绘制规则多边形图形
    前言在CAD(计算机辅助设计)领域,绘制多边形是常见的任务之一。MxCAD是一款专注在线CAD的前端库,提供了丰富的绘图和设计功能,使得绘制多边形变得轻松而灵活。本文将带领您通过使用MxCAD实现绘制多边形的过程,深入了解其基本概念和功能。mxcad 是一个基于TypeScript的前端库,专为......
  • 判断是否为凸多边形
    所有内角都在(0,180)的多边形为凸多边形(Convex),否则为凹多边形(Concave)。 顶点顺序逆时针 顶点顺序顺时针  //是否为凸多边形publicstaticboolIsConvexPolygon(Vector2[]polygon){intlen=polygon.Length;for(inti=0;i<len;++i)//顶点......
  • 【2023-11-01】一款基于 pdf.js 的 PDF 批注注释插件库(纯JS、高亮、画笔、多边形、历
    基于纯JavaScript和PDF.js做的一款PDF批注拓展插件-PDFMaster,一款仍能兼容支持IE11的PDF批注插件,界面美观功能强大,有无开发经验都可以快速简单快速使用。Demo及源码Demo和源码地址:https://demos.libertynlp.com功能演示视频:https://www.bilibili.com/video/BV12C4y1n7TL......
  • CocosCreator3.x 应用在UI(Sprite) 上的 shader(.effect) 的合批,通过自定义顶点参数(一
    前言为啥要合批减少DC什么是自定义顶点参数通过几何体实例化特性(GPUInstancing)可使GPU批量绘制模型相同且材质相同的渲染对象。如果我们想在不打破这一特性的情况下单独修改某个对象的显示效果,就需要通过自定义几何体实例化属性。参考文档UI(Sprite)怎么你了?按照文......
  • CocosCreator3.x 应用在UI(Sprite) 上的 shader(.effect) 的合批,通过自定义顶点参数(二
    具体操作步骤接下来以一个制造旋转效果的shader为例子,提供了这些参数的设置:旋转速度float旋转中心位置vec2逆时针/顺时针bool扭曲度float并在使用的贴图一致的前提下并且参数不同的值都能够合批。最终项目可以从GITHUB获取。CCC版本:3.8.0深入了解可以阅读后续......
  • CocosCreator3.x 应用在UI(Sprite) 上的 shader(.effect) 的合批,通过自定义顶点参数(四
    源码阅读部分顶点数量、布局相关设置针对UI所使用的Mesh的顶点设置:如simple模式使用1个矩形(2x2个顶点),sliced模式使用9个矩形(4x4个顶点)dataLength相当于顶点数量。vertexRow和vertexCol描述了网格形状。SetIndexBuffer则描述网格中所有“三角形”分别由哪3......
  • CocosCreator3.x 应用在UI(Sprite) 上的 shader(.effect) 的合批,通过自定义顶点参数(三
    参考资料资料1来源:https://forum.cocos.org/t/topic/148747/28用户:homym(tkhoi01281)3.x版自定参数我是利用createMesh方法去生成ui,因为createMesh就有自定义顶点参数的方法这个改动其实是可以弄一个新sprite来继承老spirte,然后把引擎里的simple.ts,splice.ts等assemb......
  • 几何计算-基于Turf.js实现多边形的拆分及合并
    几何计算-基于Turf.js实现多边形的拆分及合并阿飞​红星美凯龙3D前端开发工程师​关注他 10人赞同了该文章❝JSAPIGL近期为支持物流行业实现了几何图形编辑器,用户可通过编辑器接口进行点、线、面、圆的绘制和编辑。在物流行业中常见的使用场景......
  • 基于凸多边形离散点排序的研究
    OrderBy(){varvertices1=_.cloneDeep(this.polygon);varxArray=vertices1.map((item)=>item.x);varyArray=vertices1.map((item)=>item.y);const[minX,maxX,minY,maxY]=[_.min(xArray),_.max(xArray),_.min(yArray),_.m......
  • JS实现判断点是否在多边形范围内
    JS实现判断点是否在多边形范围内 一、说明在GIS领域,判断点是否在多边形范围内是一个基础方法,这里主要说下实现原理。原理比较简单,就是有一个GIS理论,一个点向一个方向发送射线,射线与多边形各个边相交的交点如果是奇数说明点在多边形范围内。 (图片引用自:https://blog.cs......