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

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

其信息包括:矩形中心点 row,column

矩形角度 Phi

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

如下图所示:

(图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)

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

(图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坐标其实是负值。

(图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度的矩形。

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

(图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

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

#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。如果需要本贴图片源码等资源,请向勇哥索取。

收藏 | 0点赞 | 0打赏作者

求矩形中心点坐标编程c语言,三角函数在图形学里的应用(四) ​已知矩形的中心点、边长、phi求四个顶点的坐标...相关推荐

  1. (海伦公式)已知三角形三条边长,求面积

    (海伦公式)已知三角形三条边长,求面积 海伦公式:  S=(△)=√[p(p-a)(p-b)(p-c)]  其中p是三角形的周长的一半p=(a+b+c)/2. ----以下转自百度百科-------- ...

  2. java 三边求面积_已知三角形的三边长如何求面积?

    展开全部 各类三角形求面积方式如下所示: 1.已知e69da5e6ba9062616964757a686964616f31333365666264三角形底a,高h,则 S=ah/2 2.已知三角形三边 ...

  3. JAVA三角海伦公式_(海伦公式)已知三角形三条边长,求面积

    传说是古代的叙拉古国王 希伦(Heron,也称海龙)二世发现的公式,利用三角形的三条边长来求取三角形面积.但根据Morris Kline在1908年出版的著作考证,这条公式其实是阿基米德所发现,以托希 ...

  4. C语言编程b a化简,C语言编程,已知三角形的三边长a,b,c,计算求三角... 如果三角形三边长 a,b,c,满足( )那么这个三角形......

    导航:网站首页 > C语言编程,已知三角形的三边长a,b,c,计算求三角... 如果三角形三边长 a,b,c,满足( )那么这个三角形... C语言编程,已知三角形的三边长a,b,c,计算求三角 ...

  5. 【C#】已知圆心上的三点求圆心

    已知圆心上的三点:,, ,求圆心: 把三点坐标圆的方程: 得: 把  展开整理得: 令 ; ; , , ,  求 求 把  移项整理得: 把  移项整理得: 还原代入式子: 整理结果 简化: 其中: ...

  6. 在平面内,已知矩形的中心点坐标、长、宽和倾斜角度,求矩形四个角点的坐标

    实现思路: 1.已知矩形的中心点坐标.长和宽,求矩形在不旋转的情况下矩形的四个顶点坐标: 2.再求按逆时针旋转一定角度后的四个点坐标: (在平面内,已知一个矩形的四个角坐标,将矩形绕中心点转动一个角度 ...

  7. 已知矩形的宽和高以及与x轴夹角,求对边的两条边的中心坐标

    目录 问题描述: 解决方案: 编程测试 问题描述: 问题描述:矩形的一个顶点在原点,已知矩形的宽度W以及高度H,以及矩形和X轴方向的夹角角度angle,求离原点较远的两条边的中心坐标点.P(x,y)以 ...

  8. 小程序转盘抽奖,已知圆心、半径、角度求圆上点的坐标

    因公司的需求,要在小程序语音房内部迭代一个真心话大冒险的功能,也等同于幸运转盘: 业务场景: 发送一个socket,拿到响应的结果,根据返回的数值开始启动幸运转盘,由于转盘上的人数不是固定的,所以要根 ...

  9. 已知无人机姿态信息,以及图像上的像点坐标,怎么求像点对应的三维坐标

    如果已知无人机姿态信息(也就是无人机的位置和朝向)以及图像上的像点坐标,那么可以使用立体视觉的方法来求出像点对应的三维坐标. 具体来说,首先要将无人机的姿态信息转化为摄像头的欧拉角(或欧拉角加平移向量 ...

最新文章

  1. 页面传值-laber
  2. mysql 2.71828_数学中的e=2.71828……到底是什么东西?
  3. php算法台阶,php如何解决青蛙跳台阶的问题(代码)
  4. 大数据笔记11:MapReduce的运行流程
  5. SQL Server安装文件挂起错误解决办法【转帖】
  6. 行为型模式:解释器模式
  7. session过期返回登录页面跳出frame
  8. 台积电2nm工艺有望2023年风险试产 次年大规模投产
  9. 51单片机PWM程序详解
  10. python阅读wtfbook疑问和验证
  11. SQL数据库有密码的话,就会弹出那个对话框
  12. RS232串口MODBUS协议工业读写器读卡器配置软件|工具的功能与界面说明
  13. 数据结构 javascript 描述[Data-Structure described byJavaScript]
  14. AAM(Active Appreance Model)算法用于人脸识别总结
  15. RFID MFRC522
  16. obj文件格式与mtl文件格式
  17. 盘点系列:一览2022卡塔尔世界杯最全黑科技
  18. 尼尔森十大易用性原则驱动的测试
  19. R语言实战-第八章 R in action-chapter8
  20. 学习NLP的第9天——基于HanLP实现的拼音转换

热门文章

  1. 电池的安规认证(IEC/EN)和航空运输认证UN38.3
  2. it巨头的组织架构图
  3. linux git@ permission deny 问题
  4. 《那些年我们一起追过的女孩》你真的看懂了吗?
  5. MySQL 常用函数 2022/09/06
  6. lseek illegal seek不能使用 linux 串口,lseek-lseek
  7. linux lseek 指定 文件大小,Linux lseek函数的使用详解
  8. 教你用PS快速制作图章,你也可以拥有专属于自己的图章
  9. 吃透Java IO:字节流、字符流、缓冲流
  10. numpy的Y.shape和Y.shape[0]的区别