精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

幾何算法:判斷兩條線段是否相交

開發(fā) 前端
判斷兩條線段是否相交,可以判斷兩條線段的兩端點(diǎn)是否分別在各自的兩側(cè),對應(yīng)地需要用到二維向量叉乘結(jié)果的正負(fù)值代表向量旋轉(zhuǎn)方向的特性。

大家好,我是前端西瓜哥。

如何判斷兩條線段(注意不是直線)是否有交點(diǎn)?

傳統(tǒng)幾何算法的局限

上過一點(diǎn)學(xué)的西瓜哥我,只用高中學(xué)過的知識,還是可以解這個問題的。

一條線段兩個點(diǎn),可以列出一個兩點(diǎn)式(x - x1) / (x2 - x1) = (y - y1) / (y2 - y1)),兩條線段是兩個兩點(diǎn)式,這樣就是 二元一次方程組 了 ,就能求出兩條直線的交點(diǎn)。

然后判斷這個點(diǎn)是否在其中一條線段上。如果在,說明兩線段相交,否則不相交。

看起來不錯,但這里要考慮直線垂直或水平于坐標(biāo)軸的特殊情況,還有兩條直線平行導(dǎo)致沒有唯一解的情況,除數(shù)不能為 0 的情況。

特殊情況實(shí)在是太多了,能用是能用,但不好用。

那么,有其他的更好的解法嗎?

有的,叉乘。

叉乘是什么?

叉乘(cross product)是線性代數(shù)的一個概念,也叫外積、叉積、向量積,是在三維空間中兩個向量的二元運(yùn)算的結(jié)果,該結(jié)果為一個向量。

但那是嚴(yán)格意義上的。實(shí)際也可以用在二維空間的二維向量中,不過此時它們的叉乘結(jié)果變成了標(biāo)量。

假設(shè)向量 A 為 (x1, y1),向量 B 為 (x2, y2),則叉乘 AxB 的結(jié)果為 x1 * y2 - x2 * y1。

(注意叉乘不滿足交換律)

在幾何意義上,這個叉乘結(jié)果的絕對值對應(yīng)兩個向量組成的平行四邊形的面積。

此外可通過符號判斷向量 A 變成向量 B 的旋轉(zhuǎn)方向。

如果叉乘為正數(shù),說明 A 變成 B 需要逆時針旋轉(zhuǎn)(旋轉(zhuǎn)角度小于 180 度);

如果為負(fù)數(shù),說明 A 到 B 需要順時針旋轉(zhuǎn);

如果為 0,說明兩個向量平行(或重合)。

叉乘解法的原理

回到題目本身。

假設(shè)線段 1 的端點(diǎn)為 A 和 B,線段 2 的端點(diǎn)為 C 和 D。

我們可以換另一個角度去解,即判斷線段 1 的兩個端點(diǎn)是否在線段 2 的兩邊,然后再反過來比線段 2 的兩點(diǎn)是否線段 1 的兩邊。

這里我們可以利用上面 叉乘的正負(fù)代表旋轉(zhuǎn)方向的特性。

以上圖為例, AB 向量到 AD 向量位置需要逆時針旋轉(zhuǎn),AB 向量到 AC 向量則需要順時針,代表 C 和 D 在 AB 的兩側(cè),對應(yīng)就是兩個叉乘相乘為負(fù)數(shù)。

function crossProduct(p1: Point, p2: Point, p3: Point): number {
  const x1 = p2[0] - p1[0];
  const y1 = p2[1] - p1[1];
  const x2 = p3[0] - p1[0];
  const y2 = p3[1] - p1[1];
  return x1 * y2 - x2 * y1;
}

const [a, b] = seg1;
const [c, d] = seg2;

// d1 的符號表示 AB 旋轉(zhuǎn)到 AC 的旋轉(zhuǎn)方向
const d1 = crossProduct(a, b, c);

只是判斷了 C 和 D 在 AB 線段的兩側(cè)還不行,因?yàn)榭赡苓€有下面這種情況。

所以我們還要再判斷一下,A 和 B 是否在 CD 線的的兩側(cè)。計(jì)算過程同上,這里不贅述。

一般實(shí)現(xiàn)

type Point = [number, number];

function crossProduct(p1: Point, p2: Point, p3: Point): number {
  const x1 = p2[0] - p1[0];
  const y1 = p2[1] - p1[1];
  const x2 = p3[0] - p1[0];
  const y2 = p3[1] - p1[1];
  return x1 * y2 - x2 * y1;
}

function isSegmentIntersect(
  seg1: [Point, Point],
  seg2: [Point, Point],
): boolean {
  const [a, b] = seg1;
  const [c, d] = seg2;

  const d1 = crossProduct(a, b, c);
  const d2 = crossProduct(a, b, d);
  const d3 = crossProduct(c, d, a);
  const d4 = crossProduct(c, d, b);

  return d1 * d2 < 0 && d3 * d4 < 0;
}

// 測試
const seg1: [Point, Point] = [
  [0, 0],
  [1, 1],
];
const seg2: [Point, Point] = [
  [0, 1],
  [1, 0],
];

console.log(isSegmentIntersect(seg1, seg2)); // true

注意,這個算法認(rèn)為線段的端點(diǎn)剛好在另一條線段上的情況,不屬于相交。

考慮點(diǎn)在線段上或重合

如果你需要考慮線段的端點(diǎn)剛好在另一條線段上的情況,需要額外在叉乘為 0 的情況下,再判斷一下線段 1 的端點(diǎn)是否在另一個線段的 x  和 y 范圍內(nèi)。

對應(yīng)的算法實(shí)現(xiàn):

type Point = [number, number];

function crossProduct(p1: Point, p2: Point, p3: Point): number {
  const x1 = p2[0] - p1[0];
  const y1 = p2[1] - p1[1];
  const x2 = p3[0] - p1[0];
  const y2 = p3[1] - p1[1];
  return x1 * y2 - x2 * y1;
}

function onSegment(p: Point, seg: [Point, Point]): boolean {
  const [a, b] = seg;
  const [x, y] = p;
  return (
    x >= Math.min(a[0], b[0]) &&
    x <= Math.max(a[0], b[0]) &&
    y >= Math.min(a[1], b[1]) &&
    y <= Math.max(a[1], b[1])
  );
}

function isSegmentIntersect(
  seg1: [Point, Point],
  seg2: [Point, Point],
): boolean {
  const [a, b] = seg1;
  const [c, d] = seg2;

  const d1 = crossProduct(a, b, c);
  const d2 = crossProduct(a, b, d);
  const d3 = crossProduct(c, d, a);
  const d4 = crossProduct(c, d, b);

  if (d1 * d2 < 0 && d3 * d4 < 0) {
    return true;
  }
 
  // d1 為 0 表示 C 點(diǎn)在 AB 所在的直線上
  // 接著會用 onSegment 再判斷這個 C 是不是在 AB 的 x 和 y 的范圍內(nèi)
  if (d1 === 0 && onSegment(c, seg1)) return true;
  if (d2 === 0 && onSegment(d, seg1)) return true;
  if (d3 === 0 && onSegment(a, seg2)) return true;
  if (d4 === 0 && onSegment(b, seg2)) return true;

  return false;
}

// 測試
const seg1: [Point, Point] = [
  [0, 0],
  [1, 1],
];
const seg2: [Point, Point] = [
  [0, 1],
  [1, 0],
];
const seg3: [Point, Point] = [
  [0, 0],
  [2, 2],
];
const seg4: [Point, Point] = [
  [1, 1],
  [1, 0],
];
// 普通相交情況
console.log(isSegmentIntersect(seg1, seg2)); //  true
// 線段 1 的一個端點(diǎn)剛好在線段 2 上
console.log(isSegmentIntersect(seg3, seg4)); // true

結(jié)尾

總結(jié)一下,判斷兩條線段是否相交,可以判斷兩條線段的兩端點(diǎn)是否分別在各自的兩側(cè),對應(yīng)地需要用到二維向量叉乘結(jié)果的正負(fù)值代表向量旋轉(zhuǎn)方向的特性。

責(zé)任編輯:姜華 來源: 前端西瓜哥
相關(guān)推薦

2023-11-08 08:09:36

幾何算法解析幾何

2012-12-20 10:19:08

華為路由器接入設(shè)置

2023-04-05 14:31:19

Java計(jì)算移動

2009-06-19 15:25:13

ITSMNSM運(yùn)維管理

2014-10-24 15:17:07

Android

2011-06-07 11:21:34

路由負(fù)載

2014-12-24 09:15:54

PaaS開源云服務(wù)

2024-12-27 00:00:00

SQL死鎖數(shù)據(jù)庫

2019-04-04 13:36:25

云計(jì)算互聯(lián)網(wǎng)云廠商

2012-05-11 13:15:12

戴爾虛擬化

2019-11-06 15:16:12

16GB8GB內(nèi)存

2020-10-16 08:09:58

算法代碼字符串

2016-08-18 09:53:33

軟件定義存儲

2022-06-06 23:22:44

互聯(lián)網(wǎng)產(chǎn)品模式

2010-01-12 18:05:56

Linux Redha

2022-08-11 13:11:48

斯坦福大學(xué)英偉達(dá)VR 頭顯

2017-01-11 15:45:52

中國聯(lián)通光纜亞歐5號

2009-03-06 12:17:24

IBMPowerSystemPower6

2021-12-08 09:00:25

LeetCode容器算法

2018-07-30 11:03:08

4GB內(nèi)存8GB
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

欧美日韩国产经典色站一区二区三区| www国产成人免费观看视频 深夜成人网| 日韩在线观看免费网站| 不用播放器的免费av| 婷婷色在线资源| 91玉足脚交白嫩脚丫在线播放| 国产不卡av在线免费观看| 日日操免费视频| 粉嫩的18在线观看极品精品| 色偷偷成人一区二区三区91| 波多野结衣三级在线| 欧性猛交ⅹxxx乱大交| 日日夜夜免费精品视频| 欧美日韩国产成人在线| 国产ts在线播放| 蜜桃精品视频| 色哦色哦哦色天天综合| 在线观看av的网址| caoporn国产精品免费视频| 国产suv精品一区二区6| 国产精品精品久久久| 国产污片在线观看| 色一区二区三区四区| 亚洲精品成人网| 日韩av影视大全| 亚洲第一二三四区| 亚洲成人av一区| 异国色恋浪漫潭| 高清性色生活片在线观看| 成人在线视频首页| 91免费综合在线| 黄色一区二区视频| 先锋影音久久| 97视频com| 久久久精品99| 亚洲天堂免费| 在线激情影院一区| 国产精成人品免费观看| 老司机成人在线| 日韩精品中文字幕一区二区三区 | 亚洲尤物在线| 欧美激情精品久久久久久变态| 蜜桃av免费观看| 欧美日韩性在线观看| 日韩成人av在线| 理论片大全免费理伦片| 日韩高清一区| 欧美一卡二卡三卡四卡| 91 在线视频观看| 欧美激情不卡| 欧美网站大全在线观看| 精品少妇无遮挡毛片| 欧美性猛交xxx高清大费中文| 亚洲大型综合色站| 国产真人做爰毛片视频直播| 日本高清在线观看| 一区二区三区日韩精品| 91免费国产精品| 欧洲黄色一区| 亚洲五码中文字幕| 中文字幕无码精品亚洲资源网久久| 超碰在线最新| 亚洲尤物视频在线| 久久久久久免费看| 日韩伦理在线一区| 色88888久久久久久影院按摩| 欧美一级黄色影院| 成人av色网站| 欧美高清一级片在线| 手机在线国产视频| 亚洲国产aⅴ精品一区二区| 日韩欧美中文一区| 91视频在线免费| 综合综合综合综合综合网| 亚洲欧美一区二区激情| 能直接看的av| 欧美 日韩 国产精品免费观看| 久久久久久高潮国产精品视| 在线观看国产亚洲| 首页欧美精品中文字幕| 成人在线视频网| 懂色av成人一区二区三区| 99精品黄色片免费大全| 日韩av一级大片| 哥也色在线视频| 亚洲成a人v欧美综合天堂| 黄色a级片免费| 国产精品第一| 亚洲成人教育av| av电影网站在线观看| 欧美电影免费播放| 国内精品久久久久| 国产在线观看第一页| 国产一区二区不卡老阿姨| 国产欧美日韩综合一区在线观看| 免费理论片在线观看播放老| 亚洲欧美电影院| 午夜肉伦伦影院| 亚洲毛片在线免费| 亚洲国产精品久久久久| 中国美女黄色一级片| 亚洲激情精品| 91日本视频在线| 三级做a全过程在线观看| 中文字幕一区二区三区精华液| 亚洲理论电影在线观看| jvid一区二区三区| 亚洲精品成人免费| 欧美一区二区三区爽爽爽| 午夜亚洲性色视频| 99国产在线观看| 91在线看黄| 天天综合色天天| 伊人成人222| 欧美禁忌电影| 久久久久女教师免费一区| 中文字幕在线观看你懂的| 成人国产电影网| 天堂av免费看| 日本国产欧美| 日韩大片免费观看视频播放| 色www亚洲国产阿娇yao| 亚洲欧美bt| 国产精品一级久久久| 欧美三级理伦电影| 欧美丝袜一区二区三区| 国产原创剧情av| 欧美一区二区三区免费看| 国产欧美日韩中文字幕| 天天射天天操天天干| 一区二区免费在线| 麻豆一区二区三区视频| 免费看成人吃奶视频在线| 久久久久久久久久国产精品| 999av视频| 国产精品久久久久久久久果冻传媒| 日韩久久一级片| 青青草久久爱| 高清在线视频日韩欧美| 亚洲AV无码精品国产| 亚洲精品成人天堂一二三| 日本黄色的视频| 国产精品97| 国产精品网址在线| 日本三级视频在线观看| 欧美日本不卡视频| 91n在线视频| 另类综合日韩欧美亚洲| 亚洲一二三区精品| 成人免费黄色| 色先锋资源久久综合5566| 欧美另类高清videos的特点| 国产三级久久久| www.99在线| 成人精品天堂一区二区三区| 国产精品美女免费看| av资源种子在线观看| 欧美日韩一区二区三区高清| 中文字幕第69页| 韩国成人精品a∨在线观看| 影音先锋亚洲视频| 久久的色偷偷| 久久99精品国产99久久6尤物| 国产三级第一页| 亚洲一区免费视频| 久久久久成人精品无码中文字幕| 国产精品五区| 色之综合天天综合色天天棕色| 成人国产精品入口免费视频| 三级精品视频久久久久| 国产精品主播一区二区| 一区二区三区精品在线| 99re久久精品国产| 三级亚洲高清视频| 日本黄色a视频| 亚洲网址在线观看| 78色国产精品| 超碰国产在线观看| 欧美一级一级性生活免费录像| 国产在线拍揄自揄拍| 99精品国产视频| 精品少妇无遮挡毛片| 国产韩国精品一区二区三区| 成人欧美一区二区| 久久爱91午夜羞羞| 中文字幕欧美日韩精品| 国产99对白在线播放| 婷婷国产在线综合| 欧美一区二区三区粗大| 国产精品原创巨作av| 日本精品久久久久久久久久| 国产尤物久久久| 亚洲最大成人网色| 97久久香蕉国产线看观看| 日韩视频免费在线观看| 少妇又色又爽又黄的视频| 色婷婷av一区二区三区软件| 青青青视频在线播放| 国产精品系列在线观看| 激情五月开心婷婷| 牛牛国产精品| 日韩欧美在线观看强乱免费| 亚洲一区二区电影| 国产精品igao视频| 欧美hdxxxx| 最近日韩中文字幕中文| 午夜福利视频一区二区| 欧美日韩卡一卡二| av黄色在线看| 亚洲精品高清视频在线观看| 国产 欧美 在线| 成人午夜电影网站| 色天使在线观看| 久久精品二区三区| 免费特级黄色片| 亚洲色图二区| 亚洲国产精品一区二区第一页| 成人看片爽爽爽| 成人精品一区二区三区| 日韩免费电影| 欧美在线视频a| 欧美hdxxx| 欧美美最猛性xxxxxx| av电影在线观看| 亚洲深夜福利网站| 天堂成人在线视频| 欧美大片一区二区| 国产精品爽爽久久| 欧美日韩一区二区三区在线| 日本视频免费观看| 福利一区视频在线观看| 日韩av一二三区| 夜夜精品浪潮av一区二区三区| 极品尤物一区二区| 国产欧美1区2区3区| 一级黄色片大全| 久久久久久久久久看片| 日本一区二区三区网站| 99精品视频一区| 无码人妻aⅴ一区二区三区| 国产盗摄视频一区二区三区| 中文字幕资源在线观看| 久久99精品国产.久久久久| 亚洲高清在线免费观看| 日产欧产美韩系列久久99| 无人在线观看的免费高清视频| 亚洲一区二区毛片| 久久9精品区-无套内射无码| 六月天综合网| 久久美女福利视频| 视频精品一区二区| 性chinese极品按摩| 精品一区在线看| 日本黄大片一区二区三区| 石原莉奈一区二区三区在线观看| 99爱视频在线| 日韩精品亚洲专区| 日韩中文字幕二区| 蜜乳av一区二区| 在线一区二区不卡| 丁香婷婷综合激情五月色| 国产又黄又粗又猛又爽的视频| 91免费视频网| 日本猛少妇色xxxxx免费网站| 中文字幕一区在线| 免费在线视频观看| 精品久久久久久久久久久久久久| 日韩免费在线视频观看| 欧美性猛交xxxx乱大交蜜桃| 精品久久久久久久久久久国产字幕| 欧美性大战久久久久久久蜜臀| 亚洲综合精品国产一区二区三区 | 亚洲www啪成人一区二区麻豆| 日本少妇吞精囗交| 色视频一区二区| 国产麻豆一精品一男同| 亚洲国产欧美一区| 久热av在线| 中文字幕亚洲精品| 最近高清中文在线字幕在线观看| 色一区av在线| 快射视频在线观看| 国内成人精品视频| 成人国产二区| 青草成人免费视频| 嫩草伊人久久精品少妇av杨幂| 国产日韩一区在线| 大型av综合网站| 久热这里只精品99re8久| 久久97视频| 免费成人深夜夜行网站视频| 亚洲激精日韩激精欧美精品| 99视频精品全部免费看| 亚洲欧美日韩国产综合精品二区| www亚洲成人| 国产一区二区三区视频在线播放| 久久久男人的天堂| 久久久亚洲精品石原莉奈| 97精品在线播放| 亚洲成人av资源| 影音先锋国产资源| 亚洲第一区中文99精品| 国产日本在线视频| 欧美美女18p| 免费成人高清在线视频| 国产高清一区视频| 99久久亚洲精品| 免费观看美女裸体网站| 日日夜夜精品免费视频| 高清中文字幕mv的电影| 欧美国产乱子伦| 日韩激情一区二区三区| 欧美视频三区在线播放| 性中国古装videossex| 伊是香蕉大人久久| 超免费在线视频| 91精品国产综合久久香蕉的用户体验| 亚洲国产最新| www.xxx麻豆| 性感少妇一区| 久久偷拍免费视频| 一区二区三区蜜桃| 一级做a爱片性色毛片| 日韩国产在线看| 青草在线视频| 亚洲va欧美va在线观看| 欧美色图婷婷| 美女扒开大腿让男人桶| 精品一区二区三区在线播放视频| 国产三级国产精品| 亚洲成人在线免费| av免费在线不卡| 一道本无吗dⅴd在线播放一区| 四虎影视成人| 成人激情春色网| 四季av一区二区三区免费观看| 精品人妻一区二区三区四区在线| 不卡免费追剧大全电视剧网站| 午夜69成人做爰视频| 欧美视频三区在线播放| 幼a在线观看| 国产精品久久91| 老牛国内精品亚洲成av人片| 91九色丨porny丨国产jk| 国产福利一区二区三区视频在线 | 欧美福利在线视频| 一区二区三区免费在线观看| 国产色综合视频| 中文字幕亚洲综合| 四虎精品在线观看| 亚洲精品一品区二品区三品区 | 欧美国产在线观看| www.日本精品| 亚洲欧美另类在线观看| 啊啊啊久久久| 蜜桃av噜噜一区二区三| 香蕉成人久久| 国产女主播喷水高潮网红在线| 精品二区三区线观看| 色婷婷在线视频| 国产激情999| 欧美精品一区二区三区中文字幕| 免费涩涩18网站入口| 国产精品视频免费看| 做爰视频毛片视频| 久久国产天堂福利天堂| 国产精品视频一区视频二区| 99色这里只有精品| av一本久道久久综合久久鬼色| 国产精品16p| 亚洲欧美国产高清va在线播| 高清不卡av| 日韩国产精品毛片| 国产一区二区三区四区五区入口| 国产高潮流白浆| 亚洲福利视频网| 天堂资源在线| 一区一区视频| 国产老肥熟一区二区三区| 日本熟女一区二区| 亚洲摸下面视频| yy6080久久伦理一区二区| 8x8ⅹ国产精品一区二区二区| 成人网页在线观看| 欧美特级黄色片| 中文字幕无线精品亚洲乱码一区 | 国产精品日韩精品中文字幕| 亚洲欧美国产中文| 亚洲蜜桃精久久久久久久| 丁香六月天婷婷| 国产精品欧美日韩久久| 亚洲天堂免费| 亚洲黄色小说视频| 91精品国产综合久久香蕉的特点| 免费污视频在线| 日本不卡免费新一二三区| 久久99精品久久久久| 精品不卡一区二区| 久久久精品国产网站| 精品一区欧美|