用于查找光线是顺时针,逆时针还是两者的算法

时间:2017-08-01 02:06:19

标签: c# vector

我正在寻找一种算法来确定特定阵列是顺时针还是逆时针,或者两者都不是。如果重要,我正在使用C#。

输入变量是X位置,Y位置和任意方向的标准化(1单位长)Ray(X和Y分量列表,从-1到1),其源位于给定点。

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

此图应该有所帮助:

Ray Output Example

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

我自己并没有真正掌握数学技能,所以这就是我在这里问的原因。

2 个答案:

答案 0 :(得分:0)

我解决了这个问题,如下所示。

  1. 首先,计算x,y点的区域
  2. 其次,对该地区进行分类
  3. 这是Code。

    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;
            }
        }
    }
    

    这个主要方法与以下相同

    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 );
            }
        }
    

答案 1 :(得分:0)

好吧,我设法通过比较两个角度来解决我的问题。我认为将问题转发两次并比较答案比尝试向后解决问题更容易。

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;
}

...其中Vector2是一个包含X和Y变量的对象。

非常感谢你的回答JaeWoo所以,即使我不理解它。