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