JS判断点是否在线段上

这篇具有很好参考价值的文章主要介绍了JS判断点是否在线段上。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文利用向量的点积和叉积来判断点是否在线段上。
基础知识补充 从零开始的高中数学——向量、向量的点积、带你一次搞懂点积(内积)、叉积(外积)、Unity游戏开发——向量运算(点乘和叉乘

说明

点积可以用来判断两个向量的夹角,如果这个夹角是0或者180度,说明这个点在直线上;
叉积可以用来判断一个点到一条直线的距离,如果这个距离是0,说明这个点在直线上。

假设有a、b、c三点,其中a和b是线段的两个端点,c是要判断的点:

  1. 计算向量ab和ac的点积,记为dot。
  • 如果dot小于0,说明c在ab的垂直平分线上;
  • 如果dot等于ab的模长的平方,说明c在ab的延长线上;
  • 如果dot在0和ab的模长的平方之间,说明c在ab的方向上,可能在ab线段上;
  • 如果dot小于0或者大于ab的模长的平方,说明c不在ab的直线上,也不在ab线段上。
  1. 计算向量ab和ac的叉积,记为cross。
  • 如果cross不等于0,说明c不在ab的直线上,也不在ab线段上;
  • 如果cross等于0,说明c在ab的直线上。
  1. 当判断出c在ab的直线上时,还需要判断c的x坐标或者y坐标是否在a和b的x坐标或者y坐标之间,才能确定c是否在ab的线段上。

综合上面两个条件,叉积和点积都可以用来判断一个点是否在一条直线上,但是叉积更简单一些,因为它需要的条件更少。文章来源地址https://www.toymoban.com/news/detail-746195.html

JS代码

/**
 * 判断点c是否在ab组成的线段上
 * @param {x,y} a 点
 * @param {x,y} b 点
 * @param {x,y} c 点
 * @returns boolean
 */
function isPointOnLineSegment(a, b, c) {
  // 计算向量ab和ac的叉积
  let crossProduct = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
  // 如果不等于0,说明不共线,直接返回false
  if (crossProduct !== 0) {
    return false;
  }
  // 否则,检查c点是否在ab线段的范围内
  return (
    Math.min(a.x, b.x) <= c.x &&
    c.x <= Math.max(a.x, b.x) &&
    Math.min(a.y, b.y) <= c.y &&
    c.y <= Math.max(a.y, b.y)
  );
}

// 测试
const a = {x:0,y:0}
const b = {x:0,y:1}
const c = {x:0,y:2}
const d = {x:1,y:1}
const e = {x:1,y:2}
const f = {x:2,y:2}

console.log(isPointOnLineSegment(a, c, b)); // true
console.log(isPointOnLineSegment(a, f, d)); // true
console.log(isPointOnLineSegment(c, f, e)); // true
console.log(isPointOnLineSegment(a, b, c)); // false
console.log(isPointOnLineSegment(a, f, c)); // false
console.log(isPointOnLineSegment(a, c, f)); // false

到了这里,关于JS判断点是否在线段上的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 利用C语言去判断是否为整数

    整型 int: 例如: int a=-3.2;   ----  输出:-3             int b=4.75;  ----- 输出:4 直接取整数部分!!! 故引出判断方法: C语言中可以有强制转换类型的操作!!!  if (  float    ==    int )   return true;   ps:个人经验,心得理解分享! (仅供参考)

    2024年02月08日
    浏览(43)
  • JS判断输入值是否为正整数,判断变量是否为数字

    这篇文章将讨论如何确定一个变量是否代表 JavaScript 中的有效数字。 1.JS中的test是原来是JS中检测字符串中是否存在的一种模式,JS输入值是否为判断正整数代码: 扩展: 附判断数字、浮点的正则表达:  ”^\\\\d+$” //非负整数(正整数 + 0) “^[0-9]*[1-9][0-9]*$” //正整数 “^(

    2024年02月06日
    浏览(80)
  • 利用OpenCV判断图像是否过亮或过暗

    在处理图像自动亮度调节时,需要判断图像是否过亮或者过暗,从而根据图像给出的结果,进行调节。方法如下:

    2024年02月15日
    浏览(43)
  • js判断日期是否合法

    function isDateValid(year, month, day) {   // 创建一个Date对象,将年、月、日作为参数传入   // 注意:在JavaScript中,月份是从0开始的,所以实际月份要减1   var date = new Date(year, month - 1, day);      // 使用getFullYear()、getMonth()和getDate()方法获取日期对象的年、月、日   var validYear = dat

    2024年02月11日
    浏览(55)
  • 【js】判断文本是否溢出

    需求:单行文本超出显示省略号,划过该文本时使用tooltip显示全部文本。 问题:由于数据是动态的,有时会很长,有时又比较短不会超出。如果一直保持显示tooltip就很不美观。 优化:超出文本时显示tooltip,不超出则不显示。 首先要判断文本是否溢出 使用 以上是用于elem

    2024年02月16日
    浏览(50)
  • js判断是否手机模式

     

    2023年04月17日
    浏览(58)
  • 利用JavaRestClient实现创建、删除索引库,判断索引库是否存在

    在elasticsearch提供的API中,与elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中,必须先完成这个对象的初始化,建立与elasticsearch的连接。 1)引入es的RestHighLevelClient依赖: 注:导入的依赖的版本要和打开的es的版本对应  2)初始化RestHighLevelClient:    把建库的json封

    2024年02月11日
    浏览(68)
  • 向量(基础,点积,叉积等)

    1.1、向量的基本概念 向量又称为矢量(vector),表示既有大小又有方向的量。在物理学中,力,速度,位移等都可以用向量来表示。  向量通常用一个有向线段表示。 1.2、向量的加减法 向量的加法运算符合平行四边形法则。 设向量 a (x1,y1) b (x2,y2),则 a+b  =(x1+x

    2023年04月08日
    浏览(39)
  • Unity利用正则表达式判断字符串是否满足要求

    首先该方法属于C#,是C#提供的,不是unity提供的,但我使用这个是在unity中使用的,故此我将其归入unity笔记。 该方式可用于注册、登录等等需要用户输入的场景,用以判断字符串是否满足正则表达式的要求 首先介绍该API 这里开始介绍,大家可以看看官方的文档Regex.IsMatch 方

    2024年01月16日
    浏览(53)
  • Js如何判断两个数组是否相等?

    日常开发,时不时会遇到需要判定2个数组是否相等的情况,需要实现考虑的场景有: 先判断长度,长度不等必然不等 元素位置 其他情况考虑 \\\'1\\\' 和 1 (Object的key是字符串, Map的key没有限制) NaN null 和 undefined 数组自带的方法,比较适合的有: every、some、filter、findIndex 。 这种

    2024年02月22日
    浏览(69)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包