我正在从3轴加速度计计算角度,但我的编译器没有atan或atan2功能.它有一个保留的内存插槽,但它调用了一个我在任何文件中都找不到的功能.
我的编译器是运行ARMCC编译器的KeilμVision4.编译有文件math.h,但函数是extern并且不存在:
Run Code Online (Sandbox Code Playgroud)extern _ARMABI double atan2(double /*y*/, double /*x*/);
是否有我可以包含的lib或函数,它具有arctan函数的实现?或者是否有另一种从加速度计计算角度的功能?我需要对角度进行完整的3轴校准.
编辑:我希望避免一个充满预先计算值的表格.
我正在尝试绘制一个物体的标题.我有四个点向量 - 让我们称之为
mdex mdey(又名x1,y1),thpx thpy(又名x2,y2).我y在x(dy和dx)中找到了变化和变化,然后将其输入到atan2d函数中.然后我浏览结果并将它们绘制到图表上.
图表上的比例从-180到180.当线路经过-180或180度时,我的问题就出现了.然后它"弹出"到图表的另一侧(即,181实际上是-179).
这是有问题的,因为当它确实没有时,它看起来像角度发生了巨大的变化 - 它只是'翻身'.另外,这会搞砸我的角速度计算,这是根据点之间的变化来计算的.最初,我只是尝试通过向低于0的所有值添加180来将图形转换为0-360比例.这不起作用.
这是图表,因此您可以更好地理解问题(图表是在我尝试0-360转换后).

我的问题
我想知道是否有一个不同的功能,我可以用来计算角度,这将给我一个不断增加的值,一种修改数据以便绘制得很好的方法,或者一种修改图形的方法,使它看起来很直观?
提前致谢!
我正在读这篇关于获得2分之间角度的帖子,并且在想.我认为atan2定义为atan2(y,x),这里它是atan2(deltaX,deltaY),为什么x现在是第一个?
public float getAngle(Point target) {
float angle = (float) Math.toDegrees(Math.atan2(target.x - x, target.y - y));
if (angle < 0) {
angle += 360;
}
return angle;
}
Run Code Online (Sandbox Code Playgroud) Math.atan2()是一个非常有用的计算角度的函数.但是,我无法绕过一件事:
$(document).mousemove(function(event){
r = Math.atan2(event.pageY, event.pageX);
deg = r * 180/Math.PI;
console.log(deg);
})
Run Code Online (Sandbox Code Playgroud)
console.log表示计算角度的0,0位于屏幕的左上角.如何从不同的原点计算角度,比如说屏幕的中心?
我在理解glsl中函数atan的结果时遇到了一些问题.文档也缺乏.
例如,我需要将顶点转换为球面坐标,转换球面坐标的半径,然后将其转换回笛卡尔坐标.我在以0为中心的半径为2的二氧化碳球的顶点上使用以下变换.
vec3 to_sphere(vec3 P)
{
float r = sqrt(P.x*P.x + P.y*P.y + P.z*P.z);
float theta = atan(P.y,(P.x+1E-18));
float phi= acos(P.z/r); // in [0,pi]
return vec3(r,theta, phi);
}
vec3 to_cart(vec3 P)
{
float r = P.x;
float theta = P.y;
float phi = P.z;
return r * vec3(cos(phi)*sin(theta),sin(phi)*sin(theta),cos(theta);
}
void main()
{
vec4 V = gl_Vertex.xyz;
vec3 S = to_sphere(V.xyz);
S.x += S.y;
V.xyz = to_cartesian(S);
gl_Position = gl_ModelViewProjectionMatrix * V;
}
Run Code Online (Sandbox Code Playgroud)
但如果我使用atan(y/x)或者结果会有所不同atan2(y,x).我把小1E-18常数放在一边以避免极点.
为什么会这样?我假设返回的值 …
我正在尝试实现一个类似于atan2的函数,以将任意相对相移的两个输入正弦信号映射到从0到线性变化的单个输出信号2?。 atan2通常假设两个信号具有90度相移。
y0(x) = sin(x)和y1 = sin(x + phase),哪里phase有一个固定的非零值,我该如何实现一种以x模数返回的方法2??我\xc2\xb4m 是编程新手,所以我不知道出了什么问题。请帮忙
\n\nfrom math import atan2, pi\nx = int(input("value of x"))\ny = int(input("value of y"))\nr = (x**2 + y**2) ** 0.5\nang = atan2(y/x)\nprint("Hypotenuse is", r, "angle is", ang)\nRun Code Online (Sandbox Code Playgroud)\n 我在第一象限有两个点 A(X,Y) 和 B(P,Q)。还有一点C(L,M)。如何在顺时针方向找到 CA 和 CB 之间的角度?
我搜索了很多,所有的解决方案都使用了 atan2() 但它找到了相对于 x 轴的原点角度。
可以假设 C 和 A 是固定的。B 可以在第一象限的任何地方。角度必须是顺时针方向且在 0-360(或 0 到 360-1)范围内。
我在 C/C++ 中这样做。
编辑:为每个请求添加代码。这有点不同,因为我陷入了一个概念并需要对其进行澄清。如果点 x,y 位于 50,50 和 P 之间,此函数应该返回。 P 是相对于 CA 的角度。
bool isInsideAngle(long double x,long double y, long double p)
{
if((atan2(y,x) >= atan2(50,100)) && (atan2(y,x) <= (p * PI / 50)))
{
// cout<<"YES!";
// cout<<" atan2(y,x) = " <<atan2(y,x)*180/PI<<endl;
// cout<<" atan2(50,50) = " <<atan2(50,100)*180/PI<<endl;
// cout<<" (p * PI …Run Code Online (Sandbox Code Playgroud) theta=atan2(0,0);
Run Code Online (Sandbox Code Playgroud)
这个语句的输出是0,但它是一个0/0形式,所以它的输出如何为0,甚至维基百科说它应该是未定义的,请解释为什么编译器给出0作为该语句的输出.
Nvidia在Cg 3.1 Toolkit文档中有一些功能
arctan2实现如下
float2 atan2(float2 y, float2 x)
{
float2 t0, t1, t2, t3, t4;
t3 = abs(x);
t1 = abs(y);
t0 = max(t3, t1);
t1 = min(t3, t1);
t3 = float(1) / t0;
t3 = t1 * t3;
t4 = t3 * t3;
t0 = - float(0.013480470);
t0 = t0 * t4 + float(0.057477314);
t0 = t0 * t4 - float(0.121239071);
t0 = t0 * t4 + float(0.195635925);
t0 = t0 * t4 - float(0.332994597);
t0 …Run Code Online (Sandbox Code Playgroud)