단순 폴리곤이 평면에 의해 분할이 일어난다면 폴리곤은 평면에 의해 2개로 나뉘어 집니다.
분할이 일어나는 조건은 폴리곤을 이루는 점들이 평면의 한쪽에 치우쳐 존재하지 않고 양쪽에 모두 존재해야 한다는 것입니다.
분할되는 교점은 아래 평면과 직선의 교점에서 구할 수가 있습니다. 단순 폴리곤에서 교점은 2개가 존재하게 됩니다.(intsec1 , intsec2)
2개의 폴리곤은 아래의 그림처럼 구할 수가 있습니다.(분홍색으로 이루어진 폴리곤 , 푸른색으로 이루어진 폴리곤)
이렇게 해서 단순 폴리곤의 평면에 대한 분할에 대해 간단히 알아보았습니다.
분할이 일어나는 조건은 폴리곤을 이루는 점들이 평면의 한쪽에 치우쳐 존재하지 않고 양쪽에 모두 존재해야 한다는 것입니다.
분할되는 교점은 아래 평면과 직선의 교점에서 구할 수가 있습니다. 단순 폴리곤에서 교점은 2개가 존재하게 됩니다.(intsec1 , intsec2)
2개의 폴리곤은 아래의 그림처럼 구할 수가 있습니다.(분홍색으로 이루어진 폴리곤 , 푸른색으로 이루어진 폴리곤)
이렇게 해서 단순 폴리곤의 평면에 대한 분할에 대해 간단히 알아보았습니다.
CIsPoly3d* CIsPoly3d::PartionWithPlane3d(CIsPlane3d plane)
{
unsigned int count = 0;
unsigned int edge[2] = {-1 ,};
CIsPoint3d intsec[2];
int i = 0;
for(vector<CIsPoint3d>::iterator itr = m_pVertexEntry->begin();(itr + 1) != m_pVertexEntry->end() && (count < 2);itr++ , i++)
{
CIsPoint3d start = *itr;
CIsPoint3d end = *(itr + 1);
CIsPoint3d at;
if(plane.FindIntersectionPoint(at , start , end))
{
edge[count] = i;
intsec[count++] = at;
}
}
if(2 == count)
{
CIsPoint3d last;
CIsPoly3d* pRet = new CIsPoly3d[2];
//////////////////////////////////////////////////////////////////////////
/// first poly3d
for(i = 0;i < edge[0] + 1;i++)
{
last = (*m_pVertexEntry)[i];
pRet[0].AddVertex(last);
}
if(last != intsec[0]) pRet[0].AddVertex(intsec[0]);
last = intsec[1];
pRet[0].AddVertex(last);
for(i = edge[1] + 1;i < m_pVertexEntry->size();i++)
{
if(last != (*m_pVertexEntry)[i]) pRet[0].AddVertex((*m_pVertexEntry)[i]);
last = (*m_pVertexEntry)[i];
}
//////////////////////////////////////////////////////////////////////////
/// second poly3d
last = intsec[0];
pRet[1].AddVertex(last);
for(i = edge[0] + 1;i < edge[1] + 1;i++)
{
if(last != (*m_pVertexEntry)[i]) pRet[1].AddVertex((*m_pVertexEntry)[i]);
last = (*m_pVertexEntry)[i];
}
if(last != intsec[1]) pRet[1].AddVertex(intsec[1]);
if(intsec[0] != intsec[1]) pRet[1].AddVertex(intsec[0]);
return pRet;
}
return NULL;
}
댓글
댓글 쓰기