当前位置: 首页 > news >正文

Javascript 使用中点查找矩形的角(Find Corners of Rectangle using mid points)

         考虑一个矩形 ABCD,我们给出了边 AD 和 BC 中点(分别为 p 和 q)的坐标以及它们的长度 L(AD = BC = L)。现在给定参数,我们需要打印 4 个点 A、B、C 和 D 的坐标。

例子: 

输入:p = (1, 0)
        q = (1, 2)
        L = 2

输出:(0,0),(0,2),(2,2),(2,0)

解释:

打印的点形成一个矩形,

满足输入约束。

输入:p = (1, 1)
        q = (-1, -1)
        L = 2*sqrt(2)

输出:(0,2),(-2,0),(0,-2),(2,0)

从问题陈述中可能出现 3 种情况:  

矩形是水平的,即 AD 和 BC 平行于 X 轴

矩形是垂直的,即 AD 和 BC 平行于 Y 轴

矩形与轴线呈一定角度倾斜

        前两种情况很简单,使用基本几何学就可以轻松解决。对于第三种情况,我们需要应用一些数学概念来找到点。

        为了清楚起见,请考虑上图。我们有 p 和 q 的坐标。因此,我们可以找到 AD 和 BC 的斜率(因为 pq 垂直于 AD)。一旦我们有了 AD 的斜率,我们就可以找到通过 AD 的直线方程。现在我们可以应用距离公式来获得沿 X 轴和 Y 轴的位移。 

如果 AD 的斜率 = m,则 m = (px- qx)/(qy- py)

以及沿 X 轴的位移,dx = L/(2*sqrt(1+m*m))

类似地,dy = m*L/(2*sqrt(1+m*m))

现在,我们可以通过简单地加减相应获得的位移来找到 4 个角的坐标。 

下面是实现过程:

// Javascript program to find corner points of 
// a rectangle using given length and middle 
// points. 
 
// Structure to represent a co-ordinate point 
class Point 
{
    constructor(a,b)
    {
        this.x=a;
        this.y=b;
    }
}
 
// This function receives two points and length 
    // of the side of rectangle and prints the 4 
    // corner points of the rectangle 
function printCorners(p,q,l)
{
    let a = new Point(), b = new Point(),
                c = new Point(), d = new Point();
   
        // horizontal rectangle 
        if (p.x == q.x) 
        {
            a.x =  (p.x - (l / 2.0));
            a.y = p.y;
   
            d.x =  (p.x + (l / 2.0));
            d.y = p.y;
   
            b.x =  (q.x - (l / 2.0));
            b.y = q.y;
   
            c.x =  (q.x + (l / 2.0));
            c.y = q.y;
        } 
        // vertical rectangle 
        else if (p.y == q.y)
        {
            a.y = (p.y - (l / 2.0));
            a.x = p.x;
   
            d.y = (p.y + (l / 2.0));
            d.x = p.x;
   
            b.y = (q.y - (l / 2.0));
            b.x = q.x;
   
            c.y = (q.y + (l / 2.0));
            c.x = q.x;
        } 
        // slanted rectangle 
        else
        {
            // calculate slope of the side 
            let m = (p.x - q.x) / (q.y - p.y);
   
            // calculate displacements along axes 
            let dx =  ((l / Math.sqrt(1 + (m * m))) * 0.5);
            let dy = m * dx;
   
            a.x = p.x - dx;
            a.y = p.y - dy;
   
            d.x = p.x + dx;
            d.y = p.y + dy;
   
            b.x = q.x - dx;
            b.y = q.y - dy;
   
            c.x = q.x + dx;
            c.y = q.y + dy;
        }
   
        document.write(a.x + ", " + a.y + " <br>"
                + b.x + ", " + b.y + "<br>"
                + c.x + ", " + c.y + " <br>"
                + d.x + ", " + d.y + "<br>");
}
 
// Driver code 
let p1 = new Point(1, 0), q1 = new Point(1, 2);
printCorners(p1, q1, 2);
 
let p = new Point(1, 1), q = new Point(-1, -1);
printCorners(p, q,  (2 * Math.sqrt(2)));
 
// This code is contributed by rag2127 

输出: 

0,0
0、2
2,2
2,0

0、2
-2,0
0、-2
2,0

时间复杂度: O(1) 

辅助空间: O(1)

http://www.lryc.cn/news/431255.html

相关文章:

  • 【困难】 猿人学web第一届 第18题 jsvmp 洞察先机
  • IDEA Maven 源修改为国内阿里云镜像的正确方式
  • OpenCV 旋转矩形边界
  • 人车防撞系统安全生产方案
  • 开放式耳机哪个牌子好?长文传授6招秘籍,彻底远离坑货!
  • vue2和vue3双向绑定的原理
  • 别为大文件烦恼!mp4文件太大怎么变小?3个管用方法
  • cocotb的接收和发送逻辑,还是没有弄明白
  • XXL-JOB调度中心与执行器
  • Notepad++ 8.6.9 (代码编辑) 绿色版
  • 【例003】利用MATLAB绘制有趣平面图形
  • Ignis公链探索生态建设新范式:产业区块链与GameFi双轨驱动
  • 河南测绘资质申请中的技术装备需求
  • 如何使用C# 读写西门子PLC
  • 反向沙箱-安全上网解决方案
  • 尚品汇-延迟插件实现订单超时取消(四十五)
  • 欺诈文本分类检测(十一):LLamaFactory多卡微调
  • SprinBoot+Vue健康管管理微信小程序的设计与实现
  • C++基础类容详解
  • python基础(16面试题附答案一)
  • Leetcode3256. 放三个车的价值之和最大 I
  • Redis中String类型的基本命令
  • 2024 年高教社杯全国大学生数学建模竞赛题目【A/B/C/D/E题】完整思路
  • HR招聘新员工,如何考察企业文化适配度
  • AI算力「搅局」座舱SoC
  • lvs DR模式调试
  • Java线程池的优化策略与最佳实践
  • android面试:解释一下 AsyncTask是什么?
  • Django+Vue3前后端分离学习(四)(登录功能实现)
  • 机器学习面试:SVM为什么使用对偶函数求解?