28 幾何演算法 點集中最短距離點對的距離

2021-10-05 18:29:05 字數 3410 閱讀 2937

求取輸入點集最近點對的距離

相比於對所有點對窮舉,並得出結果的方式相比,

本演算法時間複雜度為θ(nlg(n)),優於窮舉下的θ(n^2)

extern "c" class algorithmlib mindistance

; class flagpoint

; mindistance();

~mindistance();

double run(const datastruct::array::dynarray>& poarr_);

private:

double calculatemindistance(

const datastruct::array::dynarray& arrpos_,

const datastruct::array::dynarray& arrsortedbyx_,

const datastruct::array::dynarray& arrsortedbyy_);

};

mindistance::flagpoint::flagpoint()

mindistance::flagpoint::flagpoint(math::point<2>* ppo_, flag nflag_)

mindistance::flagpoint::~flagpoint()

mindistance::mindistance()

mindistance::~mindistance()

double mindistance::run(const datastruct::array::dynarray>& arrpos_)

datastruct::array::dynarray_parrfpossortedbyx = _parrfpo;

_parrfpossortedbyx.sort(

(const flagpoint*& po1_, const flagpoint*& po2_)

else if (_nret < 0.0)

else

});datastruct::array::dynarray_parrfpossortedbyy = _parrfpo;

_parrfpossortedbyy.sort(

(const flagpoint*& po1_, const flagpoint*& po2_)

else if (_nret < 0.0)

else

});double _nmin = calculatemindistance(

_parrfpo,

_parrfpossortedbyx,

_parrfpossortedbyy);

for (int _i = 0; _i < _nsize; _i++) }

double mindistance::calculatemindistance(

const datastruct::array::dynarray& parrfpos_,

const datastruct::array::dynarray& parrfpossortedbyx_,

const datastruct::array::dynarray& parrfpossortedbyy_)

double _nd = geometry::getdistance(parrfpos_[_i]->m_pop, parrfpos_[_j]->m_pop);

if (_nmindistance < _nd)

}} return _nmindistance;

} // 對n個節點做型別劃分

for (int _i = 0; _i < _nsize; _i++)

else

}// 劃分為兩個集合

datastruct::array::dynarray_parrposleft;

datastruct::array::dynarray_parrleftsortedbyx;

datastruct::array::dynarray_parrleftsortedbyy;

datastruct::array::dynarray_parrposright;

datastruct::array::dynarray_parrrightsortedbyx;

datastruct::array::dynarray_parrrightsortedbyy;

for (int _i = 0; _i < _nsize; _i++)

else

if (parrfpossortedbyx_[_i]->m_nflag == flag::left)

else

if (parrfpossortedbyy_[_i]->m_nflag == flag::left)

else

}double _nmindleft = calculatemindistance(_parrposleft, _parrleftsortedbyx, _parrleftsortedbyy);

double _nmindright = calculatemindistance(_parrposright, _parrrightsortedbyx, _parrrightsortedbyy);

double _nmin = std::fmin(_nmindleft, _nmindright);

datastruct::array::dynarray_parrmidareasortedbyy;

double _nmiddlex = parrfpossortedbyx_[_nsize / 2]->m_pop.m_npos[0];

for (int _i = 0; _i < _nsize; _i++) }

int _nmiddleareasize = _parrmidareasortedbyy.getsize();

for (int _i = 0; _i < _nmiddleareasize; _i++) }

return _nmin;

}

演算法思想:

演算法:求取輸入點集a最小距離

若點集a中,點的個數小於或等於3,直接給出結果。

對點集a一分為二,al,ar

對al,ar分別用演算法求取al,ar最小距離d_al,d_ar

令d = min(d_al, d_ar)

處理,最小距離兩點乙個位於al,乙個位於ar的情形

構造以中線兩邊距離中線距離為d或不足d的點構成的點集p

對點集p中點按y座標排序

對點集p中每個點,依次與其後7個點比較。

如此,得到乙個p中點的最小距離d_p

返回min(d, d_p)

最短距離的點 ACM

給出一些整數對,它們表示一些平面上的座標點,給定乙個點,求所有那些點到該點最短距離的點。結構為 第乙個整數對為所給定的點,後面的整數對為所有其他的點。第乙個整數對為所給定的點,後面的整數對為所有其他的點。到第乙個點最短距離的點 樣例輸入 9 21 0 1 10 0 1 22 1 樣例輸入 2 1 i...

求球面兩點最短距離

problem 給定球的半徑,兩點的經緯度,求這兩點間的最短距離。solution 球面兩點間距離公式 r acos cos wa cos wb cos jb ja sin wa sin wb r代表半徑,wa是a點的緯度,wb是b點的緯度,ja是a點的經度,jb是b點的經度,去北緯為正,東經為正。...

C 兩點之間最短距離

兩點之間最短距離 這是我的乙個測試,也是我學習html的 起點,他們說乙個合格的程式設計師必須學會html,我比他們起步晚了一些,可是我認為還來的及,以後我就用html來記錄我的學習記錄了。問題的提出 在二維平面的n個點上,找出其中的一對點,使得在n個點組成的所有的點中,該點對的距離最小。方法一 暴...