先介紹一些平面解析幾何的知識,可以用來解決比如判斷線段相交,判斷點在多邊形內等等問題,還有幾道題目,有興趣的自己做做:)
1. 矢量減法
設二維矢量 P = (x1,y1) ,Q = (x2,y2)
則矢量減法定義爲: P - Q = ( x1 - x2 , y1 - y2 )
顯然有性質 P - Q = - ( Q - P )
如不加說明,下面所有的點都看作矢量,兩點的減法就是矢量相減;
2.矢量叉積
設矢量P = (x1,y1) ,Q = (x2,y2)
則矢量叉積定義爲: P × Q = x1*y2 - x2*y1 得到的是一個標量
顯然有性質 P × Q = - ( Q × P ) P × ( - Q ) = - ( P × Q )
如不加說明,下面所有的點都看作矢量,點的乘法看作矢量叉積;
叉乘的重要性質:
> 若 P × Q > 0 , 則P 在Q的順時針方向
> 若 P × Q < 0 , 則P 在Q的逆時針方向
> 若 P × Q = 0 , 則P 與Q共線,但可能同向也可能反向
3.判斷點在線段上
設點爲Q,線段爲P1P2 ,判斷點Q在該線段上的依據是:
( Q - P1 ) × ( P2 - P1 ) = 0 且 Q 在以 P1,P2爲對角頂點的矩形內
4.判斷兩線段是否相交
我們分兩步確定兩條線段是否相交:
(1). 快速排斥試驗
設以線段 P1P2 爲對角線的矩形爲R, 設以線段 Q1Q2 爲對角線的矩形爲T,如果R和T不相
交,顯然兩線段不會相交;
(2). 跨立試驗
如果兩線段相交,則兩線段必然相互跨立對方,如圖1所示。在圖1中,P1P2跨立Q1Q2 ,則
矢量 ( P1 - Q1 ) 和( P2 - Q1 )位於矢量( Q2 - Q1 ) 的兩側,即
( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0
上式可改寫成
( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0
當 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 時,說明 ( P1 - Q1 ) 和 ( Q2 - Q1 )共線,
但是因爲已經通過快速排斥試驗,所以 P1 一定在線段 Q1Q2上;同理,( Q2 - Q1 ) ×(
P2 - Q1 ) = 0 說明 P2 一定在線段 Q1Q2上。
所以判斷P1P2跨立Q1Q2的依據是:
( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) ≥ 0
同理判斷Q1Q2跨立P1P2的依據是:
( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) ≥ 0
至此已經完全解決判斷線段是否相交的問題。
和上述知識有關的題目主要有:(acm.zju.edu.cn)
1280 Intersecting Lines 幾何題,求兩直線交點
1648 Circuit Board 典型的判斷線段相交,用上面所說的叉乘
1081 Points Within 判斷點是否在多邊形內部,可以用叉乘解決,
有點麻煩,大家想一想
計算幾何基礎
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
【小白】【大學】一名嵌入式軟件開發小白的單片機學習歷程、心路歷程、經驗分享
Bright-SKY
2020-06-28 08:52:02
本程序主要實現了一個方陣的求逆與實現了逆矩陣和原矩陣的乘積爲單位矩陣
#include<stdio.h> #define M 10 int main() { void chengji(int n); float a[M][M*2]; float b[M][M*2];
FreeMing-imduingui0
2020-06-17 14:09:16
Icon class生成器(Python)
FreeMing-imduingui0
2020-06-17 14:09:16
平靜:在等待的日子裏
TheMadMan
2020-06-13 08:11:13
基於51單片機的貪喫蛇遊戲
Lonficer
2020-06-07 10:02:43
我的考研經歷(從華工應數到中大軟件所)
pascal_sunhong
2020-02-25 23:53:32
ICPC2004北京賽區回憶
pascal_sunhong
2020-02-25 23:53:22
我爲汕頭大學OJ出的題目-Reverse Points
pascal_sunhong
2020-02-25 23:53:22
西安電子科技大學計算機安全導論期末試題(2019.12)
Lonficer
2020-02-24 10:00:29
2013年度總結,工作學習的道路上風雨皆有
TheMadMan
2020-02-22 01:00:08
畢業,工作+工作+工作。
TheMadMan
2020-02-22 01:00:08
angularjs ng-click傳參控制ng-repeat元素顯示與隱藏
FreeMing-imduingui0
2020-02-21 01:46:11
Nodejs學習筆記(一)
FreeMing-imduingui0
2020-02-21 01:46:10