C#代码  实现点在多个二维坐标系中进行换算(坐标映射)

在机器视觉中表示两个坐标系的映射关系一般用矩阵表示 。

下面的知识则是使用三角函数推导两者的关系。



(一)坐标系原点旋转的情况


如下图所示,有两个坐标系,绿色的XOY, 红色的X'OY'。

点P(x,y)在坐标系XOY中是(300,350),现在我们想求点P在红色坐标系X'OY'中的位置?


我们按推算公式一计算一下,则:

x'=OD+DF=x*cos(20)+y*sin(20)

y'=PC-FC=y*cos(20)-x*sin(20)

>> 表达式: 300*cos(20)+350*sin(20)
401.614836
命令: cal
>> 表达式: 350*cos(20)-300*sin(20)
226.286374


我们的计算结果跟CAD标注的有点小差别,这个现象勇哥有点不解,就解释为CAD捕捉的误差吧。

image.png

(图1)


为了证明数学公式计算的理论值是准确的,问题出在autocad的标注误差,勇哥用数学工具画了一遍上面的例子。

image.png

(图2)


结果是:p (7.69,3.59)

然后用公式计算一下理论值:

命令: cal
>> 表达式: 6*cos(20)+6*sin(20)
7.69027658
命令: cal
>> 表达式: 6*cos(20)-6*sin(20)
3.58603486

可以看到如果第三位四舍五入的话,结果是完全无误的!!

因此各位做理论验证,最好用专业的数学工具来绘图计算。

但是数学工具GeoGebra缺点是画线条是没有像autocad那么灵活。真是各有各的好处。


(二)坐标系移动旋转复合变换的情况


接下来看旋转+位移(复合变换)后的坐标系怎么进行点转换。

先给出两个公式推导的过程,然后再验证效果。


推导公式一,如下:


image.png

(图3)


结论就是: 

x=x'*cos(θ)+y'*sin(θ)+a

y=y'*cos(θ)-x'*sin(θ)+b



推导公式二,如下:

image.png

(图4)


image.png

(图5)

这个公式二理论上也是可以转为公式一的。公式一更加巧妙精简一些。


下面我们来验证公式的效果:

为了方便代入实际数值进行计算,勇哥画了一个示意图,我们按公式一来解一下:

其中基坐标系为xy坐标系。E'DE''为复合变换后的坐标系,其中B点在这个坐标系中的位置为(2.56, 1.2)

θ=20度

现在我们要求B点在基坐标系中的坐标。

image.png

(图6)


按上面的公式:

x=x'·cos(θ)+y'·sin(θ)+a
y=y'·cos(θ)-x'·sin(θ)+b


其中x'y'=(2.56,1.2)

θ=20度

a,b=(4,4)


计算结果如下:

命令:CAL
>> 表达式: 2.56*cos(-20)+1.2*sin(-20)+4
5.99518894
命令:cal
>> 表达式: 1.2*cos(-20)-2.56*sin(-20)+4
6.00320271

如图3所示,答案就是(6,6)


这里有个问题,为啥是-20度呢。

这个要看你的坐标系是怎么转动才与基坐标系的X轴水平,如果是顺时针转的就是负角。



接下来我们反解一下,已知B点在基坐标下为(6,6),求解B点在复合变换坐标系下的坐标

(答案是(2.56, 1.2))

。。。。。

先略,暂时没推算出来,以后再补充。

2020/8/15勇哥注:反解推算出来了,见后面的介绍。



我们来对比看看autocad中的坐标系变换的效果吧。

image.png

使用指令ucs, obj方式,点击蓝色矩形的X轴所在的线。

cad已经把坐标系切换成了蓝色矩形框所在的坐标系,可以观察到xyz指示图标变化了,并且鼠标指针也变化了。

image.png

这个时候点击圆心,可以看到圆心的坐标为(724.1483,  837.4397),这个值是圆心在蓝色坐标系下的值 。

image.png

按上面的经验,我们还要得到偏移距离 (a,b),和两个坐标系X轴的夹角。

其值如下:

image.png

好了,我们算一下这个圆心在红色坐标系中的值是多少:

命令: cal
>> 表达式: 724.1483*cos(-10)+837.4397*sin(-10)+369.3
937.026982
命令: CAL
>> 表达式: 837.4397*cos(-10)-724.1483*sin(-10)+99.62
1050.08414

上面是理论计算的值,我们看看CAD的结果:

image.png


稍有误差,不过没关系,不是我们的错。



(三)反解


上面提过:

已知B点在基坐标下为(6,6),求解B点在复合变换坐标系下的坐标

(答案是(2.56, 1.2))


反解出的公式推导如下:

image.png

image.png

勇哥试了一下,用这个公式可以反解出图6的正确答案是(2.56, 1.2)。

即已知基坐标系的点,求出复合变换后坐标系对应点的坐标。



尾声:

本来这个贴子的标题是说要提供C#代码的,不过因为公式比较简单,似乎没这个必要了吧!



--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864