javascript 3 个有序点的方向(Orientation of 3 ordered points)

给定三个点 p1、p2 和 p3,任务是确定这三个点的方向。

平面中有序三重点的方向可以是

逆时针

顺时针

共线

下图显示了 (a,b,c) 的不同可能方向

如果 (p1, p2, p3) 的方向共线,则 (p3, p2, p1) 的方向也共线。 

如果 (p1, p2, p3) 的方向是顺时针,则 (p3, p2, p1) 的方向是逆时针,反之亦然。

例子: 
 
输入:   p1 = {0, 0}, p2 = {4, 4}, p3 = {1, 2}

输出:  逆时针

输入:   p1 = {0, 0}, p2 = {4, 4}, p3 = {1, 1}

输出:  共线

如何计算方向? 

这个想法就是利用斜率。  

线段 (p1, p2) 的斜率:? = (y2 - y1)/(x2 - x1)

线段 (p2, p3) 的斜率:? = (y3 - y2)/(x3 - x2)

如果 ? > ?,则方向为顺时针(右转)

使用上述 ? 和 ? 的值,我们可以得出结论,

方向取决于以下表达式的符号:

(y2 - y1)*(x3 - x2) - (y3 - y2)*(x2 - x1)

当 ? < ? 时,上述表达式为负数,即逆时针

下面是上述想法的实现:

// javascript Code to find Orientation of 3
// ordered points
 
class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
}
 
 
// To find orientation of ordered triplet 
// (p1, p2, p3). The function returns 
// following values 
// 0 --> p, q and r are collinear
// 1 --> Clockwise
// 2 --> Counterclockwise
function orientation(p1, p2, p3) {
  // See 10th slides from following link 
  // for derivation of the formula
  let val = (p2.y - p1.y) * (p3.x - p2.x) -
    (p2.x - p1.x) * (p3.y - p2.y);
 
  if (val == 0) return 0; // collinear
 
  // clock or counterclock wise
  return (val > 0) ? 1 : 2;
}
 
/* Driver program to test above function */
let p1 = new Point(0, 0);
let p2 = new Point(4, 4);
let p3 = new Point(1, 2);
 
let o = orientation(p1, p2, p3);
 
if (o == 0)
  document.write("Linear");
else if (o == 1)
  document.write("Clockwise");
else
  document.write("CounterClockwise");
 
// This code is contributed by Saurabh Jaiswal 

 输出:

逆时针

线性

顺时针

时间复杂度: O(1)

辅助空间: O(1) 

以下文章使用了方向的概念: 

找到给定点集的简单闭合路径

c++ https://blog.csdn.net/hefeng_aspnet/article/details/141715783
java https://blog.csdn.net/hefeng_aspnet/article/details/141715877
python https://blog.csdn.net/hefeng_aspnet/article/details/141715899
C# https://blog.csdn.net/hefeng_aspnet/article/details/141715914
Javascript https://blog.csdn.net/hefeng_aspnet/article/details/141715931 

如何检查两个给定的线段是否相交?

c++ https://blog.csdn.net/hefeng_aspnet/article/details/141713655
java https://blog.csdn.net/hefeng_aspnet/article/details/141713762
python https://blog.csdn.net/hefeng_aspnet/article/details/141714389
C# https://blog.csdn.net/hefeng_aspnet/article/details/141714420
Javascript https://blog.csdn.net/hefeng_aspnet/article/details/141714442 

凸包 | 集合 1(贾维斯算法或包装)

c++ https://blog.csdn.net/hefeng_aspnet/article/details/141716082
java https://blog.csdn.net/hefeng_aspnet/article/details/141716363
python https://blog.csdn.net/hefeng_aspnet/article/details/141716444
C# https://blog.csdn.net/hefeng_aspnet/article/details/141716403
Javascript https://blog.csdn.net/hefeng_aspnet/article/details/141716421 

凸包 | 集合 2(格雷厄姆扫描)

c++ https://blog.csdn.net/hefeng_aspnet/article/details/141716566
java https://blog.csdn.net/hefeng_aspnet/article/details/141717095
python https://blog.csdn.net/hefeng_aspnet/article/details/141717139
C# https://blog.csdn.net/hefeng_aspnet/article/details/141717214
Javascript https://blog.csdn.net/hefeng_aspnet/article/details/141717264 

方法#2:使用斜率

该方法通过计算由点形成的线段的斜率来检查平面中 3 个有序点的方向。如果斜率相等,则这些点共线。如果前两个点形成的线段的斜率小于后两个点形成的线段的斜率,则方向为逆时针,否则为顺时针。

算法
1. 计算 (p1,p2) 和 (p2,p3) 形成的线的斜率

2. 如果斜率相等,则点共线

3. 如果 (p1,p2) 的斜率 < (p2,p3) 的斜率,则点处于逆时针方向

4. 如果 (p1,p2) 的斜率 > (p2,p3) 的斜率,则点处于顺时针方向

function orientation(p1, p2, p3) {
    // Calculate slopes
    let slope1 = (p2[1] - p1[1]) * (p3[0] - p2[0]);
    let slope2 = (p3[1] - p2[1]) * (p2[0] - p1[0]);
    // Check orientation
    if (slope1 == slope2) {
        return "Collinear";
    } else if (slope1 < slope2) {
        return "CounterClockWise";
    } else {
        return "ClockWise";
    }
}
 
// Example usage
let p1 = [0, 0];
let p2 = [4, 4];
let p3 = [1, 1];
console.log(orientation(p1, p2, p3));
 
p1 = [0, 0];
p2 = [4, 4];
p3 = [1, 2];
console.log(orientation(p1, p2, p3)); 

输出:

共线

逆时针

时间复杂度:O(1)

空间复杂度:O(1)

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

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

相关文章

Python GUI 编程:tkinter 初学者入门指南——窗口

目录&#xff1a; 创建窗口更改窗口标题更改窗口大小和位置窗口在屏幕上居中窗口设置的其他属性 Tkinter 是在 Python 中开发 GUI&#xff08;图形用户界面&#xff09;最常用的库。在本指南中&#xff0c;我们将引导您了解 Tkinter 的基本知识&#xff0c;学习如何使用 Tkinte…

Vue3:自定义事件实现组件通信

目录 一.性质 1.双向通信 2.灵活性 3.传参能力 4.声明机制 5.事件验证 6.修饰符支持 7.响应式更新 8.解耦组件 9.易于测试 10.性能优化 二.使用 1.父组件 2.子组件 三.代码 1.父组件代码 2.子组件代码 四.效果 在Vue3中&#xff0c;自定义事件是实现组件间通…

NLP(二)-文本表示

One-hot One-hot&#xff08;独热&#xff09;编码是一种最简单的文本表示方式。如果有一个大小为V的词表&#xff0c;对于第i个词$w_i$&#xff0c;可以用一个长度为V的向量来表示&#xff0c;其中第i个元素为1&#xff0c;其它为0.例如&#xff1a; 减肥&#xff1a;[1, 0,…

C++11之统一的列表初始化

一.{}初始化 在c98中&#xff0c;标准允许使用{}对数组或结构体元素进行统一的列表初始值设定&#xff1a; struct mess {int _x;string _str; }; int main() {//注意&#xff0c;使用new的一定是指针int* arr new int[4] {1, 2, 3, 4};//数组初始化int arr[] { 1,3,5,6 };…

深度学习激活函数

激活函数是神经网络模型重要的组成部分&#xff0c;本文作者Sukanya Bag从激活函数的数学原理出发&#xff0c;详解了十种激活函数的优缺点。 激活函数&#xff08;Activation Function&#xff09;是一种添加到人工神经网络中的函数&#xff0c;旨在帮助网络学习数据中的复杂模…

linux之nacos安装

1:下载nacos安装包 方式一、进入官网下载压缩包 官网地址 找到nacos-server-2.0.1.tar.gz 点击进行下载&#xff0c;下载完成后上传到服务器中。 方式二、使用wget命令下载 也有两种方式&#xff1a;第一种下载速度较慢 wget https://github.com/alibaba/nacos/releases/downl…

圆柱包围框-Bounding Cylinder-原理-代码实现

定义&#xff1a;使用一个圆柱体包围点云的所有点&#xff0c;通常用于长柱状物体。 优点&#xff1a;适合于柱状或长条形的点云。 缺点&#xff1a;计算较为复杂&#xff0c;尤其是确定圆柱体的轴线方向和半径。 找到圆柱尽量满足下面条件 找到能够完全包围3D物体的最小圆柱…

户外无线麦克风哪个牌子好,降噪麦克风哪个牌子好,领夹麦推荐

对于热爱记录与户外直播的自媒体人来说&#xff0c;一款高性能的无线领夹麦克风决定了音频的质量。市场上虽有品牌如大疆、罗德、西圣等凭借技术创新引领潮流&#xff0c;但同时也存在一些产品&#xff0c;因设计缺陷在运动时声音捕捉不稳定。作为运动爱好者与音频设备测评师&a…

网络资源模板--Android Studio 图书借阅App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--图书借阅App 二、项目测试环境 三、项目详情 首页 这段代码是一个 Android 应用的 MainActivity 类&#xff0c;功能简要总结如下&#xff1a; 1. **界面设置**&#xf…

数据结构不再难懂:带你轻松搞定图

数据结构入门学习&#xff08;全是干货&#xff09;——图 1 图 1.1 什么是图 图是一种用于表示多对多关系的数学模型。它由一组顶点和一组边构成&#xff0c;用于描述事物之间的复杂关联。 顶点&#xff1a;通常用 V (Vertex) 表示&#xff0c;代表事物或对象。边&#xf…

2024华为杯研赛E题保姆级教程思路分析

E题题目&#xff1a;高速公路应急车道紧急启用模型 今年的E题设计到图像/视频处理&#xff0c;实际上&#xff0c;E题的难度相对来说较低&#xff0c;大家不用畏惧视频的处理&#xff0c;被这个吓到。实际上&#xff0c;这个不难&#xff0c;解决了视频的处理问题&#xff0c;…

华为---代理ARP工作过程示例分析

目录 1. 示例场景 2. 基本配置 3. 配置代码 4. 测试验证 5. 抓包分析 5.1 在代理ARP环境下PC1和PC2通信分析 5.2 取消代理ARP环境下PC1和PC2通信分析 【1】取消R1路由器GE 0/0/1端口ARP代理 【2】取消R2路由器GE 0/0/1端口ARP代理 1. 示例场景 如上图所示&#xff0c;…

windows环境下配置MySQL主从启动失败 查看data文件夹中.err发现报错unknown variable ‘log‐bin=mysql‐bin‘

文章目录 问题解决方法 问题 今天在windows环境下配置MySQL主从同步&#xff0c;在修改my.ini文件后发现MySQL启动失败了 打开my.ini检查参数发现没有问题 [mysqld] #开启二进制日志&#xff0c;记录了所有更改数据库数据的SQL语句 log‐bin mysql‐bin #设置服务id&#x…

java重点学习-总结

十五 总结 https://kdocs.cn/l/crbMWc8xEZda &#xff08;总结全部的精华&#xff09; 1.面试准备 企业筛选简历规则简历编写注意事项(亮点)项目怎么找&#xff0c;学习到什么程度面试过程(表达结构、什么样的心态去找工作) 2.redis 缓存相关(缓存击穿、穿透、雪崩、缓存过期淘…

农业电商服务系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;会员管理&#xff0c;商家管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;农产品监督管理&#xff0c;助农信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页…

使用Renesas R7FA8D1BH (Cortex®-M85)实现多功能UI

目录 概述 1 系统框架介绍 1.1 模块功能介绍 1.2 UI页面功能 2 软件框架结构实现 2.1 软件框架图 2.1.1 应用层API 2.1.2 硬件驱动层 2.1.3 MCU底层驱动 2.2 软件流程图 4 软件功能实现 4.1 状态机功能核心代码 4.2 页面功能函数 4.3 源代码文件 5 功能测试 5.1…

AI字幕翻译器行业分析:前五大厂商占有大约29.5%的市场份额

AI 字幕翻译器正在彻底改变我们使用不同语言消费媒体的方式&#xff0c;使内容可以普遍访问。这些先进的技术利用机器学习和自然语言处理&#xff0c;将口语对话实时翻译成字幕。这一功能不仅打破了语言障碍&#xff0c;提升了观众的体验&#xff0c;而且还使内容创作者能够毫不…

火语言RPA流程组件介绍--获取关联元素

&#x1f6a9;【组件功能】&#xff1a;获取指定元素的父元素、子元素、相邻元素等关联信息 配置预览 配置说明 目标元素 支持T或# 默认FLOW输入项 通过自动捕获工具捕获(选择元素工具使用方法)或手动填写网页元素的css,xpath&#xff0c;指定对应网页元素作为操作目标 关联…

Arthas jvm(查看当前JVM的信息)

文章目录 二、命令列表2.1 jvm相关命令2.1.3 jvm&#xff08;查看当前JVM的信息&#xff09; 二、命令列表 2.1 jvm相关命令 2.1.3 jvm&#xff08;查看当前JVM的信息&#xff09; 基础语法&#xff1a; jvm [arthas18139]$ jvmRUNTIME …

JUC 高并发编程的入门学习

课程内容概览 什么是 JUCLock 接口线程间通信集合的线程安全多线程锁Callable 接口JUC 三大辅助类: CountDownLatch CyclicBarrier Semaphore读写锁: ReentrantReadWriteLock阻塞队列ThreadPool 线程池Fork/Join 框架CompletableFuture 1 什么是 JUC 1.1 JUC 简介 在 Java …