Math 如何计算两条直线之间的正角度和负角度?

Math 如何计算两条直线之间的正角度和负角度?,math,geometry,2d,Math,Geometry,2d,不过,两条线之间的夹角有一个问题。结果总是积极的。我需要同时检测正角度和负角度,因此,如果一条线“高于”或“低于”另一条线15度,则形状明显不同 我的配置是,一条线保持静止,而另一条线旋转,我需要通过与静止线的比较来了解它旋转的方向 编辑:对于swestrup下面的评论,实际情况是我只有一行,我记录了它的起始位置。然后直线从起始位置旋转,我需要计算从起始位置到当前位置的角度。例如,如果是顺时针旋转,则为正旋转;如果是逆时针方向,则为负值。(反之亦然。) 如何改进算法,使其根据直线的位置返回正或负

不过,两条线之间的夹角有一个问题。结果总是积极的。我需要同时检测正角度和负角度,因此,如果一条线“高于”或“低于”另一条线15度,则形状明显不同

我的配置是,一条线保持静止,而另一条线旋转,我需要通过与静止线的比较来了解它旋转的方向

编辑:对于swestrup下面的评论,实际情况是我只有一行,我记录了它的起始位置。然后直线从起始位置旋转,我需要计算从起始位置到当前位置的角度。例如,如果是顺时针旋转,则为正旋转;如果是逆时针方向,则为负值。(反之亦然。)


如何改进算法,使其根据直线的位置返回正或负角度?

该函数在RADS中工作

一整圈(360度)内有2个指针

因此,我相信您正在寻找的answear只是返回值-2pi

如果您要求一个函数同时返回两个值,那么您要求中断语言,一个函数只能返回一个值。您可以向它传递两个指针,它可以使用这两个指针设置的值,以便在FRUNCION结束后更改可以持续,并且您的程序可以继续工作。但这并不是解决这个问题的明智方法

编辑


刚刚注意到,函数在返回值时实际上将Rads转换为度。但同样的原则也会起作用

这是一个涉及2D向量的简单问题。两个向量之间角度的正弦与两个向量之间的叉积有关。“高于”或“低于”是由叉积产生的向量的符号决定的:如果你把两个向量A和B交叉,产生的叉积是正的,那么A是“低于”B;如果为负数,则A“高于”B。有关详细信息,请参阅

下面是我用Java编写代码的方法:

包装破损;
导入java.text.DecimalFormat;
导入java.text.NumberFormat;
/**
*向量体
*用户:迈克尔
*日期:2010年4月18日
*时间:下午4:12:45
*/
公共类向量
{
私有静态最终int默认_维度=3;
私有静态final NumberFormat DEFAULT_FORMAT=new DecimalFormat(“0.#####”);
公共静态void main(字符串[]args)
{
双[]a={1.0,0.0,0.0};
双[]b={0.0,1.0,0.0};
double[]c=向量叉积(a,b);
System.out.println(VectorUtils.toString(c));
}
公共静态双[]叉积(双[]a,双[]b)
{
断言((a!=null)&&(a.length>=DEFAULT_维度)&&&(b!=null)&&(b.length>=DEFAULT_维度));
double[]c=新的双精度[默认尺寸];
c[0]=+a[1]*b[2]-a[2]*b[1];
c[1]=+a[2]*b[0]-a[0]*b[2];
c[2]=+a[0]*b[1]-a[1]*b[0];
返回c;
}
公共静态字符串toString(双[]a)
{
StringBuilder=新的StringBuilder(128);
附加(“{”);
对于(双c:a)
{
builder.append(默认_格式.FORMAT(c)).append(“”);
}
builder.append(“}”);
返回builder.toString();
}
}
检查第三个部件的标志。如果为正,则A“低于”B;如果为负,则A“在”B之上-只要两个向量位于y轴右侧的两个象限内。显然,如果它们都在y轴左侧的两个象限中,则相反


你需要思考你对“上面”和“下面”的直觉概念。如果A在第一象限(00),你可以使用的一种“快速且肮脏”的方法是引入第三条参考线R。因此,给定两条线A和B,计算A和R之间的角度,然后计算B和R之间的角度,然后减去它们


这个函数的计算量是实际需要的两倍,但易于解释和调试。

@duffymo的答案是正确的,但如果不想实现叉积,可以使用该函数。它返回一个介于-π和π之间的角度,可以在每一行上使用它(或者更准确地说,是表示线的向量)


如果你得到第一条线(静止线)的角度θ,你必须将第二条线的角度φ归一化为θ-π和θ+π之间(通过加±2π)。两条线之间的角度将是φ-θ。

这是brainjam建议的实现。(它与我的约束一起工作,即保证行之间的差异足够小,因此无需规范化任何内容。)

CGPoint LINE1起点、CGPoint LINE1终点、CGPoint line2Start、CGPoint line2End之间的CGFloat角度{
CGFloat a=line1End.x-line1Start.x;
CGFloat b=line1End.y-line1Start.y;
CGFloat c=line2End.x-line2Start.x;
CGFloat d=line2End.y-line2Start.y;
CGFloat atanA=atan2(a,b);
CGFloat atanB=atan2(c,d);
返回atanA-atanB;
}
我喜欢它简洁。向量版本会更简洁吗?

//考虑两个向量CA和BA
//从CA到BA的计算角度
//感谢Jaanus共享的代码,但是atan2(y,x)使用错误。
浮点获取变换器之间的角度(点2F C、点2F A、点2F B)
{      
浮点数a=a.x-C.x;
浮动b=A.y-C.y;
浮点数c=B.x-c.x;
浮动d=B.y-C.y;
浮球角度a=atan2(b,a);
浮球角度b=atan2(d,c);

如果给定两条任意相交的线段,很难确定哪条线段在另一条线段的上方,甚至很难确定要测量的角度,因为它们通常形成一个“X”形。您是否总是使用两条具有相同起点的直线