saz*_*azr 18 c++ math trigonometry
我试图弄清楚角度是否位于其他两个角度之间.我一直在尝试创建一个简单的函数来执行此操作,但我的技术都不适用于所有可能的角度值.
你能帮我编辑一下我的功能,以正确判断角度是否位于其他2个角度之间?

在上图中; 我使用绿点作为中心点,然后确定每条线与绿点的角度.然后我计算黑点到绿点的角度.我想检查黑点的角度之间的2线的角度.
注意:在我的情况下; 据说角度(targetAngle)位于2个其他角度之间,如果2个角度之间的差<180度并且目标角度位于由这2个角度构成的空腔中.
下面的代码应该可以工作,但是对于这些代码失败(它们位于角度之间):
- is_angle_between(
150,190,110 )- is_angle_between(3,41,345)
bool is_angle_between(int target, int angle1, int angle2)
{
int rAngle1 = ((iTarget - iAngle1) % 360 + 360) % 360;
int rAngle2 = ((iAngle2 - iAngle1) % 360 + 360) % 360;
return (0 <= rAngle1 && rAngle1 <= rAngle2);
}
// Example usage
is_angle_between(3, 41, 345);
Run Code Online (Sandbox Code Playgroud)
我尝试的另一种技术也不起作用:
int is_angle_between(int target, int angle1, int angle2)
{
int dif1 = angle1-angle2;
int dif2 = angle2-angle1;
int uDif1 = convert_to_positive_angle( dif1 ); // for eg; convert -15 to 345
int uDif2 = convert_to_positive_angle( dif2 );
if (uDif1 <= uDif2) {
if (dif1 < 0) {
return (target <= angle1 && target >= angle2);
}
else return (in_between_numbers(iTarget, iAngle1, iAngle2));
}
else {
if (dif2 < 0) {
return (target <= angle1 && target >= angle2);
}
else return (in_between_numbers(iTarget, iAngle1, iAngle2));
}
return -1;
}
Run Code Online (Sandbox Code Playgroud)
fde*_*hin 11
bool is_angle_between(int target, int angle1, int angle2)
{
// make the angle from angle1 to angle2 to be <= 180 degrees
int rAngle = ((angle2 - angle1) % 360 + 360) % 360;
if (rAngle >= 180)
std::swap(angle1, angle2);
// check if it passes through zero
if (angle1 <= angle2)
return target >= angle1 && target <= angle2;
else
return target >= angle1 || target <= angle2;
}
Run Code Online (Sandbox Code Playgroud)
灵感来自关于模块化算术中间隔的帖子:
static bool is_angle_between(int x, int a, int b) {
b = modN(b - a);
x = modN(x - a);
if (b < 180) {
return x < b;
} else {
return b < x;
}
}
Run Code Online (Sandbox Code Playgroud)
其中(如果检查角度)modN()将实施为
// modN(x) is assumed to calculate Euclidean (=non-negative) x % N.
static int modN(int x) {
const int N = 360;
int m = x % N;
if (m < 0) {
m += N;
}
return m;
}
Run Code Online (Sandbox Code Playgroud)
void normalize( float& angle )
{
while ( angle < -180 ) angle += 360;
while ( angle > 180 ) angle -= 360;
}
bool isWithinRange( float testAngle, float a, float b )
{
a -= testAngle;
b -= testAngle;
normalize( a );
normalize( b );
if ( a * b >= 0 )
return false;
return fabs( a - b ) < 180;
}
Run Code Online (Sandbox Code Playgroud)
我从这个线程中找到了这句话:
如果点 P 在三角形 ABC 内,则
PAB区域+PBC区域+PAC区域=ABC区域
请注意,如果 P 位于 AB、BC 或 CA 的边缘,则上述情况成立。但实际上,PAB、PBC、PAC 区域之一为 0(因此请务必检查这一点)。
如果 P 在外部,则上述等式不成立...
面积如何确定?你有两个选择:1)海伦定理,涉及sqrt,速度较慢2)更优选的方法是叉积(或有效地,(向下乘积之和减去向上乘积之和)绝对值的一半)
例如,如果 A=(x1,y1) B=(x2,y2),C=(x3,y3) 面积= abs(x1*y2+x2*y3+x3*y1-x1*y3-x3*y2- x2*y1)/2
另外,您可能需要小心浮点错误...而不是检查严格的不等式,而是检查 abs(ba)
希望这会有所帮助
| 归档时间: |
|
| 查看次数: |
6848 次 |
| 最近记录: |