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

news2024/9/20 13:17:16

        考虑一个矩形 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 个角的坐标。 

下面是实现过程:

# Python3 program to find corner points of
# a rectangle using given length and middle
# points.
import math
 
# Structure to represent a co-ordinate point
class Point:
     
    def __init__(self, a = 0, b = 0):
         
        self.x = a
        self.y = b
   
# This function receives two points and length
# of the side of rectangle and prints the 4
# corner points of the rectangle
def printCorners(p, q, l):
     
    a, b, c, d = Point(), Point(), Point(), 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
        m = (p.x - q.x) / (q.y - p.y)
         
        # Calculate displacements along axes
        dx = (l / math.sqrt(1 + (m * m))) * 0.5
        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
         
    print(int(a.x), ", ", int(a.y), sep = "")
    print(int(b.x), ", ", int(b.y), sep = "")
    print(int(c.x), ", ", int(c.y), sep = "")
    print(int(d.x), ", ", int(d.y), sep = "")
    print()
     
# Driver code
p1 = Point(1, 0)
q1 = Point(1, 2)
printCorners(p1, q1, 2)
 
p = Point(1, 1)
q = Point(-1, -1)
printCorners(p, q, 2 * math.sqrt(2))
 
# This code is contributed by shubhamsingh10 

输出: 

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

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

时间复杂度: O(1) 

辅助空间: O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能在病理组学和精准医疗中的最新研究进展|顶刊速递·24-09-05

小罗碎碎念 本期推文主题:AI病理精准医疗 这段时间一直在尝试不同的学习道路,兜兜转转还是觉得,每天跟踪最新文献其实是很有必要的,并且这些最新的文献不一定非要与自己专业完全匹配,不然就会把自己困住。 这期推文和…

文章润色太费时?试试这5款ai写作工具

你是否曾梦想拥有一个私人编辑,随时随地帮你打磨文字,让写作变得既轻松又专业? 告诉你一个好消息,现在有5款AI写作工具,它们就拥有这样的能力!这些AI助手擅长润色文章,优化语法,甚至…

微信小程序使用nfc读取

** 微信小程序开发nfc读取 ** &#xff08;注释微信官方api&#xff0c;仅支持安卓&#xff0c;不支持苹果ios&#xff09;官方文档 上代demo <template><div class"nfc"><u-navbar leftIcon"arrow-leftward" bgColor"#ffffff&qu…

网络安全服务基础Windows--第12节-域与活动目录

工作组 在Windows环境中配置⼯作组相对简单&#xff0c;适合⼩型⽹络环境&#xff0c;如家庭或⼩型办公室⽹络。⼯作组通过简单的⽹络共享和本地管理来实现资源共享&#xff0c;⽽不依赖于中央控制的服务器。 ● 定义&#xff1a;⼯作组是⼀种对等⽹络模型&#xff0c;在这种…

ASP源码 发布站改制最终版 原来3000ok网通大站的源程序

ASP源码 新服发布站改制最终版 原来3000ok网通大站的源程序 这个是非常完整 兼容性很强的。 后台地址&#xff1a;http://你的域名/admin 账号&#xff1a;admin 密码&#xff1a;admin 会员发布地址&#xff1a;http://你的域名/gamevip 源码下载&#xff1a;https://downlo…

【网络安全】IIS未授权访问敏感数据

未经许可,不得转载。 文章目录 正文攻击方法正文 IIS 是 Internet Information Services 的缩写,是微软开发的一个基于 Windows 的 Web 服务器。 HAProxy 是一个知名的高性能负载均衡器和代理服务器。它通常用于将流量分发到多个后端服务器,常与 Web 服务器(包括 IIS)一…

智匠MindCraft:一站式AI模型API调用平台

智匠MindCraft提供了一站式的AI模型解决方案&#xff0c;通过单一API接口&#xff0c;用户可以轻松调用多种主流AI模型&#xff0c;涵盖大语言模型、图片生成、视频生成、语音识别和语音合成等多个领域。以下是该平台的详细介绍&#xff1a; 1、平台概览 主页访问&#xff1a…

基于Qt设计的人脸课堂考勤机系统(219)

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能1.2 设计思路【1】系统架构设计【2】流程设计【3】关键技术实现【2】整体构架1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】项目背景1.4 开发工具的选择1.5 系统框架图1.6 系统功…

How to apply streaming in azure openai dotnet web application?

题意&#xff1a;"如何在 Azure OpenAI 的 .NET Web 应用程序中应用流式处理&#xff1f;" 问题背景&#xff1a; I want to create a web api backend that stream openai completion responses. "我想创建一个 Web API 后端&#xff0c;用于流式传输 OpenAI…

计算机领域学术会议(ICCBD+AI 2024)

第五届计算机、大数据与人工智能国际会议&#xff08;ICCBDAI 2024&#xff09;将于2024年11月1日-3日在江西景德镇召开。 本届会议由景德镇陶瓷大学主办&#xff0c;西安交通大学、暨南大学、南京邮电大学、景德镇学院、ELSP&#xff08;爱迩思出版社&#xff09;、ESBK国际学…

《中国储运》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《中国储运》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《中国储运》级别&#xff1f; 答&#xff1a;国家级。主管单位&#xff1a; 中储发展股份有限公司 主办单位&…

Openwrt远程唤醒Windows

OpenWrt 安装 luci-app-wol 安装 luci-app-wol&#xff0c;按下一节配置好Windows和主板。 电脑设置 参考 主板BIOS如何设置启用网络唤醒(WOL: Wake On Lan)功能远程唤醒远程控制——Windows 注意 关闭 “电源选项”下“电源按钮”的“启用快速启动”

微软的Teams只有会议号和密码怎么参会呢

客户只给了个会议邀请的截图&#xff0c;没有办法获取直接的参会链接&#xff0c;只能通过图上的会议号码和密码来进入会议&#xff0c;如果这样必须要先登录&#xff0c;但我不想登录怎么办呢&#xff1f; 可以通过以下链接来实现&#xff1a; https://www.microsoft.com/zh-c…

苹果永久删除的照片怎么恢复?这里有你需要的答案,秘籍大公开

“苹果手机里面的照片删除了怎么办&#xff1f;”相信您的第一反应一定是冲去最近删除的文件夹里&#xff0c;只需要轻轻一点就能恢复照片。但有时&#xff0c;我们已经将最近删除文件夹里的照片给清空了&#xff0c;又或者删除时间超过30天了。这时&#xff0c;苹果永久删除的…

解决 Android 上的 .NET MAUI/Xamarin.AndroidX 应用调用 ASP.NET Core API 端点时 SSL 连接被拒绝的问题

从虚拟机调用本地API报各种 SSL 连接不上的错误&#xff0c;这给本地调试造成了极大的不便&#xff0c;在被这个问题困扰了多日以后&#xff0c;终于在GitHub上找到答案 基于这个 帖子 &#xff0c;有一个回复 他写了一个帮助类&#xff0c;专门用来调试本地的API&#xff0c;…

002:显示DICOM图像(替换掉 vtkImageViewer2 )

VTK 医学图像处理---DICOM图像显示 对第一个DICOM显示例子的展开&#xff08;替换掉vtkImageViewer2类&#xff09; 两个例子实现的效果对比&#xff0c;其中右侧是对第一个例子展开后的显示效果&#xff0c;展示了一个完整的VTK渲染管线的过程。 目录 VTK 医学图像处理---DIC…

项目文章|PNAS:中国农大田见晖教授团队揭示DNA甲基化保护早期胚胎线粒体基因组稳定性

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 在早期哺乳动物胚胎中&#xff0c;线粒体氧化代谢增强是着床后生存和发育的重要特征&#xff1b;着床前期的线粒体重塑是正常胚胎发生的关键事件。在这些变化中&#xff0c;氧化磷酸化&a…

Java学习中如何分辨 = 和 == 及其使用方法

在学习Java编程语言时&#xff0c; 和 是两个非常基础的运算符&#xff0c;虽然它们看起来相似&#xff0c;但在语义和应用场景上却有明显的区别。理解并正确使用这两个符号对于编写正确且高效的Java代码至关重要。 1. 运算符&#xff1a;赋值运算符 在Java中是赋值运算符&a…

”wait”和“notify”为什么要在Synchronized代码块里面?

wait和notify用来实现多线程之间的协调&#xff0c;wait表示让线程进入到阻塞状态&#xff0c;notify表示让阻塞的线程唤醒。 wait和notify必然是成对出现的&#xff0c;如果一个线程被wait()方法阻塞&#xff0c;那么必然需要另外一个线程通过notify()方法来唤醒这个被阻塞的…

作为技术Leader如何带散一个团队

theme: channing-cyan 大家好&#xff0c;我是程序员凌览。 这个话题本身就很有趣——如何有效地带散一个团队&#xff0c;精选了两位网友的回答让我们一起来看看。 第一位网友的回答 1938年10月14日&#xff0c;毛泽东谈了如何把团队带好。你反着来&#xff0c;肯定能把团…