记录一个简单的算法问题

1.已知一个矩形的中心点坐标 旋转角度 长宽 求四个点的坐标

  • @param cx 旋转中心点 x 坐标
  • @param cy 旋转中心点 y 坐标
  • @param arrowAngle 旋转角度
  • @param scaleW 宽
  • @param scaleH 高
 //角度转换let X1, Y1, X2, Y2, X3, Y3, X4, Y4;let angle = (180-arrowAngle) * Math.PI / 180,back_left = {x: cx - scaleW / 2,y: cy + scaleH / 2,},back_right = {x: cx - scaleW / 2,y: cy - scaleH / 2,},front_left = {x: cx + scaleW / 2,y: cy + scaleH / 2,},front_right = {x: cx + scaleW / 2,y: cy - scaleH / 2,};//按逆时针或者顺时针旋转角度center.x后的四个点坐标X1 = (back_right.x - cx) * Math.cos(angle) - (back_right.y - cy) * Math.sin(angle) + cx;Y1 = (back_right.y - cy) * Math.cos(angle) + (back_right.x - cx) * Math.sin(angle) + cy;X2 = (back_left.x - cx) * Math.cos(angle) - (back_left.y - cy) * Math.sin(angle) + cx;Y2 = (back_left.y - cy) * Math.cos(angle) + (back_left.x - cx) * Math.sin(angle) + cy;X3 = (front_left.x - cx) * Math.cos(angle) - (front_left.y - cy) * Math.sin(angle) + cx;Y3 = (front_left.y - cy) * Math.cos(angle) + (front_left.x - cx) * Math.sin(angle) + cy;X4 = (front_right.x - cx) * Math.cos(angle) - (front_right.y - cy) * Math.sin(angle) + cx;Y4 = (front_right.y - cy) * Math.cos(angle) + (front_right.x - cx) * Math.sin(angle) + cy;back_right=[X2,Y2];back_left = [X1,Y1];front_left = [X3,Y3];front_right = [X4,Y4];return [back_left,back_right,front_left,front_right]```

2.已知四个点的坐标,求出中心点的坐标 旋转角度 长宽

fromWeb_x_y([back_left_d3xy,back_right_d3xy,front_left_d3xy,front_right_d3xy]){//矩形的高let xh = Math.abs(back_left_d3xy[0]-back_right_d3xy[0])let yh = Math.abs(back_left_d3xy[1]-back_right_d3xy[1])let height = Math.sqrt(Math.pow(xh,2)+Math.pow(yh,2))//矩形的宽let xw = Math.abs(back_left_d3xy[0]-front_left_d3xy[0])let yw = Math.abs(back_left_d3xy[1]-front_left_d3xy[1])let width = Math.sqrt(Math.pow(xw,2)+Math.pow(yw,2))//选两个点求旋转角度let tana = (front_right_d3xy[1] - back_left_d3xy[1]) / (front_right_d3xy[0] - back_left_d3xy[0])let angle = 180 * Math.atan(tana) / Math.PI//求中心点坐标let center_left_d3xy= [(back_left_d3xy[0]+back_right_d3xy[0])/2, (back_left_d3xy[1]+back_right_d3xy[1])/2]let center_right_d3xy= [(front_left_d3xy[0]+front_right_d3xy[0])/2, (front_left_d3xy[1]+front_right_d3xy[1])/2]let center_d3xy=[(center_left_d3xy[0]+center_right_d3xy[0])/2, (center_left_d3xy[1]+center_right_d3xy[1])/2]return {center_d3xy: center_d3xy,center_PhysicalXY: center_PhysicalXY,width: width,height: height,angle: angle}}

ps:
1.上边只是简单的转换
2.涉及浮点数的精确度问题,需要另外在计算中加入自己定义的浮点精度
3.涉及物理坐标和平面坐标的转换问题,在每次结果输出之前转换即可,切记注意两个坐标的y轴的方向差异
4.关于角度的象限问题,可在angle后面叠加具体判断

矩形中间点和四个顶点之前的转换问题相关推荐

  1. 把矩形的四个顶点按照一定的顺序排好(左上、右上、右下、左下,符合人的视角).

    /* *@ 作 用:把矩形的四个顶点按照一定的顺序排好(左上.右上.右下.左下,符合人的视角). * 因为图像坐标系Y正方向朝下的缘故,排序完成之后实际上左上点.右上点的图像Y坐标比较小. * 首先取 ...

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

    已经矩形的中心点.边长.phi求四个顶点的坐标 在halcon里面,类似gen_measure_rectangle2.smallest_rectangle2的算子表示任意角度的矩形. 其信息包括:矩形 ...

  3. Java黑皮书课后题第8章:*8.33(几何:多边形的子面积)一个具有四个顶点的凸多边形被分为4个三角形,编写一个程序,提示用户输入4个顶点的坐标,然后以升序显示四个三角形的面积

    *8.33(几何:多边形的子面积)一个具有四个顶点的凸多边形被分为4个三角形,编写一个程序,提示用户输入4个顶点的坐标,然后以升序显示四个三角形的面积 题目 题目描述与运行示例 破题 代码 题目 题目 ...

  4. 寻找凸四边形的四个顶点

    利用Opencv 寻找凸四边形的四个顶点   对于一个含有凸四边形的图像,要想定位出凸四边形的四个顶点的坐标.   首先,得先对图像进行边缘检测,而边缘检测的前提是二值化图像[未进行二值化的图像进行边 ...

  5. 第五章第四题(将英里转换成千米)(Conversion from mile to kilometer)

    第五章第四题(将英里转换成千米)(Conversion from mile to kilometer) 5.4(将英里转换成千米)编写程序,显示下面的表格(注意:1英里为1.609千米). 英里 千米 ...

  6. Android录屏并利用FFmpeg转换成gif(四) 将mp4文件转换成gif文件

    Android录屏并利用FFmpeg转换成gif(四) 写博客时经常会希望用一段动画来演示app的行为,目前大多数的做法是在电脑上开模拟器,然后用gif录制软件录制模拟器屏幕,对于非开发人员来讲这种方 ...

  7. matlab四节点矩形单元的应变,四节点矩形单元有限元解读.ppt

    四节点矩形单元有限元分析过程 Tianjin University 引入无量纲坐标: 四节点矩形单元有限元分析过程 Tianjin University 由几何方程可得单元应变场表达式: 可记为: 四 ...

  8. 通过矩形的中心坐标与原顶点坐标以及旋转角度计算矩形的旋转后4个顶点的位置...

    x2 = cos(q)(x1-x0) – sin(q)(y1-y0) + x0; y2 = sin(q)(x1-x0) + cos(q)(y1-y0) + y0; 其中,q表示矩形的旋转角度,x1表示 ...

  9. long(Long)与int(Integer)四种类型之间互相转换的方法分享

    最近开发的项目,里面的金额比较大,经常有long型 ,int型,那么他们之间怎么转换呢? 下文笔者将一一道来,如下所示: 一.将long型转化为int型,此处的long型是基础类型: long a = ...

最新文章

  1. 【怎样写代码】复杂对象的组装与创建 -- 建造者模式(五):关于Director的进一步讨论
  2. 详解 | SLAM回环检测问题
  3. ++和+的运算优先级和++i和i++混合用法解析
  4. java中迭代器要导包吗_java 中迭代器的使用方法详解
  5. 网上花店系统源码_如何创建一个花店线上商城,可以开发一个微信小程序
  6. Linux使用ftp传输10g的文件,Ubuntu 16.04 安装ftp服务器传输文件
  7. Flutter 实现微信摇一摇的功能 Flutter 加速度感应
  8. Hash Collision DoS 攻击
  9. Linux终端的概念
  10. python 多进程 阻塞_Python Pool类多进程 apply_async 异步变成了阻塞解决方法
  11. 极客大学架构师训练营 大数据可视化、机器学习、PageRank算法、KNN分类算法、贝叶斯分类算法、推荐引擎算法、感知机、神经网络 第26课 听课总结
  12. Pandas官方文档(中文版)Pdf
  13. ubuntu18.04 linux journalctl 命令
  14. Git之版本回退和分支合并
  15. 2021年中国CRM市场规模及市场格局分析:市场规模达156亿元[图]
  16. 从0开始使用QEMU模拟ARM开发环境之脚本制作分区镜像(rootfs+zImage+dtb)
  17. 什么是CART算法?怎么对CART进行建树?怎么对CART进行减枝叶?CART Python实现代码
  18. odoo第一次登录不进去,不知道用户名和密码
  19. 金山云CDN调度算法小结(1)
  20. 安卓日历每日提醒_Android实现每天定时提醒功能

热门文章

  1. Vscode的vue项目中下滑红线报错问题
  2. videojs重播_VideoJs使用总结
  3. GameFramework教程✨十七、数据表
  4. 666!你准备好和波士顿狗来场热舞了吗?
  5. 手机上的悬浮球这么好用,简直就是宝藏功能,难怪这么多人都在用
  6. 计算机图形学头歌实训平台——立方体三维观察
  7. LVS NAT模式配置实践
  8. IIS中应用程序池中的高级设置分析
  9. in 和exists 用法区别
  10. New Concept English3 Lesson 3. An unknown Goddess【精讲学习笔记】