기하학 적 알고리즘 - 점 집합 볼록 패키지
4391 단어 Algorithm&DataStruct
인터페이스 디자인
extern "C" class ALGORITHMLIB ConvexHull
{
public:
ConvexHull();
~ConvexHull();
DataStruct::Stack::DynStack<:point>> Run(const DataStruct::Array::DynArray<:point>>& poArr_);
};
이루어지다
구조
ConvexHull::ConvexHull()
{
}
분석 하여 구성 하 다
ConvexHull::~ConvexHull()
{
}
알고리즘 실행
DataStruct::Stack::DynStack<:point>> ConvexHull::Run(
const DataStruct::Array::DynArray<:point>>& arrPos_)
{
// s
// n y , y , x
// n-1 , s , n-1
DataStruct::Stack::DynStack<:point>> _sRet;
int _nSize = arrPos_.GetSize();
if (_nSize <= 3)
{
return _sRet;
}
Math::Point<2> _poS = arrPos_[0];
for (int _i = 1; _i < _nSize; _i++)
{
if (arrPos_[_i].m_nPos[1] < _poS.m_nPos[1]
|| (arrPos_[_i].m_nPos[1] == _poS.m_nPos[1] && arrPos_[_i].m_nPos[0] < _poS.m_nPos[0]))
{
_poS = arrPos_[_i];
}
}
// n , _poS n
DataStruct::Array::DynArray<:point>> _arrPos = arrPos_;
_arrPos.Sort([_poS](const Math::Point<2>& po1_, const Math::Point<2>& po2_)->int
{
Math::Vector<2> _vec1(_poS, po1_);
Math::Vector<2> _vec2(_poS, po2_);
double _nAngle1 = Geometry::GetAngle(_vec1);
double _nAngle2 = Geometry::GetAngle(_vec2);
double _nRet = _nAngle1 - _nAngle2;
if (_nRet > 0)
{
return 1;
}
else if (_nRet < 0)
{
return -1;
}
else
{
double _nLen1 = _vec1.GetLength();
double _nLen2 = _vec2.GetLength();
_nRet = _nLen1 - _nLen2;
if (_nRet > 0)
{
return 1;
}
else if (_nRet < 0)
{
return -1;
}
else
{
return 0;
}
}
});
// s , p
_sRet.Push(_poS);
int _nIndex = 0;
while (_nIndex < _nSize)
{
if (_poS == _arrPos[_nIndex])
{
_nIndex++;
}
else
{
_sRet.Push(_arrPos[_nIndex]);
_nIndex++;
break;
}
}
// ,
for (int _i = _nIndex; _i < _nSize; _i++)
{
// q
// q, ,
while (true)
{
// , q , , q ,
// , q , 。
// , q, ,
// q , , , 。
if (_sRet.Peek() == _arrPos[_i])
{
break;
}
Math::Vector<2> _vec1(_sRet.Peek(1), _sRet.Peek());
Math::Vector<2> _vec2(_sRet.Peek(), _arrPos[_i]);
Geometry::ROTATE_DIRECTION _dir = Geometry::TestDirection(_vec1, _vec2);
if (_dir == Geometry::ROTATE_DIRECTION::ANTICLOCK)
{
_sRet.Push(_arrPos[_i]);
break;
}
else if (_dir == Geometry::ROTATE_DIRECTION::NO_ROTATE)
{
_sRet.Pop();
_sRet.Push(_arrPos[_i]);
break;
}
else
{
_sRet.Pop();
}
}
}
// ,
// 3,
// 3,
if (_sRet.GetSize() < 3)
{
return DataStruct::Stack::DynStack<:point>>();
}
else
{
return _sRet;
}
}
알고리즘 성질 & 정확성 증명
:
: , 。
A
A :
y 【 y x 】 p n 0,...,n-1 ,
i [0,n-1], j=(i+1) % (n)
i j
:
, y 【 y x 】 p 。
, 。
p q 。
:
,
p q , 。 。
k
t p , , , , +t, p 。
t p , ,
t , t
t p , , t p 。
1. t p , ,
q1 ,q2
1.1. q2->q1 q1->t
, 1
q2->q1,q1->t
q1->t,t->p
,p...q1
p...q1,t 。 。
1.2. q2->q1 q1->t
q1
p->...->q2->t->p q1
, , q2->q1,q1->t , t p->q1 , 。
,
p->...->t
2. t p , ,
2.1. t , t,
p...q1 。 。
2.1. t p , ,
p...p2,t 。 。
,
k
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
하나의 수조를 깊이가 가장 낮은 두 갈래 나무로 바꾸다문제 정의: Givena sorted(increasing order) array, write an algorithm to create abinary tree with minimal height. 생각: 이 문제는 비...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.