19,469
社区成员
发帖
与我相关
我的任务
分享
BOOL Delaunay::PolygonAlgorithmRadial(std::vector<vertex_d>& vecPolyon,int polyonNum,vertex_d &pt)
{
int n = vecPolyon.size() > polyonNum ? polyonNum : vecPolyon.size();
int count = 0;
vertex_d pV1;
pV1.SetY(pt.GetY());
pV1.SetX(Delaunay_INFINITY*-1);
edge * line = new edge(&pt,&pV1);
for( int i = 0; i < n; i++ ){
// 得到多边形的一条边
vertex_d side_pt1 = vecPolyon[i];
vertex_d side_pt2 = vecPolyon[(i + 1) % n];
edge * side = new edge(&side_pt1,&side_pt2);
if( IsOnline(&pt, side) ){
return TRUE ;
}
// 如果side平行x轴则不作考虑
if( fabs((double)(side->m_pV0->GetY() - side->m_pV1->GetY())) < Delaunay_ESP ) {
continue;
}
if( IsOnline((vertex_d *)side->m_pV0, line) ){
if( side->m_pV0->GetY() > side->m_pV1->GetY())
count++;
}
else if( IsOnline((vertex_d *)side->m_pV1, line) ){
if( side->m_pV1->GetY() > side->m_pV0->GetY() )
count++;
} else if( Intersect(line, side) ){
count++;
}
}
if ( count % 2 == 1 ){
return TRUE;
}else {
return FALSE;
}
}
float Delaunay::Multiply(vertex_d * P0, vertex_d * P1, vertex_d * P2)
{
return ((P1->GetX() - P0->GetX()) * (P2->GetY() - P0->GetY())
- (P2->GetX() - P0->GetX()) * (P1->GetY() - P0->GetY()));
}
bool Delaunay::IsOnline(vertex_d * point, edge * line)
{
return ((fabs(Multiply((vertex_d *)line->m_pV0, (vertex_d *)line->m_pV1, point)) < Delaunay_ESP ) &&
(( point->GetX() - line->m_pV0->GetX() ) * ( point->GetX() - line->m_pV1->GetX() ) <= 0 ) &&
(( point->GetY() - line->m_pV0->GetY() ) * ( point->GetY() - line->m_pV1->GetY() ) <= 0 )
);
}
bool Delaunay::Intersect(edge * L1, edge * L2)
{
return ((max(L1->m_pV0->GetX(), L1->m_pV1->GetX()) >= min(L2->m_pV0->GetX(), L2->m_pV1->GetX())) &&
(max(L2->m_pV0->GetX(), L2->m_pV1->GetX()) >= min(L1->m_pV0->GetX(), L1->m_pV1->GetX())) &&
(max(L1->m_pV0->GetY(), L1->m_pV1->GetY()) >= min(L2->m_pV0->GetY(), L2->m_pV1->GetY())) &&
(max(L2->m_pV0->GetY(), L2->m_pV1->GetY()) >= min(L1->m_pV0->GetY(), L1->m_pV1->GetY())) &&
(Multiply((vertex_d *)L2->m_pV0, (vertex_d *)L1->m_pV1, (vertex_d *)L1->m_pV0) * Multiply((vertex_d *)L1->m_pV1, (vertex_d *)L2->m_pV1, (vertex_d *)L1->m_pV0) >= 0) &&
(Multiply((vertex_d *)L1->m_pV0, (vertex_d *)L2->m_pV1, (vertex_d *)L2->m_pV0) * Multiply((vertex_d *)L2->m_pV1, (vertex_d *)L1->m_pV1, (vertex_d *)L2->m_pV0) >= 0)
);
}