二、凸包問題
所謂最近對問題就是在包含n個點集中,找出距離最近的兩個點。為了找出最近對,只需要分別計算每一對點之間的距離,然後找出距離最小的那一對即可。
//使用蠻力法求平面中距離最近的兩個點
//輸入:乙個n個點的集合
//輸出:最近的兩個點
d←∞for i←1 to i←n-1 do
for j←i+1 to n do
d ←min(d,sqrt((xi-xj)²+(yi-yj)²)) //sqrt是開平方函式
#include
"iostream"
#include
"time.h"
#include
"stdlib.h"
#include
"limits.h"
// 匯入最大值
#include
"math.h"
//呼叫pow函式
using namespace std;
void
tofind
(int a[10]
[2],
int length)}}
cout<<
"最近的一對點是"
<
1<<
","<
1<<
",它們的距離是"
凸包問題就是在乙個有n個點集的平面上,找出所有的「極點」,這些極點所構成的邊界能夠把其他所有的點都能包含在內。
基於「邊界包含所有的點」的思想,對於在n個點集中的兩個點pi和pj,當且僅當該集合中的其他點都位於穿過這兩點的直線的同一邊時,它們的連線是該集合凸包邊界的一部分。運用平面解析幾何的知識:
座標平面的兩個點(x1,y1),(y1,y2)可滿足直線方程:ax+by=c
於是可以得到:a=y2-y1,b=x1-x2,c=x1y2-y1x2。
所以程式的大致思路如下:
1.任意取兩個點確定一種a,b,c三個引數。
2.將每一對點代入到所確定的a,b,c中,判定ax+by>c還是ax+by
程式流程圖(偽)如下:
//儲存最後的結果
int num=0;
//統計極點數量
bool cal
(int arry[10]
[2],
int length,
int a,
int b,
int c)
//解析幾何計算
return flag1!=flag2;
//一真一假說明所有的點在同一邊
}void
tofind
(int arry[10]
[2],
int length)
else
//不是第一次,則要檢測是否有重複的點
if(result[k][0
]==arry[j][0
]&&result[k][1
]==arry[j][1
])//檢測第二個點是否重複 }if
(flag1==true)
//第乙個點不重複的話
if(flag2==true)
//第二個點不重複的話 }}
}}}int
main()
}for
(int i=
0;i<
10;i++
) cout<
}int length=
sizeof
(a)/
sizeof
(a[0])
;tofind
(a,length)
; cout<<
"構成凸包的極點座標:"
分治法解決凸包問題
問題 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,凸包問題是為集合s構造最小凸多邊形。思路設p1 x1,y1 p2 x2,y2 pn xn,yn 按照x軸座標公升序排列,則最左邊的點p1和最右邊的點p2一定是該集合的凸包頂點。如圖1所示。設p1pn是經過點p1...
凸包問題(蠻力法)
蠻力法求解凸包問題的基本思想 對於由n個點構成的集合s中的兩個點pi和pj,當且僅當該集合中的其他點都位於穿過這兩點的直線的同一邊時 假定不存在三點同線的情況 它們的連線是該集合凸包邊界的一部分。對每一對頂點都檢驗一遍後,滿足條件的線段構成了該凸包的邊界。在平面上,穿過兩個點 x1,y1 和 x2,...
分治法 凸包問題
什麼是凸包?我的理解就是,圖形任意兩點的連線都沒有在圖形外部。問題 給定點集,怎麼求出凸包的邊界點呢?第一步 給這些點按照x的從大到小進行排序,如果x相同的按照y再排序。第二步 把x最小的和最大的連起來,他們必為凸包的邊界點。第三步 把平面區域分為兩個部分,分別在上面和下面去找面積最大的三角形 面積...