我正在研究一个骨骼动画编辑器.现在,每个骨骼都有一个起点和终点,当鼠标位于一个点之下时,随后的拖动将导致骨骼根据鼠标的位置旋转.为此,我调用atan2并将鼠标坐标转换为本地空间,其中本地是鼠标按下的位置.虽然这"有效",但感觉确实是错误的.由骨形成的矢量不一定平行于鼠标点,它应该是.
我觉得atan2有些东西我不明白.
:
if(boneUnderMouse)
{
boneUnderMouse->setAngle(startAngle +
(atan2((float)event.mouse.x - startX,event.mouse.y - startY)));
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我有一个旋转矢量R(x(t), y(t)),我想找到一个角度作为时间的函数.该atan2是之间确定-pi和pi,但它是不方便由我来分析所有动态.那么,有没有什么办法可以扩大atan2从-inf到inf?
我想在圈内敲击时找到该区域.实际上我做了一个计算,但那不准确.
检查我写的代码片段,以便在循环视图中找到选项卡的位置.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event" this method
float dx = touchLocation.x -160;
float dy = touchLocation.y - 240;
double angle = atan2(touchLocation.x,touchLocation.y);
/* Device is iPad */
if (count==4) {
if(angle>-1.639&&angle<=0.775)
{
area=1;
NSLog(@"touched here 1 ********************************** ");
}
else if(angle>0.775&&angle<=1.579)
{
area=2;
NSLog(@"touched here 2********************************** ");
}
else if(angle>1.579&&angle<=2.466)
{
area=3;NSLog(@"touched here 3********************************** ");
}
else
{
area=4;NSLog(@"touched here 4 ********************************** ");
}
}
else if (count==5) {
if(angle>-1.520&&angle<=0.553)
{
area=1;
NSLog(@"touched here 1 ********************************** ");
} …Run Code Online (Sandbox Code Playgroud) 我正在测试和执行简单的 FFT,并且我对相移感兴趣。我用正弦曲线生成 256 个样本的简单数组
10个周期。
我对这些样本执行 FFT 并接收复杂数据 (2x128)。然后我计算这些数据的大小,FFT 看起来像预期的那样:

然后我想计算 fft 复数输出的相移。我正在使用atan2。组合输出 fft_magnitude(蓝色)+ fft+phase(红色)如下所示:
这几乎是我对“小”问题的期望。我知道这是包裹,但如果我想象将其展开,幅度峰值的相移读数为 36 度,我认为它应该为 0,因为我的输入正弦曲线根本没有移动。
如果我移动这个 -36 度(蓝色是同相,红色是移动的,蓝色打印仅供参考),正弦曲线看起来像这样:
如果我对这个红色数据执行 FFT,则幅度 + 相位输出如下所示:
因此很容易想象,展开相位在幅度峰值处将接近 0。所以有 36 度的偏移。但是,如果我准备每 256 个样本 20 个周期和 0 相移的数据,会发生什么
如果我随后执行 FFT,则这是一个输出(幅度 + 相位):
我可以告诉你是否会跨越72度的峰值。所以现在有 72 度的偏移。
谁能给我提示为什么会发生这种情况?atan2() 相位输出是否与频率相关且偏移量为 2pi/周期(360 度/周期)?如何解开它并获得正确的结果(我找不到可解开的工作 C 库)。
它在 ARM Cortex-M7 处理器(嵌入式)上运行。
#define phaseShift 0
#define cycles 20
#include <arm_math.h>
#include <arm_const_structs.h>
float32_t phi = phaseShift * PI / 180; //phase shift in radians
float32_t data[256]; //input data for …Run Code Online (Sandbox Code Playgroud) 我正在写一些坐标变换(更具体地说是Joukoswky变换,维基百科Joukowsky变换),我对性能很感兴趣,但当然精确.我试图以两种方式进行坐标转换:
1)使用双精度计算单独的实部和复杂部分,如下所示:
double r2 = chi.x*chi.x + chi.y*chi.y;
//double sq = pow(r2,-0.5*n) + pow(r2,0.5*n); //slow!!!
double sq = sqrt(r2); //way faster!
double co = cos(atan2(chi.y,chi.x));
double si = sin(atan2(chi.y,chi.x));
Z.x = 0.5*(co*sq + co/sq);
Z.y = 0.5*si*sq;
Run Code Online (Sandbox Code Playgroud)
其中chi和Z是简单的结构,其中x和y为成员.
2)使用复杂:
Z = 0.5 * (chi + (1.0 / chi));
Run Code Online (Sandbox Code Playgroud)
Z和chi很复杂.有趣的是,确实情况1)更快(约20%),但精度差,在逆变换后的逗号后面的第三个十进制数中给出错误,而复数返回确切的数字.那么,问题在于cos(atan2),sin(atan2)?但如果是的话,复合体如何处理呢?
编辑:刚才发现这不是我想到的问题.我必须做一般转型,如
Z = 1/2*(chi ^ n +(1/chi)^ n),到目前为止,上面的代码是我想要的方式.更确切地说,
double sq = pow(sqrt(r2),n); //way faster!
double co = cos(n*atan2(chi.y,chi.x));
double si = sin(n*atan2(chi.y,chi.x));
Z.x = 0.5*(co*sq + co/sq);
Z.y = …Run Code Online (Sandbox Code Playgroud) 可能重复:
c ++中atan和atan2有什么区别?
为什么-π<atan2(y,x)≤π而对于线我们真的只需要从0到π,什么有api像atan2但是会从0返回到pi?
我将如何着手将我的atan职能纳入其中atan2?例如
float myAtan2(double a, double b)
{
float atan2val = //calculate atan2 using atan
return atan2val;
}
Run Code Online (Sandbox Code Playgroud)
抱歉,我不是最擅长三角学!