我正在寻找一种算法来确定特定阵列是顺时针还是逆时针,或者两者都不是。如果重要,我正在使用C#。
输入变量是X位置,Y位置和任意方向的标准化(1单位长)Ray(X和Y分量列表,从-1到1),其源位于给定点。
输出变量是某种类型,最多可以有3种状态,例如返回可能性为0,1或2的字节,表示顺时针,逆时针或两者都不存在。
此图应该有所帮助:
绿色区域的光线应逆时针返回,红色区域的光线应顺时针返回,蓝色区域不应返回。此形状根据位置旋转,因此其中一个蓝色角将始终指向中心。这些光线可能不完美,因此误差范围应该很大,每个“象限”应该是完整的90度。
我自己并没有真正掌握数学技能,所以这就是我在这里问的原因。
答案 0 :(得分:0)
我解决了这个问题,如下所示。
这是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所以,即使我不理解它。