坐标的平移和旋转

时间:2020-06-12 19:52:19

标签: c# math geometry

我正在开发一个拍摄第一个图像并找到两个红色圆圈的应用程序。 之后,该应用会拍摄第二张图像,将其与第一张图像进行比较,然后返回X,Y和角度的偏移量。 我需要做的是,基于这些偏移量,将小方块恢复到其原始位置。 如何获得我所拥有的信息的小方块的偏移量?还是有更好的解决方案?第二张图像可以旋转和平移。

enter image description here

1 个答案:

答案 0 :(得分:1)

两个红色小圆圈的位置:

x1 = {x1[0], x1[1]}     and    x2 = {x2[0], x2[1]}

测得的位移: 新的小圆圈应具有坐标

{x1[0] + dx1[0], x1[1] + dx1[1]}   and   {x2[0] + dx2[0], x2[1] + dx2[1]}

您将获得输入数据:

  x1 = {x1[0], x1[1]}     and    x2 = {x2[0], x2[1]}
 dx1 = {dx1[0], dx1[1]}   and   dx2 = {dx2[0], dx2[1]}

这足以计算其余点和正方形如何移动,包括旋转角度。

v[0] = x2[0] - x1[0];
v[1] = x2[1] - x1[1];
w[0] = v[0] + dx2[0] - dx1[0];
w[1] = v[1] + dx2[1] - dx1[1];
norm_v = math.Sqrt(v[0] * v[0] + v[1] * v[1]);
norm_w = math.Sqrt(w[0] * w[0] + w[1] * w[1]);

如果一切正确,请norm_v = norm_w(最大数字错误)。也许检查一下。

cos_angle = ( v[0] * w[0] + v[1] * w[1] ) / (norm_v * norm_w);
sin_angle = (- v[1] * w[0] + v[0] * w[1]) / (norm_v * norm_w); 

因此,任何其他点都会根据变换定律发生变化:

x_new[0] = cos_angle * (x_old[0] - x1[0]) - sin_angle * (x_old[1] - x1[1]) + x1[0];
x_new[0] = sin_angle * (x_old[0] - x1[0]) + cos_angle * (x_old[1] - x1[1]) + x1[1];
相关问题