【计算几何】确定两条连续线段向左转还是向右转

确定两条连续线段向左转还是向右转

目录

  • 一、说明
  • 二、算法
    • 2.1 两点的叉积
    • 2.2 两个段的叉积
  • 三、旋转方向判别
    • 3.1 左转
    • 3.2、右转
    • 3.3 共线判别

一、说明

   如果是作图,或者是判别小车轨迹。为了直观地了解,从当前点到下一个点过程中,什么是左转、什么是右转,或者方向不变,这在现场实时运算中是很重要的。本篇描述其快速算法。

   请考虑下面所示的示例。
在这里插入图片描述

   两图中,共有三点p1,p2和p3和两条线段 p 1 p 2 ‾ \overline{p_1p_2} p1p2 p 2 p 3 ‾ \overline{p_2p_3} p2p3。中途点 p 2 p_2 p2是两条线段共有的。在图(a)中,线段 p 2 p 3 ‾ \overline{p_2p_3} p2p3 p 2 p_2 p2该点右转而在图(b)中,段 p 2 p 3 ‾ \overline{p_2p_3} p2p3在公共点 p 2 p_2 p2左转。我们的眼睛更容易通过观察图形来快速识别路段是左转还是右转,因为您的眼睛天生具有快速识别事物的能力。在这篇文章中,我将讨论计算机如何使用几何算法来识别这一点。

二、算法

2.1 两点的叉积

   给定两点 p 1 ( x 1 , y 1 ) p_1(x_1,y_1) p1(x1,y1 p 2 ( x 2 , y 2 ) p_2(x_2,y_2) p2(x2,y2),我们首先需要判断点是否 p 1 p_1 p1从点开始是顺时针还是逆时针 p 2 p_2 p2就起源而言。解决这个问题的一种方法是计算两者所成的角度 p 1 ‾ \overline{p_1} p1 p 2 ‾ \overline{p_2} p2
和X轴和角度的差异可以判断一个点是顺时针还是逆时针。有一个比查找计算向量叉积的角度更简单有效的解决方案 p 1 ‾ \overline{p_1} p1 p 2 ‾ \overline{p_2} p2。数学上两个向量的叉积 p 1 ‾ \overline{p_1} p1 p 2 ‾ \overline{p_2} p2定义成:
p 1 × p 2 = x 1 y 2 − x 2 y 1 p_1×p_2=x_1y_2-x_2y_1 p1×p2=x1y2x2y1

   如果值p1×p2则为正,p1是沿逆时针到达p2,关于原点如下图所示。
在这里插入图片描述

   同样,如果p1×p2是负数,从p1到p2是顺时针过度。相对于原点,如果值为 0,则点p1,p2和原点共线。以下 python 代码实现了叉积。

class Point:def __init__(self, x, y):self.x = xself.y = ydef subtract(self, p):return Point(self.x - p.x, self.y - p.y)def __str__(self):return '(' + str(self.x) + ', ' + str(self.y) + ')'# calculates the cross product of vector p1 and p2
# if p1 is clockwise from p2 wrt origin then it returns +ve value
# if p2 is anti-clockwise from p2 wrt origin then it returns -ve value
# if p1 p2 and origin are collinear then it returs 0
def cross_product(p1, p2):return p1.x * p2.y - p2.x * p1.y

2.2 两个段的叉积

   考虑两个线段,其端点是p1(X1,y1),p2(X2,y2)和p1(X1,y1),p3(X3,y3)分别。为了计算两个线段的叉积,我们需要将它们转换为向量。这可以通过以下方式完成。

p 1 p 2 ‾ = ( x 2 − x 1 , y 2 − y 1 ) , p 1 p 3 ‾ = ( x 3 − x 1 , y 3 − y 1 ) \overline{p_1p_2} = (x_2 - x_1, y_2 - y_1), \overline{p_1p_3} = (x_3 - x_1, y_3 - y_1) p1p2=(x2x1,y2y1),p1p3=(x3x1,y3y1)

   一旦我们有了两个两个向量,我们就可以调用cross_product来计算叉积,如下面的代码所示。

# returns the cross product of vector p1p3 and p1p2
# if p1p3 is clockwise from p1p2 it returns +ve value
# if p1p3 is anti-clockwise from p1p2 it returns -ve value
# if p1 p2 and p3 are collinear it returns 0
def direction(p1, p2, p3):return  cross_product(p3.subtract(p1), p2.subtract(p1))

三、旋转方向判别

3.1 左转

   判断一个段是否 p 2 p 3 p_2p_3 p2p3从路段左转 p 1 p 2 p_1p_2 p1p2在点 p 2 p_2 p2,我们画下一个向量 p 1 p 3 ‾ \overline{p_1p_3} p1p3并检查新向量是否与向量逆时针方向 p 2 p 3 ‾ \overline{p_2p_3} p2p3。如下图所示。右图显示向量
在这里插入代码片在这里插入图片描述

   p 1 p 3 ‾ \overline{p_1p_3} p1p3从向量逆时针方向 p 1 p 2 ‾ \overline{p_1p_2} p1p2因此我们可以说该段p2p3
从路段左转p1p2在点p2。下面给出了 python 实现。

# checks if p3 makes left turn at p2
def left(p1, p2, p3):return direction(p1, p2, p3) < 0

3.2、右转

   这与左转相同,唯一的区别是向量 p 1 p 3 ‾ \overline{p_1p_3} p1p3从向量顺时针方向 p 2 p 3 ‾ \overline{p_2p_3} p2p3。下面给出了 python 实现。

# checks if p3 makes right turn at p2
def right(p1, p2, p3):return direction(p1, p2, p3) > 0

3.3 共线判别

   当该方法direction既不返回正值也不返回负值而是返回零时,就会出现一种特殊情况。在这种情况下,所有的点 p 1 p_1 p1, p 2 p_2 p2 p 3 p_3 p3位于同一条线上。在本例中段 p 2 p 3 p_2p_3 p2p3不转向任何方向。

# checks if p1, p2 and p3 are collinear
def collinear(p1, p2, p3):return direction(p1, p2, p3) == 0

参考
Cormen, TH、Leiserson, CE、Rivest, RL 和 Stein, C.(nd)。算法简介(第三版)。麻省理工学院出版社。

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

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

相关文章

第77讲用户管理功能实现

用户管理功能实现 前端&#xff1a; views/user/index.vue <template><el-card><el-row :gutter"20" class"header"><el-col :span"7"><el-input placeholder"请输入用户昵称..." clearable v-model"…

JavaEE作业-实验二

目录 1 实验内容 2 实验要求 3 思路 4 核心代码 5 实验结果 1 实验内容 实现两个整数求和的WEB程序 2 实验要求 ①采用SpringMVC框架实现 ②数据传送到WEB界面采用JSON方式 3 思路 ①创建一个SpringMVC项目&#xff0c;配置好相关的依赖和配置文件。 ②创建一个Con…

Centos7之忘记Root用户密码的处理方式

Centos7之忘记Root用户密码的处理方式 文章目录 Centos7之忘记Root用户密码的处理方式1.场景描述2. 重置密码1. 重启系统进入编辑界面2. 按方向键下键↓&#xff0c;找到设置语言的地方3. 进入bash界面后&#xff0c;可以输入passwd命令重新设置root密码 1.场景描述 长时间未使…

导数的几何意义【高数笔记】

1. 高数中的导数几何意义&#xff0c;与中学中斜率的联系 2. 导函数与导数的区别和联系又是什么 3. 导数的几何意义的题型是什么 4. 这些题型又有哪些区别 5. 点在曲线外和点在曲线上&#xff0c;需要注意什么 6. 法线和切线有什么关系 7. 法线是什么

无性能损失!让SAM加速近50倍!EfficientViT-SAM来了!

今天给大家分享一个加速视觉分割大模型的工作&#xff1a;EfficientViT-SAM。这是一种新的加速SAM系列。保留了SAM的轻量级提示编码器和mask解码器&#xff0c;同时用EfficientViT替换了沉重的图像编码器。对于训练&#xff0c;首先从SAM-ViT-H图像编码器到EfficientViT的知识蒸…

Github 2024-02-11 开源项目日报Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-11统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4非开发语言项目2C项目1C项目1Solidity项目1JavaScript项目1Rust项目1HTML项目1 免费服务列表 | f…

实战案例:将已有的 MySQL8.0 单机架构变成主从复制架构

操作步骤 修改 master 主节点 的配置&#xff08; server-id log-bin &#xff09;master 主节点 完全备份&#xff08; mysqldump &#xff09;master 主节点 创建复制用户并授权master 主节点 将完全备份文件拷贝至从节点修改 slave 从节点 的配置&#xff08; server-id rea…

全功能的屏幕截图工具 - PicPick

全功能的屏幕截图工具 - PicPick 1. PicPick1.1. PicPick 中文1.2. Hot keys References 1. PicPick https://picpick.app/zh/ https://picpick.app/en/ A full-featured screen capture and recording tool, Intuitive image editor, color picker, color palette, pixel-ru…

腾讯云4核8G服务器性能如何?支持多少用户访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

【大厂AI课学习笔记】【1.5 AI技术领域】(10)对话系统

对话系统&#xff0c;Dialogue System&#xff0c;也称为会话代理。是一种模拟人类与人交谈的计算机系统&#xff0c;旨在可以与人类形成连贯通顺的对话&#xff0c;通信方式主要有语音/文本/图片&#xff0c;当然也可以手势/触觉等其他方式 一般我们将对话系统&#xff0c;分…

算法学习——LeetCode力扣栈与队列篇2

算法学习——LeetCode力扣栈与队列篇2 150. 逆波兰表达式求值 150. 逆波兰表达式求值 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。…

X图形

1.题目 这道题是蓝桥云课上面的一道题目&#xff0c;它是2022年蓝桥杯省模拟题&#xff0c;题目难度为简单。 考察的知识点为递归。 题目链接&#xff1a;X图形 2.思路 如何理解题意&#xff1f; 蓝桥杯的题目和Leetcode题目最大的不同点在于&#xff0c;蓝桥杯的题目大部…

IDEA中Git的使用小技巧-Toolbar(工具栏)的设置

目录 1 前言 2 步骤 2.1 打开设置 2.2 找到Menus and Toolbars 2.3 Menus and Toolbars界面的介绍 2.4 选择工具 2.5 查看 1 前言 工具栏的合理运用&#xff0c;能够极大程度上为我们省时省力 &#xff0c;接下来我将以Git工具的添加&#xff0c;介绍如何定制我们IDEA…

Makefile编译原理 make 中的路径搜索_1

一.make中的路径搜索 问题&#xff1a;在实际的工程项目中&#xff0c;所有的源文件和头文件都放在同一个文件夹中吗&#xff1f; 实验1 &#xff1a; VPATH 引子 mhrubuntu:~/work/makefile1/17$ ll total 28 drwxrwxr-x 4 mhr mhr 4096 Apr 22 00:46 ./ drwxrwxr-x 7 mhr m…

离开亚马逊7.5年后的真心话

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【开源】SpringBoot框架开发厦门旅游电子商务预订系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…

金和OA C6 RssModulesHttp.aspx SQL注入漏洞复现

0x01 产品简介 金和网络是专业信息化服务商,为城市监管部门提供了互联网+监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 0x02 漏洞概述 金和OA C6 RssModulesHttp.aspx接口处存在SQL注入漏洞,攻击者除了可以利用 SQL 注入…

算法学习——LeetCode力扣二叉树篇3

算法学习——LeetCode力扣二叉树篇3 116. 填充每个节点的下一个右侧节点指针 116. 填充每个节点的下一个右侧节点指针 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树…

「C++ 类和对象篇 11」explicit关键字

目录 〇、构造函数还具有类型转换的作用 一、explicit关键字是什么&#xff1f; 二、为什么需要explicit关键字&#xff1f; 三、怎么使用explicit关键字&#xff1f; 【总结】 〇、构造函数还具有类型转换的作用 构造函数不仅可以构造与初始化对象&#xff0c;对于只有一个参…

ChatGpt报错:Your authentication token is no longer valid解决办法

今天打开ChatGpt突然提示Oops&#xff01;,Your authentication token is no longer valid.&#xff0c;之前还好好的&#xff0c;环境也没变啊&#xff0c;结果弄了好久终于解决&#xff0c;于是记录一下解决过程&#xff0c;顺便总结一下关于OpenAI各种报错的解决办法。 完整…