C# 查找光线是顺时针、逆时针还是两者都不顺时针的算法

C# 查找光线是顺时针、逆时针还是两者都不顺时针的算法,c#,vector,C#,Vector,我正在寻找一种算法,可以计算出一个特定的数组是顺时针还是逆时针,或者两者都不是。如果重要的话,我用的是C 输入变量是任意方向上的X位置、Y位置和归一化(1单位长)光线(X和Y分量列表,从-1到1),其源位于给定点 输出变量是一种最多可以有3种状态的类型,例如返回可能性为0、1或2的字节,表示顺时针、逆时针或两者都不表示 此图应有助于: 绿色区域中的光线应逆时针返回,红色区域中的光线应顺时针返回,蓝色区域中的光线均不应返回。此形状根据位置旋转,因此其中一个蓝色角始终指向中心。这些光线可能不完美,

我正在寻找一种算法,可以计算出一个特定的数组是顺时针还是逆时针,或者两者都不是。如果重要的话,我用的是C

输入变量是任意方向上的X位置、Y位置和归一化(1单位长)光线(X和Y分量列表,从-1到1),其源位于给定点

输出变量是一种最多可以有3种状态的类型,例如返回可能性为0、1或2的字节,表示顺时针、逆时针或两者都不表示

此图应有助于:

绿色区域中的光线应逆时针返回,红色区域中的光线应顺时针返回,蓝色区域中的光线均不应返回。此形状根据位置旋转,因此其中一个蓝色角始终指向中心。这些光线可能不完美,因此误差范围应该很大,每个“象限”的完整90度应该是好的


我自己并没有真正的数学技能来实现这一点,所以这就是我在这里提问的原因。

我解决这个问题的方法如下

  • 首先,计算x,y点的区域
  • 第二,对该区域进行分类
  • 这是代码

    namespace ClockWise_Stackoverflow
    {
        public enum State { ClockWise, CounterClockWise, Neither }
        class Program
        {
            static void Main(string[] args)
            {
                Random rd = new Random();
                var xyInput = Enumerable.Range(0, 10)
                                            .Select(f => new double[2] 
                                                          {         
                                                           rd.NextDouble(),  
                                                           rd.NextDouble()
                                                          }
                                             .ToState())
                                             .ToList();           
            }
    
        }
    
        public static class Extension
        {
            public static State ToState(
                this double[] xy)
            {
                var x = xy[0];
                var y = xy[1];
                if (x * y <= 0) return State.Neither;
                else if (x > 0) return State.CounterClockWise;
                else if (x < 0) return State.ClockWise;
                else return State.Neither;
            }
        }
    }
    
    namespace顺时针\u堆栈溢出
    {
    公共枚举状态{顺时针、逆时针、均不}
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    随机rd=新随机();
    var xyInput=可枚举范围(0,10)
    .选择(f=>newdouble[2]
    {         
    rd.NextDouble(),
    第二条双倍
    }
    .ToState())
    .ToList();
    }
    }
    公共静态类扩展
    {
    公共静态状态(
    这是双[]xy)
    {
    var x=xy[0];
    变量y=xy[1];
    如果(x*y 0)逆时针返回状态;
    如果(x<0)返回状态,则为顺时针;
    否则返回状态。两者都不是;
    }
    }
    }
    
    此主要方法如下所示

    static void Main(string[] args)
        {
            Random rd = new Random();
            List<State> xyOutput = new List<State>();
    
            for ( int i = 0 ; i < 10 ; i++ )
            {
                double[] input = new double[] 
                                        {
                                            rd.NextDouble(),
                                            rd.NextDouble()
                                        };
                State currentState = input.ToState();
                xyOutput.Add( currentState );
            }
        }
    
    static void Main(字符串[]args)
    {
    随机rd=新随机();
    List xyOutput=新列表();
    对于(int i=0;i<10;i++)
    {
    双精度[]输入=新双精度[]
    {
    rd.NextDouble(),
    第二条双倍
    };
    State currentState=input.ToState();
    xyOutput.Add(当前状态);
    }
    }
    
    好吧,我通过比较两个角度来解决我的问题。我认为向前两次解决问题并比较答案要比向后解决问题容易得多

    private sbyte GetCircumferenceDirection (Vector2 pos, Vector2 dir) {
        float angleHit = Mathf.Atan2 (pos.y, pos.x);
        float angleNormal = Mathf.Atan2 (pos.y + dir.y, pos.x + dir.x);
        float angleDiff = angleNormal - angleHit;
        if (angleDiff > 0.001) {
            return 1;
        }
        if (angleDiff < -0.001) {
            return -1;
        }
        return 0;
    }
    
    private sbyte getcirconferencedirection(Vector2 pos,Vector2 dir){
    浮动角度HIT=Mathf.Atan2(位置y、位置x);
    浮动角度法线=数学Atan2(位置y+dir.y,位置x+dir.x);
    浮动角度diff=角度法线-角度命中;
    如果(角度差>0.001){
    返回1;
    }
    如果(角度差<-0.001){
    返回-1;
    }
    返回0;
    }
    
    …其中Vector2是包含X和Y变量的对象


    无论如何,谢谢你的回答,JaeWoo,尽管我不明白。

    为什么必须使用Enumerable.Range?
    =>
    是什么意思?注意:这个答案特别使用了Unity C#和Vector2和Mathf。