判断任意一点是否在矩形内(矩形可能与坐标轴有一定夹角)

这篇具有很好参考价值的文章主要介绍了判断任意一点是否在矩形内(矩形可能与坐标轴有一定夹角)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 理论方法

1.1 点乘实现理论

  • 问题

如何判断点 P P P是否在被 P 1 P 2 P 3 P 4 P_1P_2P_3P_4 P1P2P3P4四个点围成的矩形框内?

  • 方法

如果在矩形内:点 P P P与矩形4个角的连线与任意轴形成的夹角都为锐角。可以用向量的点乘判断角度是否为锐角。具体方法如下图所示。

判断任意一点是否在矩形内(矩形可能与坐标轴有一定夹角)
所以可以通过下列公式判断:

点 P 位 于 矩 形 框 内 ⇔ { ∠ P P 1 P 4 < 90 ∠ P P 1 P 2 < 90 ∠ P P 3 P 4 < 90 ∠ P P 3 P 2 < 90 ⇔ { P 1 P ⇀ ∗ P 1 P 4 ⇀    > 0 P 1 P ⇀ ∗ P 1 P 2 ⇀    > 0 P 3 P ⇀ ∗ P 3 P 4 ⇀    > 0 P 3 P ⇀ ∗ P 3 P 2 ⇀    > 0 点P位于矩形框内\Leftrightarrow{\left\{\begin{array}{l}\angle PP_1P_4<90\\\angle PP_1P_2<90\\\angle PP_3P_4<90\\\angle PP_3P_2<90\end{array}\right.}\Leftrightarrow{\left\{\begin{array}{l}\overset\rightharpoonup{P_1P}\ast\overset\rightharpoonup{P_1P_4}\;>0\\\overset\rightharpoonup{P_1P}\ast\overset\rightharpoonup{P_1P_2}\;>0\\\overset\rightharpoonup{P_3P}\ast\overset\rightharpoonup{P_3P_4}\;>0\\\overset\rightharpoonup{P_3P}\ast\overset\rightharpoonup{P_3P_2}\;>0\end{array}\right.} PPP1P4<90PP1P2<90PP3P4<90PP3P2<90P1PP1P4>0P1PP1P2>0P3PP3P4>0P3PP3P2>0

1.2 叉乘实现理论

只需要判断点 P P P是否在上下两条边和左右两条边之间就可以,判断一个点是否在两条线段之间夹着,可以使用叉乘来判断,当 ( P 1 P 2 × P 1 P ) ∗ ( P 3 P 4 × P 3 P ) > = 0 (P_1P_2\times P_1P)\ast(P_3P_4\times P_3P)>=0 (P1P2×P1P)(P3P4×P3P)>=0时,说明点 P P P P 1 P 2 P_1P_2 P1P2 P 3 P 4 P_3P_4 P3P4的中间。同理判断两边即可。所以点 P P P在矩形内的条件为:
( P 1 P 2 × P 1 P ) ∗ ( P 3 P 4 × P 3 P ) > = 0      a n d      ( P 2 P 3 × P 2 P ) ∗ ( P 4 P 1 × P 4 P ) > = 0 (P_1P_2\times P_1P)\ast(P_3P_4\times P_3P)>=0\;\;and\;\;(P_2P_3\times P_2P)\ast(P_4P_1\times P_4P)>=0 (P1P2×P1P)(P3P4×P3P)>=0and(P2P3×P2P)(P4P1×P4P)>=0

2. 代码实现

2.1 点乘方法实现

#include<iostream>
struct MPoint
{
    double x;
    double y;
};
struct RectPoint
{
    MPoint p1;
    MPoint p2;
    MPoint p3;
    MPoint p4;
};
bool isPointInRect(MPoint p, RectPoint rect)
{
    if ((rect.p1.x - p.x) * (rect.p1.x - rect.p4.x) + (rect.p1.y - p.y) * (rect.p1.y - rect.p4.y) < 0)
        return false;
    if (((rect.p1.x - p.x) * (rect.p1.x - rect.p2.x) + (rect.p1.y - p.y) * (rect.p1.y - rect.p2.y)) < 0)
        return false;
    if (((rect.p3.x - p.x) * (rect.p3.x - rect.p4.x) + (rect.p3.y - p.y) * (rect.p3.y - rect.p4.y)) < 0)
        return false;
    if (((rect.p3.x - p.x) * (rect.p3.x - rect.p2.x) + (rect.p3.y - p.y) * (rect.p3.y - rect.p2.y)) < 0)
        return false;
    return true;
}
int main(int argc,char *argv[])
{
    RectPoint rect;
    MPoint p;
    //添加矩形框点
    rect.p1.x = 1;
    rect.p1.y = 0;
    
    rect.p2.x = -1;
    rect.p2.y = 0;
    
    rect.p3.x = 0;
    rect.p3.y = 1;
    
    rect.p4.x = 0;
    rect.p4.y = -1;

    p.x = 0.5;
    p.y = 0.5;
    std::cout<<"("<<p.x<<", "<<p.y<<")"<<"是否在矩形框内:"<<std::boolalpha<<isPointInRect(p, rect)<<std::endl;//1 or 0 use noboolalpha
    p.x = 0.5;
    p.y = 3.0;
    std::cout<<"("<<p.x<<", "<<p.y<<")"<<"是否在矩形框内:"<<std::boolalpha<<isPointInRect(p, rect)<<std::endl;//1 or 0 use noboolalpha
    
    return 1;
}

输出:

(0.5, 0.5)是否在矩形框内:true
(0.5, 3)是否在矩形框内:false

2.2 叉乘方法实现

#include <iostream>

struct Point
{
	float x;
	float y;
	Point(float x, float y)
	{
		this->x = x;
		this->y = y;
	}
};
// 计算 |p1 p2| X |p1 p|
float GetCross(Point &p1, Point &p2, Point &p)
{
	return (p2.x - p1.x) * (p.y - p1.y) - (p.x - p1.x) * (p2.y - p1.y);
}
bool IsPointInMatrix(Point &p)
{
	Point p1(0, 5);
	Point p2(0, 0);
	Point p3(5, 0);
	Point p4(5, 5);

	return GetCross(p1, p2, p) * GetCross(p3, p4, p) >= 0 && GetCross(p2, p3, p) * GetCross(p4, p1, p) >= 0;
}
using namespace std;
int main(int argc, char *argv[])
{
	Point testPoint(3, 4);

	cout << "the point is " << (IsPointInMatrix(testPoint) ? "in the Matrix ." : "not in the matrix .") << endl;

	testPoint.x = 5;
	testPoint.y = 34;
	cout << "the point is " << (IsPointInMatrix(testPoint) ? "in the Matrix ." : "not in the matrix .") << endl;
	return 0;
}

输出:

the point is in the Matrix .
the point is not in the matrix .

参考:https://blog.csdn.net/weixin_43619346/article/details/107513919?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163611842416780271588491%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=163611842416780271588491&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-107513919.first_rank_v2_pc_rank_v29&utm_term=%E5%88%A4%E6%96%AD%E4%B8%80%E4%B8%AA%E7%82%B9%E6%98%AF%E5%90%A6%E5%9C%A8%E7%9F%A9%E5%BD%A2%E5%86%85&spm=1018.2226.3001.4187文章来源地址https://www.toymoban.com/news/detail-485604.html

到了这里,关于判断任意一点是否在矩形内(矩形可能与坐标轴有一定夹角)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第六章、坐标轴的定制

    6.1、坐标轴概述 在绘制图表过程中,matplotlib会根据所绘图表的类型决定是否使用坐标系,或者显示哪种类型的坐标系。 坐标轴的结构相同,主要包括轴脊、刻度,其中刻度又可以细分为刻度线和刻度标签,刻度线又可以细分为主刻线和次刻线。坐标轴的各部分均是matplotli

    2024年02月06日
    浏览(40)
  • MATLAB: 调整坐标轴范围

    MATLAB: 调整坐标轴范围 在MATLAB中,可以使用一些方法来设置坐标轴的范围。通过调整坐标轴范围,可以改变绘图的可视化效果,并突出显示感兴趣的数据。本文将介绍一些常用的方法和示例代码。 使用axis函数设置坐标轴范围 axis函数是MATLAB中常用的设置坐标轴的函数之一。它

    2024年02月06日
    浏览(44)
  • 采用VMD按照某一坐标轴旋转坐标结构

    关注 M r . m a t e r i a l   , color{Violet} rm Mr.material , Mr.material   , 更 color{red}{更} 更 多 color{blue}{多} 多 精 color{orange}{精} 精 彩 color{green}{彩} 彩 ! 主要专栏内容包括:   †《LAMMPS小技巧》: ‾ textbf{ underline{dag《LAMMPS小技巧》:}}   † 《 LAMMPS 小技巧》: ​ 主要介绍采

    2024年02月13日
    浏览(36)
  • 3Ds Max坐标轴切换,使用物体的世界坐标和本地坐标之间切换

    官方文档 官方文档 使用“参考坐标系”列表,可以指定变换(移动、旋转和缩放)所用的坐标系。选项包括“视图”、“屏幕”、“世界”、“父对象”、“局部”、“万向”,“栅格”、“工作”和“拾取”。 主工具栏 “参考坐标系”下拉菜单 在“屏幕”坐标系中,所

    2024年02月12日
    浏览(48)
  • python matplotlib笔记:坐标轴设置

    ax.xlim():设置x坐标轴范围 ax.ylim():设置y坐标轴范围 ax.xlabel():设置x坐标轴名称 ax.ylabel():设置y坐标轴名称 ax.xticks():设置x轴刻度 ax.yticks():设置y轴刻度 gca():获取当前坐标轴信息 ax.spines:设置边框 ax.set_color:设置边框颜色:默认白色 ax.spines:设置边框 ax…xaxis.set_ticks_position:设置x坐标

    2024年02月09日
    浏览(39)
  • Matlab中如何调整坐标轴刻度

    Matlab中如何调整坐标轴刻度 在Matlab中,我们经常需要对绘图中的坐标轴刻度进行调整,以便更好地展示数据。本文将介绍如何使用Matlab来调整坐标轴刻度,并提供相应的源代码示例供参考。 Matlab提供了多种方法来调整坐标轴刻度。下面我们将介绍其中的两种常用方法:手动

    2024年02月05日
    浏览(66)
  • matplotlib 设置坐标轴的刻度显示

    💖💖感谢各位观看这篇文章,💖💖点赞💖💖、收藏💖💖、你的支持是我前进的动力!💖💖 💖💖感谢你的阅读💖,专栏文章💖持续更新!💖关注不迷路!!💖 设置刻度有两个方法: ax.set_xticks(self, ticks, minor=False) 设置刻度 ,matplotlib将刻度放在对应范围的哪个位置,

    2024年02月12日
    浏览(58)
  • Qwt QwtScaleDraw自定义坐标轴

    1.概述 QwtScaleDraw 是 Qt 绘图库 Qwt 中的一个类,用于绘制坐标轴刻度线和刻度标签。它提供了一些方法和属性来设置刻度线和标签的样式、布局和对齐方式。 以下是类继承关系: 2.常用方法 标签相关方法: setLabelRotation(double angle):设置标签旋转角度。 setLabelAlignment(Alignment

    2024年02月07日
    浏览(43)
  • Matlab隐藏坐标轴/数字/刻度线

    目录 一、隐藏坐标轴的数字 二、隐藏坐标轴的刻度 三、隐藏坐标轴 四、隐藏坐标区 五、修改坐标区背景颜色  六、修改图片背景颜色 一、隐藏坐标轴的数字 以X轴为例,在画图的代码后面增加以下设置: 二、隐藏坐标轴的刻度 三、隐藏坐标轴 四、隐藏坐标区 或者   五、

    2024年01月24日
    浏览(48)
  • echarts坐标轴、轴线、刻度、刻度标签

    x 轴和 y 轴都由 轴线、刻度、刻度标签、轴标题 四个部分组成。部分图表中还会有网格线来帮助查看和计算数据 普通的二维数据坐标系都有x轴和y轴,通常情况下,x轴显示在图表底部,y轴显示在左侧,一般配置如下: 当 x 轴(水平坐标轴)跨度很大,可以采用 区域缩放方

    2024年04月14日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包