判断一个点是否在矩形内部

2023-11-06

判断一个点是否在矩形内部

题目描述

在二维坐标系中,所有的值是double类型,那么一个矩形可以由四个点来代表,(x1, y1)为最左的点,(x2, y2)为最上的点,(x3, y3)为最下的点,(x4, y4)为最右的点。给定4个点代表的矩形,再给定一个点(x, y),判断(x, y)是否在矩形中

输入描述:

输入有五行,每行两个整数。
对于前四行,第i行的浮点数表示( x i , y i x_i, y_i xi,yi)
最后一行两个浮点数表示(x, y)

输出描述:

若(x, y)在矩形中,输出"Yes",否则输出"No"

示例1
输入
2.00 2.50
3.00 5.00
3.00 1.50
4.00 4.00
3.21 3.78
输出
Yes
示例2
输入
2.00 2.50
3.00 5.00
3.00 1.50
4.00 4.00
2333.33 2333333.33
输出
No
备注:

− 2 ∗ 1 0 10 ⩽ x i , y i , x , y ⩽ 2 ∗ 1 0 10 −2∗10^{10} \leqslant x_i,y_i,x,y \leqslant 2∗10^{10} 21010xi,yi,x,y21010
保证输入的顺序与题目描述相同


解法一:

书上的解法,若矩形与横纵坐标轴不平行,则进行旋转。假设旋转角度为 θ ,则坐标旋转公式为:
{ x ′ = x ∗ c o s θ + y ∗ s i n θ y ′ = y ∗ c o s θ − x ∗ s i n θ \left\{ \begin{aligned} x^{'} & = x*cosθ + y*sinθ \\ y^{'} & = y*cosθ - x*sinθ \end{aligned} \right. {xy=xcosθ+ysinθ=ycosθxsinθ
但是在计算 θ 的时候,需要用到开方,并且数据范围达到了 1 0 10 10^{10} 1010 。回想起17青岛网络赛某题,也是计算几何,也是 1 0 10 10^{10} 1010 范围,用 C++ 库函数 sqrt 直接 wa 了 63 发,换着法调精度,过早开始炼丹侠2333。。。最后换 java 才过。后来知道 sqrt 在 1 0 10 10^{10} 1010 左右会产生精度损失。。。同样的,这题如果用书上写法,最后一个测试数据过不了,我猜是因为精度问题。所以,写法中避免涉及到开方操作吧2333。。。

解法二:

叉积。只涉及到乘法和减法,相比较解法一,基本没啥精度损失。

关于向量叉积,有一个定理: 若 p1p0 和 p2p0 的叉积大于 0 ,说明 p1 在 p2 顺时针方向

于是我们可以依次判断:x1x2与x1x,x2x4与x2x,x4x3与4x,x3x1与x3x,若这四个叉积均大于 0 ,说明点在矩形内。

解法二代码:
#include <cstdio>

using namespace std;

double x[5], y[5];

inline double cross_product( int i, int j, int k ) {
    return (x[j] - x[i]) * (y[k] - y[i]) - (x[k] - x[i]) * (y[j] - y[i]);
}

void solve() {
    bool flag = false;
    if ( cross_product(0, 4, 1) > 0 && cross_product(1, 4, 3) > 0 && 
         cross_product(3, 4, 2) > 0 && cross_product(2, 4, 0) > 0 )
        puts("Yes");
    else puts("No");
}

int main(void) {
    for ( int i = 0; i < 5; ++i ) scanf("%lf%lf", x + i, y + i);
    solve();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

判断一个点是否在矩形内部 的相关文章

  • 鸿蒙笔记2

    常用基础组件 1 组件介绍 组件 Component 是界面搭建与显示的最小单位 HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件 我们可以使用这些组件轻松的编写出更加丰富 漂亮的界面 组件根据功能可以分为以下五
  • MongoDB数据库常用SQL命令

    1 db collection updateMany 修改集合中的多个文档 db getCollection user find pId 3332a512df604a74a72f267cf246 updateMany pId c8018dd
  • ES6 数组的扩展方法

    1 数组的方法 from of from 将伪数组转换成真正的数组 function add console log arguments es5中 将参数转换成数组 let arr slice call arguments console
  • 时间序列--残差分析

    残差 y yhat 一般我们就停止在这里了 但是如果残差表现的有某种形式 代表我们的模型需要进一步改进 如果残差表现的杂乱无章 代表确实没什么别的信息好提取了 现在用最naive的model 上一个时间的值 yhat看看残差表现吧 关于残差
  • 初识QT(二十)——Qt元对象和属性系统详解

    Qt 是一个用标准 C 编写的跨平台开发类库 它对标准 C 进行了扩展 引入了元对象系统 信号与槽 属性等特性 使应用程序的开发变得更高效 本节将介绍 Qt 的这些核心特点 对于理解和编写高效的 Qt C 程序是大有帮助的 Qt 的元对象系
  • http协议 git服务器,利用Nginx搭建HTTP访问的Git服务器

    利用Nginx搭建HTTP访问的Git服务器过程记录 搭建 Git 仓库 实现 SSH 协议 配合 Nginx 实现 HTTP 协议拉取 推送代码 利用 Nginx 实现 Gitweb 在线浏览代码 使用 Gitweb theme 更新默认
  • Super Egg Drop

    题目 出处 参考的解法 class Solution public int superEggDrop int K int N int memo new int K 1 N 1 return helper K N memo private i
  • 在javascript中,slice与splice的区别

    介绍 众所周知 Javascript中的数组是能够保存多个值的变量 我们有多种方法来处理数组 其中最常用的是 slice 和 splice 有时人们会混淆这两者 因此 在本博客中 我们将了解这两种方法以及它们之间的区别 Slice slic
  • Linux网络编程-客户端与服务器端通信

    Linux网络编程 客户端连接服务器端让我们已经看到了client与server之间是如何建立连接的 接下来介绍它们之间如何建立tcp协议交互通信 先看看服务器端代码 tcpserver c include
  • 15个经典面试问题及回答思路,知乎上转疯了!

    一 简介 Handler机制是一套Android消息传递机制 在Android开发多线程的应用场景中 将工作线程中需更新UI的操作信息 传递到 UI主线程 从而实现 工作线程对UI的更新处理 最终实现异步消息的处理 在Android开发中
  • Linux 初始组(主组)和附加组详解

    Linux 初始组 主组 和附加组详解 介绍 在Linux系统中 每个用户都有一个主组和多个附加组 初始组 主组 是用户创建后默认分配的组 而附加组则可以根据需要进行添加或删除 本文将介绍Linux系统中初始组 主组 和附加组的方法 并探讨
  • tar.xz文件如何解压

    创建或解压tar xz文件的方法 习惯了 tar czvf 或 tar xzvf 的人可能碰到 tar xz也会想用单一命令搞定解压或压缩 其实不行 tar里面没有征对xz格式的参数比如 z是针对 gzip j是针对 bzip2 创建tar
  • vue el-table 树形数据懒加载每次点击子集父级只展示一行

    功能需求 每次只打开一个同级数据节点展开 之前展开的自动收起 ps 找了好久都没有找到完全符合需求的组件 展示效果 vue el table 数据懒加载实现每次子集只展示一行 实现代码 模板 使用load配合expand change使用
  • IDEA创建SpringBoot无法连接https://start.spring.io

    解决办法 将网址改成 http start spring io
  • 小白学股票基金_4_ETF

    ETF Exchange Traded Funds 中文名称为交易型开放式指数基金 是一种在交易所上市交易的开放式指数基金 兼具股票 开放式指数基金及封闭式指数基金的优势 属于高效的指数化投资工具 也就是说 如果我们买一手科技ETF 就可以
  • Intellij IDEA使用技巧,去掉拼写检查和unused提示

    在setting里面搜索spell将其中的拼写检查的 号去掉 搜索never used 关键字将其中的unused的检查去掉
  • 模块化软件设计

    模块化的基本原理 模块化 Modularity 是在软件系统设计时保持系统内各部分相对独立 以便每一个部分可以被独立地进行设计和开发 这个做法背后的基本原理是关注点的分离 SoC Separation of Concerns 关注点的分离在
  • 第5天-[21天学Python]-Python中自定义函数及调用的方法

    本章内容主要包括 声明函数 调用自定义函数 变量作用域 各种类型的函数参数应用 使用lambda建立匿名函数 Python其他常用内建函数 1 使用函数 1 1 声明函数 在python中 函数必须先声明 然后才能调用它 使用函数时 只要按

随机推荐

  • Multisim14.0仿真(八)LM555制作流水灯

    一 仿真原理图 二 仿真运行效果
  • mysql-数据页结构

    数据页结构 数据删除后记录并没有马上被删除 而是被打上了删除标记 并被记录到一个垃圾链表中 之后若有新纪录来 它们则可能覆盖被删除的记录占用的存储空间 页内数据组成单向链表 且再次进行了分组 每组最后一条数据顺序存储在靠近页尾部的地方 这种
  • react-jsx语法上使用switch匹配不同渲染组件

    这里主要讲的是jsx语法使用switch 的js语句 一般jsx语法执行的是简单的运算和三元表达式 如果想要执行条件判断如if语句和switch语句以及函数等 直接使用是会报错的 这里应该使用函数立即执行的语法写法 如果需要根据不同判断渲染
  • 关于javascript中的函数作用域

    var scope global function f alert log scope 输出 undefined 而不是 global var scope local 变量在这里赋初值 单变量本身在函数体内任何地方军事有定义的 consol
  • vue配置页面预渲染(将页面静态化,便于seo读取)

    在项目中安装prerender spa plugin npm install save prerender spa plugin 找到bulid目录下的webpack prod conf js文件 在其中写入以下内容 在文件的上方写入 co
  • tensorflow学习笔记(四)

    代码学习有点吃力 学习了YOLOv1的代码 主要是训练部分的代码 对yolo的又有了进一步的理解 其文件夹下主要包含py文件为 train py yolo net py pascal voc 下面是比较详细的代码解读 但是还是有一些内容理解
  • 《曾国藩家书》读书手记(修身篇二)

    致诸弟 劝弟谨记进德修业 吾人只有进德 修业两事靠得住 进德 则孝弟仁义是也 修业 则诗文作字是也 这个是说进德修业是很重要的东西 这两个东西是越积累越多的 只增不减的 致诸弟 劝弟切勿恃才傲物 故吾人用功 力除傲气 力戒自满 毋为人所冷笑
  • 基于PaddleOCR开发Auto.js Pro文字识别插件

    目录 目的 准备工作 插件开发 1 项目结构对比 2 插件SDK集成 3 调整assets资源 4 删除无用的Activity文件 5 修改AndroidManifest xml 6 修改Predictor文件 7 修改包名 8 新建OCR
  • 从零开始的Python机器学习指南(二)——监督学习之OLS回归

    介绍 本博客将结合样例介绍监督学习 Supervised Learning SL下的第一大分支 回归 Regression 开始前的准备 开始前 请先确保你的python环境中有以下包 pandas numpy sklearn 本文的所有代
  • 矩阵论(五)——矩阵分析

    矩阵论 五 矩阵分析 1 向量范数 2 矩阵范数 3 向量序列与矩阵序列的极限 3 1 向量序列的极限 3 2 矩阵序列的极限 4 矩阵幂级数 1 向量范数 向量范数 x V forall x in V x V
  • 万字长文,梳理清楚Python多线程与多进程!

    作者丨钱魏Way 来源 https www biaodianfu com python multi thread and multi process html 在学习Python的过程中 有接触到多线程编程相关的知识点 先前一直都没有彻底的
  • 细说MVC、桌面客户端应用软件和WPF

    MVC开发框架相比较于类似ASP这种翻译脚本语言来讲 已经让广大的Web开发者有了足够的兴奋点 它使得Web开发更加简单和规范 那么接下来的桌面应用软件呢 Kevin Hoffman在Cocoa下的MVC框架和WPF的嵌入式开发有很好的经验
  • 多线程(六)-sleep和wait方法的区别

    目录 一 sleep和wait方法的区别 二 wait方法 wait方法的使用 wait 结束等待的条件 三 notify和notifyAll方法 notify 方法只是唤醒某一个等待的线程 notifyAll方法可以一次唤醒所有的等待线程
  • 美团团购订单系统优化记

    美团团购订单系统优化记 团购订单系统简介 美团团购订单系统主要作用是支撑美团的团购业务 为上亿美团用户购买 消费提供服务保障 2015年初时 日订单量约400万 500万 同年七夕订单量达到800万 目标 作为线上S级服务 稳定性的提升是我
  • websocketpp的使用和boost库的交叉编译

    最近使用嵌入编程时需要使用websocket 在github上查找开源库时 主要有两个库点赞比较高的 其中一个是websocketpp这个库 此库需要使用boost库进行编译 所以本文章主要介绍boost库的交叉编译和在程序中使用webso
  • wesome-android

    awesome android Introduction android libs from github System requirements Android Notice If the lib is no longer being m
  • MFC使控件失去焦点的方法

    转自 http newthnote blogbus com logs 67403982 html 1 SetFocus另外一个控件 GetDlgItem 另一个控件名 gt SetFocus 2 给要失去焦点的控件发WM KILLFOCUS
  • 使用Spring Security的多租户应用程序的无状态会话

    从前 我发表了一篇文章 解释了构建无状态会话的原理 巧合的是 我们再次针对多租户应用程序执行同一任务 这次 我们将解决方案集成到Spring Security框架中 而不是自己构建身份验证机制 本文将解释我们的方法和实现 业务需求 我们需要
  • 联想原生系统恢复工具F11 安装方法

    因为种种原因 联想笔记本或电脑被二次格式化分区重装系统 导致丢失原生恢复系统恢复工具 F11 即菜单启动F11变成了F12按钮 即原正版授权变成了盗版系统 想恢复原生系统 官方其实提供了方法 联想USB Recovery Creator是一
  • 判断一个点是否在矩形内部

    判断一个点是否在矩形内部 题目描述 在二维坐标系中 所有的值是double类型 那么一个矩形可以由四个点来代表 x1 y1 为最左的点 x2 y2 为最上的点 x3 y3 为最下的点 x4 y4 为最右的点 给定4个点代表的矩形 再给定一个