三角函数在图形学里的应用(四) ​已知矩形的中心点、边长、phi求四个顶点的坐标

已经矩形的中心点、边长、phi求四个顶点的坐标


 在halcon里面,类似gen_measure_rectangle2、smallest_rectangle2的算子表示任意角度的矩形。

其信息包括:

  • 矩形中心点 row,column

  • 矩形角度 Phi

  • 矩形区域的长和宽的一半 Length1, Length2

如下图所示:

image.png

(图1)

就没有没直接给出矩形4个顶点坐标。有时候想知道4个顶点的坐标怎么计算呢?


由于勇哥手上有一段halcon代码正好用解决上面的问题,所以我们先分析一下代码的结果,以此为参考进行推导。

代码如下:

* Image Acquisition 01: Code generated by Image Acquisition 01
read_image (Image, 'D:/s4.bmp')
gen_rectangle1 (ROI_0, 703.23, 1022.93, 2188.17, 3252.27)
reduce_domain(Image, ROI_0, ImageReduced)
threshold(ImageReduced, Region, 0, 100)
connection(Region, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 15000, 999999999)
smallest_rectangle2 (SelectedRegions, Row16, Column16, Phi3, Length1, Length2)
    tuple_deg(Phi3,Deg)
    len1:=Column16-Length1
    len2:=Row16-Length2
    
    *提取仿射最小外接矩形的四个顶点坐标
    gen_rectangle2_contour_xld (Rectangle4, Row16, Column16, Phi3, Length1, Length2)
    tuple_cos (Phi3, Cos)
    tuple_sin (Phi3, Sin)
    dev_set_color('red')
    a:= -Length1*Cos - Length2*Sin
    b := -Length1*Sin + Length2*Cos
    gen_cross_contour_xld(Cross1, Row16-b,  Column16+a, 6, Phi3)
    c := Length1*Cos - Length2*Sin
    d := Length1*Sin + Length2*Cos
    gen_cross_contour_xld(Cross2, Row16-d, Column16+c, 6, Phi3)
    e:= Length1*Cos + Length2*Sin
    f := Length1*Sin - Length2*Cos
    gen_cross_contour_xld(Cross3, Row16-f, Column16+e, 6, Phi3)
    g := -Length1*Cos + Length2*Sin
    h := -Length1*Sin - Length2*Cos
    dev_set_color('green')
    x1:=Column16+a
    y1:=Row16-b
    disp_cross(200000, Row16-b,  Column16+a, 156, rad(10))
    disp_cross(200000, Row16-d, Column16+c, 156, rad(10))
    disp_cross(200000, Row16-f, Column16+e, 156, rad(10))
    disp_cross(200000, Row16-h, Column16+g, 156, rad(10))
    disp_obj(Cross1,200000)


在下图中,矩形的四个顶点坐标位置被显示了出来。

image.png

(图2)

从上面的halcon代码结果中,我们可以观察到矩形左上角顶点的数据如下:

Length1=807.053,  Length2=378.839
Phi3=0.0239714弧度=1.37346度
矩形中心坐标:x=2067.95  y=1413.22 
cos(1.37346)=0.9997127   
sin(1.37346)=0.0239691034
a:= -Length1*Cos - Length2*Sin
b:= -Length1*Sin + Length2*Cos
a=-815.902
b=359.386
矩形左顶点坐标:
x=2067.95+a=1252.04843
y=1413.22-b=1053.83418

按上面的halcon程序,勇哥绘制了一张CAD图。

因为halcon的坐标系类似CAD的第四象限,它以左上角为原点的。所以注意下图中的y坐标其实是负值。

image.png

(图3)


下面是CAD的计算结果,可以看到跟halcon的计算结果是一样的。

>> 表达式: cos(1.37346)
0.9997127
命令: sin(1.37346)
未知命令“SIN(1.37346)”。按 F1 查看帮助。
命令: cal
>> 表达式: sin(1.37346)
0.0239691034
命令: cal
>> 表达式: -807.053*cos(1.37346)-378.839*sin(1.37346)
-815.901565
命令: cal
>> 表达式: -807.053*sin(1.37346)+378.839*cos(1.37346)
359.385823
命令: CAL
>> 表达式: 2067.95-815.901565
1252.04843
命令: cal
>> 表达式: 1413.22-359.385823
1053.83418


对于代码中的计算公式

矩形中心坐标:x=2067.95  y= 1413.22
a:= -Length1*Cos - Length2*Sin=-815.902
b:= -Length1*Sin + Length2*Cos=359.386
x0=x+a=1252.04843
y0=y-b=1053.83418

可能仍然不好理解,其实它是上一篇《三角函数在图形学里的应用(二)》中所说的饶任意点旋转公式的应用。

这里再引用一下那个公式:

x0=cos(a)*(x-rx0)-sin(a)*(y-ry0)+rx0
y0=cos(a)*(y-ry0)+sin(a)*(x-rx0)+ry0
其中x,y为起始点,x0,y0是旋转后的点,rx0,ry0是旋转中心, a是旋转的角度

在下面的示意图中,白色矩形是水平状态的矩形,黄色矩形是转了a度的矩形。

图中标注出了矩形的中心坐标、旋转前的左上角坐标、旋转后的左上角坐标。

image.png

(图4)

按图中的信息,勇哥用cad计算了验证了一下,可以看到结果完全正确:

rx0 = 2077.2623,  ry0 = -1458.9505    旋转中心
a=1.37346
x  = 1270.2073,  y  = -1080.1115      旋转前的左上角顶点
x0=cos(a)*(x-rx0)-sin(a)*(y-ry0)+rx0    =1252.04626
y0=cos(a)*(y-ry0)+sin(a)*(x-rx0)+ry0
正确答案:x=1261.3587,  Y = -1099.5647

x0=cos(1.37346)*(1270.2073-2077.2623)-sin(1.37346)*(-1080.1115-(-1458.9505))+2077.2623=1261.35874
y0=cos(1.37346)*(-1080.1115-(-1458.9505))+sin(1.37346)*(1270.2073-2077.2623)-1458.9505=-1099.56473

再参考一下代码中的算式:

tuple_cos (Phi3, Cos)
tuple_sin (Phi3, Sin)
a:= -Length1*Cos - Length2*Sin
b:= -Length1*Sin + Length2*Cos
x0=x+a
y0=y-b

我们需要一个旋转前的左上角坐标,这个坐标其实我们是知道的,看下面的推导

x=rx0-Length1
x-rx0=rx0-Length1-rx0=-Length1
y=ry0-Length2
y-ry0=ry0-Length2-ry0=-Length2
结果就是我们在代码里看到的:
a:= -Length1*Cos - Length2*Sin
b:= -Length1*Sin + Length2*Cos

推导大功告成!!!


依次类推,我们可以求出另外三个顶点的坐标位置。


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

作者: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