Files
envi-code/SourceCode/Code2026/Dimension/Ge3DFace.cpp
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

917 lines
19 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "StdAfx.h"
#include "globalfunc.h"
#include "RBList.h"
#include "GeLine.h"
#include "Ge3DFace.h"
#include "Ge3DFace3Pt.h"
#include "GePoly3D.h"
static int CompareDouble(double x1, double x2)
{
if (fabs(x1 - x2) < g_Option::instance()._DIST_SNAP)
{
return 0;
}
if (x1 < x2)
{
return -1;
}
return 1;
}
static int ComparePointByX(const ADSGePoint3d *p1, const ADSGePoint3d *p2)
{
if (fabs(p1->x - p2->x) < g_Option::instance()._DIST_SNAP)
{
return 0;
}
if (p1->x < p2->x)
{
return -1;
}
return 1;
}
Ge3DFace::Ge3DFace(int tag)
: m_nFlag(tag)
{
}
Ge3DFace::Ge3DFace(const AcDbFace &face)
: m_nFlag(0)
{
for (int i = 0; i < 4; i++)
{
face.getVertexAt(i, m_ptVertex[i]);
Adesk::Boolean bVis = Adesk::kTrue;
face.isEdgeVisibleAt(i, bVis);
if (!bVis)
{
if (i == 0)
{
m_nFlag |= 0x01;
}
else if (i == 1)
{
m_nFlag |= 0x02;
}
else if (i == 2)
{
m_nFlag |= 0x04;
}
else
{
m_nFlag |= 0x08;
}
}
}
}
Ge3DFace::Ge3DFace(EntitySet &entFace, ads_matrix tranMat)
: m_nFlag(0)
{
if (!entFace.Is(_T("3DFACE")))
{
m_nFlag |= FLAG_UNNORMAL;
return;
}
entFace.GetData(70, &m_nFlag);
for (int i = 0; i < 4; i++)
{
ADSGePoint3d pt;
entFace.GetData(10 + i, pt);
if (tranMat)
{
GlobalFunc::PointTransformBy(tranMat, pt, m_ptVertex[i]);
}
else
{
m_ptVertex[i] = pt;
}
if (fabs(m_ptVertex[i].x) > 1.0E9 || fabs(m_ptVertex[i].y) > 1.0E9
|| fabs(m_ptVertex[i].z) > 1.0E9)
{
m_nFlag |= FLAG_UNNORMAL;
}
}
}
// 把两个3Dface3C并成一个3Dface
Ge3DFace::Ge3DFace(Ge3DFace3Pt &face1, Ge3DFace3Pt &face2)
: m_nFlag(0)
{
GeLine line1, line2;
if (face1.GetMergeLine(&line1) != RTNORM
|| face2.GetMergeLine(&line2) != RTNORM
|| !(line1 == line2))
{
m_nFlag |= FLAG_UNNORMAL;
return;
}
ads_vector vt;
GlobalFunc::PlaneNormalBy3Pt(face1.GetVertex(0), face1.GetVertex(1), face1.GetVertex(2), vt);
STPlanePara plan;
GlobalFunc::GetPlaneEquation(face1.GetVertex(0), vt, &plan);
Point prjPt, srcPt = face2.GetVertex(face2.OppHidePoint());
GlobalFunc::PointProjectToPlane(srcPt, &plan, prjPt);
if (!(prjPt == srcPt))
{
m_nFlag |= FLAG_UNNORMAL;
return;
}
int index1 = face1.MergeEdge();
int index2 = face2.MergeEdge();
if (index1 < 0 || index2 < 0)
{
m_nFlag |= FLAG_UNNORMAL;
return;
}
m_ptVertex[0] = face1.GetVertex(face1.OppHidePoint());
m_ptVertex[1] = line1.GetStartPoint();
m_ptVertex[2] = face2.GetVertex(face2.OppHidePoint());
m_ptVertex[3] = line1.GetEndPoint();
}
Ge3DFace::Ge3DFace(const Ge3DFace& pFace)
{
CopyFrom(&pFace);
}
Ge3DFace::~Ge3DFace()
{
}
int Ge3DFace::operator !() const
{
return (m_nFlag & FLAG_UNNORMAL);
}
Ge3DFace& Ge3DFace::operator = (const Ge3DFace &face)
{
if (this != &face)
{
CopyFrom(&face);
}
return *this;
}
Ge3DFace & Ge3DFace::operator << (int nBit)
{
for (int i = 0; i < nBit; i++)
{
MoveShift(FALSE);
}
return *this;
}
Ge3DFace & Ge3DFace::operator >> (int nBit)
{
for (int i = 0; i < nBit; i++)
{
MoveShift(TRUE);
}
return *this;
}
int Ge3DFace::Modify(EntitySet &entFace)
{
if (!entFace.Is(_T("3DFACE")))
{
return RTERROR;
}
for (int i = 0; i < 4; i++)
{
if (fabs(m_ptVertex[i].x) > 1.0E9
|| fabs(m_ptVertex[i].y) > 1.0E9
|| fabs(m_ptVertex[i].z) > 1.0E9)
{
ads_printf(_T("\nInorder to modify 3Dface with bad m_ptVertex!"));
}
entFace.SetData(10 + i, &m_ptVertex[i].x);
}
entFace.SetData(70, m_nFlag);
return entFace.Modify();
}
// nMethod: 0-采用标记来判断,1-采用首没点是否相同来判断,2-采用任意相邻2点相等来判断
BOOL Ge3DFace::IsTriangle(int nMethod) const
{
if (nMethod == 0)
{
return ((m_nFlag & FLAG_TRIANGLE) != 0);
}
else if (nMethod == 1)
{
return (m_ptVertex[0].Distance(m_ptVertex[3]) < g_Option::instance()._DIST_SNAP);
}
BOOL bTri = (m_ptVertex[0].Distance(m_ptVertex[3]) < g_Option::instance()._DIST_SNAP
|| m_ptVertex[1].Distance(m_ptVertex[0]) < g_Option::instance()._DIST_SNAP
|| m_ptVertex[2].Distance(m_ptVertex[1]) < g_Option::instance()._DIST_SNAP
|| m_ptVertex[3].Distance(m_ptVertex[2]) < g_Option::instance()._DIST_SNAP);
return bTri;
}
BOOL Ge3DFace::IsVisible(int nSide) const
{
ASSERT(nSide >= 0 && nSide <= 3);
int bitFlag = (0x01 << nSide);
return ((m_nFlag & bitFlag) == 0);
}
void Ge3DFace::SetVisible(int nSide, BOOL bTrue)
{
ASSERT(nSide >= 0 && nSide <= 3);
int bitFlag = (0x01 << nSide);
if (bTrue)
{
m_nFlag &= ~bitFlag;
}
else
{
m_nFlag |= bitFlag;
}
}
void Ge3DFace::MoveShift(BOOL bForward)
{
Ge3DFace face1(*this);
for (int i = 0; i < 4; i++)
{
BOOL iNext = (bForward ? i - 1 : i + 1);
if (iNext == 4)
{
iNext = 0;
}
else if (iNext == -1)
{
iNext = 3;
}
GetVertex(i) = face1.GetVertex(iNext);
SetVisible(i, face1.IsVisible(iNext));
}
}
TVector3D Ge3DFace::GetNormal() const
{
TVector3D vt1 = m_ptVertex[1] - m_ptVertex[0];
TVector3D vt2 = m_ptVertex[2] - m_ptVertex[0];
BOOL b1 = (vt1.Length() < 1.0E-6);
BOOL b2 = (vt2.Length() < 1.0E-6);
if (b1 || b2)
{
if (b2)
{
#ifndef NDEBUG
g_Option::instance().adsout << _T("\n无效的3dface!");
#endif
return TVector3D(0,0,1);
}
#ifndef NDEBUG
g_Option::instance().adsout << _T("\n不好的3dface!");
#endif
vt1 = m_ptVertex[3] - m_ptVertex[0];
if (vt1.Length() < 1.0E-6)
{
return TVector3D(0,0,1);
}
}
using namespace GlobalFunc;
TVector3D vtNorm = vt1 * vt2;
vtNorm /= vtNorm.Length();
return vtNorm;
}
AcDbFace *Ge3DFace::AsDbFace() const
{
AcDbFace *pDbFace = new AcDbFace(m_ptVertex[0], m_ptVertex[1], m_ptVertex[2], m_ptVertex[3],
((m_nFlag & 0x01) == 0), ((m_nFlag & 0x02) == 0), ((m_nFlag & 0x04) == 0), ((m_nFlag & 0x08) == 0));
return pDbFace;
}
// 对3dface进行切割
BOOL Ge3DFace::SectByPlane(const GePlane &plan, PtrList<Ge3DFace> &upFaces, PtrList<Ge3DFace> &downFaces) const
{
GePlane thisPlan;
if (!thisPlan.SetFrom3p(GetVertex(0), GetVertex(1), GetVertex(2)))
{
return FALSE;
}
GeLine lnSect;
if (!thisPlan.Intersect(plan, lnSect))
{
return FALSE;
}
int nOldNumUp = upFaces.Length();
int nOldNumDown = downFaces.Length();
TVector3D vtSect = plan.GetNormal();
TVector3D vt_y = lnSect.Direction3d();
TVector3D vt_z(thisPlan.GetParaA(), thisPlan.GetParaB(), thisPlan.GetParaC());
using namespace GlobalFunc;
TVector3D vt_x = vt_z * vt_y;
AcGeMatrix3d mat, matRev;
matRev.setCoordSystem(lnSect.GetStartPoint(), vt_x, vt_y, vt_z);
mat = matRev.inverse();
((AcGeVector3d &)vtSect).transformBy(mat);
ads_matrix adsMat;
AsAdsMatrix(mat, adsMat);
Ge3DFace thisFace(*this);
for (int i = 0; i < 4; i++)
{
thisFace.GetVertex(i).TransformBy(adsMat);
}
if (!(thisFace.GetFlag() & FLAG_TRIANGLE))
{
if (thisFace.IsTriangle(1))
{
int nFlag = thisFace.GetFlag();
nFlag |= FLAG_TRIANGLE;
thisFace.SetFlag(nFlag);
}
}
BOOL bRet = TRUE;
if (!(thisFace.GetFlag() & FLAG_TRIANGLE))
{
BOOL bHide0 = ((thisFace.GetFlag() & 0x01) != 0);
BOOL bHide1 = ((thisFace.GetFlag() & 0x02) != 0);
BOOL bHide2 = ((thisFace.GetFlag() & 0x04) != 0);
BOOL bHide3 = ((thisFace.GetFlag() & 0x08) != 0);
Ge3DFace tri1, tri2;
tri1.SetVertex(0, thisFace.GetVertex(0));
tri1.SetVertex(3, thisFace.GetVertex(0));
int nFlag = tri1.GetFlag();
if (bHide0)
{
nFlag |= 0x01;
}
tri1.SetVertex(1, thisFace.GetVertex(1));
if (bHide1)
{
nFlag |= 0x02;
}
tri1.SetVertex(2, thisFace.GetVertex(2));
nFlag |= 0x04; //不可见
tri2.SetVertex(0, thisFace.GetVertex(2));
tri2.SetVertex(3, thisFace.GetVertex(2));
tri2.SetVertex(1, thisFace.GetVertex(3));
tri2.SetVertex(2, thisFace.GetVertex(0));
int nFlagTri2 = tri2.GetFlag();
if (bHide2)
{
nFlagTri2 |= 0x01;
}
if (bHide3)
{
nFlagTri2 |= 0x02;
}
nFlag |= FLAG_TRIANGLE;
nFlagTri2 |= 0x04;
nFlagTri2 |= FLAG_TRIANGLE;
tri1.SetFlag(nFlag);
tri2.SetFlag(nFlagTri2);
tri1.SubSortVertex();
if (vtSect.x < 0.0)
{
bRet = tri1.SubSectByX(0.0, upFaces, downFaces);
}
else
{
bRet = tri1.SubSectByX(0.0, downFaces, upFaces);
}
tri2.SubSortVertex();
if (vtSect.x < 0.0)
{
bRet = tri2.SubSectByX(0.0, upFaces, downFaces);
}
else
{
bRet = tri2.SubSectByX(0.0, downFaces, upFaces);
}
}
else
{
thisFace.SubSortVertex();
if (vtSect.x < 0.0)
{
bRet = thisFace.SubSectByX(0.0, upFaces, downFaces);
}
else
{
bRet = thisFace.SubSectByX(0.0, downFaces, upFaces);
}
}
// 转回三维坐标系
ads_matrix matTo3d;
AsAdsMatrix(matRev, matTo3d);
TVector3D vtMe = GetNormal();
for (i = nOldNumUp; i < upFaces.Length(); i++)
{
Ge3DFace *pFace = upFaces[i];
pFace->TransformBy(matTo3d);
if ((AcGeVector3d &)pFace->GetNormal() != (AcGeVector3d &)vtMe)
{
pFace->Reverse();
}
}
for (i = nOldNumDown; i < downFaces.Length(); i++)
{
Ge3DFace *pFace = downFaces[i];
pFace->TransformBy(matTo3d);
if ((AcGeVector3d &)pFace->GetNormal() != (AcGeVector3d &)vtMe)
{
pFace->Reverse();
}
}
return bRet;
}
int Ge3DFace::Make(const TCHAR *lay) const
{
RBList ebuf = ads_buildlist(RTDXF0, _T("3DFACE"), 10, &m_ptVertex[0], 11, &m_ptVertex[1],
12, &m_ptVertex[2], 13, &m_ptVertex[3], 70, m_nFlag, NULL);
if (lay)
{
ebuf.SetData(8, lay);
}
return ads_entmake(ebuf);
}
Ge3DFace & Ge3DFace::MakeBetter()
{
Ge3DFace face(*this);
if (face.IsTriangle(2))
{
if (face.GetVertex(0).Distance(face.GetVertex(1)) < g_Option::instance()._DIST_SNAP)
{
face << 1;
}
else if (face.GetVertex(1).Distance(face.GetVertex(2)) < g_Option::instance()._DIST_SNAP)
{
face << 2;
}
else if (face.GetVertex(2).Distance(face.GetVertex(3)) < g_Option::instance()._DIST_SNAP)
{
face >> 1;
}
ASSERT(face.IsTriangle(1));
*this = face;
}
return *this;
}
int Ge3DFace::IsLinear() const
{
GePoly aPoly;
for (int i = 0; i < 4; i++)
{
aPoly.Append(new ADSGePoint3d(m_ptVertex[i]));
}
return aPoly.IsLinear();
}
int Ge3DFace::IsPoint() const
{
GePoly aPoly;
for (int i = 0; i < 4; i++)
{
aPoly.Append(new ADSGePoint3d(m_ptVertex[i]));
}
return aPoly.IsPoint();
}
int Ge3DFace::GetExtend(ads_point lowPt, ads_point upPt) const
{
if (!(*this))
{
return RTERROR;
}
upPt[X] = GlobalFunc::Maximum(4, m_ptVertex[0].x, m_ptVertex[1].x, m_ptVertex[2].x, m_ptVertex[3].x);
upPt[Y] = GlobalFunc::Maximum(4, m_ptVertex[0].y, m_ptVertex[1].y, m_ptVertex[2].y, m_ptVertex[3].y);
upPt[Z] = GlobalFunc::Maximum(4, m_ptVertex[0].z, m_ptVertex[1].z, m_ptVertex[2].z, m_ptVertex[3].z);
lowPt[X] = GlobalFunc::Minimum(4, m_ptVertex[0].x, m_ptVertex[1].x, m_ptVertex[2].x, m_ptVertex[3].x);
lowPt[Y] = GlobalFunc::Minimum(4, m_ptVertex[0].y, m_ptVertex[1].y, m_ptVertex[2].y, m_ptVertex[3].y);
lowPt[Z] = GlobalFunc::Minimum(4, m_ptVertex[0].z, m_ptVertex[1].z, m_ptVertex[2].z, m_ptVertex[3].z);
return RTNORM;
}
int Ge3DFace::IsRectangular(ads_real *x, ads_real *y) const
{
using namespace GlobalFunc;
TVector3D vt[4];
for (int i = 0; i < 4; i++)
{
if (i == 3)
{
vt[i] = m_ptVertex[0] - m_ptVertex[3];
}
else
{
vt[i] = m_ptVertex[i + 1] - m_ptVertex[i];
}
if (!vt[i])
{
return 0;
}
}
for (i = 0; i < 4; i++)
{
if (i == 3)
{
if (fabs(vt[3] & vt[0]) > 1E-6)
{
return 0;
}
}
else
{
if (fabs(vt[i] & vt[i + 1]) > 1E-6)
{
return 0;
}
}
}
if (x)
{
*x = ads_distance(m_ptVertex[0], m_ptVertex[1]);
}
if (y)
{
*y = ads_distance(m_ptVertex[1], m_ptVertex[2]);
}
return 1;
}
void Ge3DFace::TransformBy(ads_matrix mat)
{
m_ptVertex[0].TransformBy(mat);
m_ptVertex[1].TransformBy(mat);
m_ptVertex[2].TransformBy(mat);
m_ptVertex[3].TransformBy(mat);
}
void Ge3DFace::ExplodeEdge(PtrList<GeCurveSegment> &lstSegs) const
{
if (!(m_nFlag & 0x01) && m_ptVertex[0].Distance(m_ptVertex[1]) > g_Option::instance()._DIST_SNAP)
{
lstSegs.Append(new GeCurveSegment(m_ptVertex[0], m_ptVertex[1], 0.0));
}
if (!(m_nFlag & 0x02) && m_ptVertex[1].Distance(m_ptVertex[2]) > g_Option::instance()._DIST_SNAP)
{
lstSegs.Append(new GeCurveSegment(m_ptVertex[1], m_ptVertex[2], 0.0));
}
if (!(m_nFlag & 0x04) && m_ptVertex[2].Distance(m_ptVertex[3]) > g_Option::instance()._DIST_SNAP)
{
lstSegs.Append(new GeCurveSegment(m_ptVertex[2], m_ptVertex[3], 0.0));
}
if (!IsTriangle(1) && !(m_nFlag & 0x08) && m_ptVertex[3].Distance(m_ptVertex[0]) > g_Option::instance()._DIST_SNAP)
{
lstSegs.Append(new GeCurveSegment(m_ptVertex[3], m_ptVertex[0], 0.0));
}
}
void Ge3DFace::SetElevation(double nElev)
{
m_ptVertex[0].z = m_ptVertex[1].z = m_ptVertex[2].z = m_ptVertex[3].z = nElev;
}
void Ge3DFace::Reverse()
{
Ge3DFace old(*this);
m_ptVertex[0] = old.GetVertex(3);
m_ptVertex[1] = old.GetVertex(2);
m_ptVertex[2] = old.GetVertex(1);
m_ptVertex[3] = old.GetVertex(0);
m_nFlag &= ~(0x01 | 0x04);
if (old.GetFlag() & 0x04)
{
m_nFlag |= 0x01;
}
if (old.GetFlag() & 0x01)
{
m_nFlag |= 0x04;
}
}
//vtLight都必须是单位向量!
GePoly3D Ge3DFace::GetPoly3D()const
{
GePoly3D poly(1);
poly.AppendNode(m_ptVertex[0]);
poly.AppendNode(m_ptVertex[1]);
poly.AppendNode(m_ptVertex[2]);
if (!IsTriangle(1) && m_ptVertex[0] != m_ptVertex[3])
{
poly.AppendNode(m_ptVertex[3]);
}
return poly;
}
GePlane Ge3DFace::GetPlane()const
{
return GePlane(GetVertex(0),GetNormal());
}
int Ge3DFace::GetFlag()const
{
return m_nFlag;
}
void Ge3DFace::SetFlag(const int nFlag)
{
m_nFlag = nFlag;
}
ADSGePoint3d& Ge3DFace::GetVertex(int nIndex)
{
if (nIndex > 3 || nIndex < 0)
{
static ADSGePoint3d ptOrg(0.0,0.0,0.0);
return ptOrg;
}
return m_ptVertex[nIndex];
}
ADSGePoint3d Ge3DFace::GetVertex(int nIndex)const
{
if (nIndex > 3 || nIndex < 0)
{
return ADSGePoint3d();
}
return m_ptVertex[nIndex];
}
void Ge3DFace::SetVertex(int nIndex, ADSGePoint3d pt)
{
if (nIndex >= 0 && nIndex < 4)
{
m_ptVertex[nIndex] = pt;
}
}
void Ge3DFace::SubSortVertex()
{
using namespace GlobalFunc;
Ge3DFace *pFace = this;
ASSERT(pFace->GetFlag() & FLAG_TRIANGLE);
PtrList<ADSGePoint3d> vertices;
BOOL bInvis1 = ((pFace->GetFlag() & 0x01) != 0);
BOOL bInvis2 = ((pFace->GetFlag() & 0x02) != 0);
BOOL bInvis3 = ((pFace->GetFlag() & 0x04) != 0);
vertices.Append(new ADSGePoint3d(pFace->GetVertex(0).x, pFace->GetVertex(0).y, bInvis1));
vertices.Append(new ADSGePoint3d(pFace->GetVertex(1).x, pFace->GetVertex(1).y, bInvis2));
vertices.Append(new ADSGePoint3d(pFace->GetVertex(2).x, pFace->GetVertex(2).y, bInvis3));
vertices.QuickSort(ComparePointByX);
ADSGePoint3d ver0 = *vertices[0], ver1 = *vertices[1], ver2 = *vertices[2];
TVector3D vtOld = pFace->GetNormal();
pFace->GetVertex(0).x = ver0.x;
pFace->GetVertex(0).y = ver0.y;
pFace->GetVertex(1).x = ver1.x;
pFace->GetVertex(1).y = ver1.y;
pFace->GetVertex(2).x = ver2.x;
pFace->GetVertex(2).y = ver2.y;
pFace->GetVertex(3) = pFace->GetVertex(0);
bInvis1 = (ver0.z > 1.0E-3);
bInvis2 = (ver1.z > 1.0E-3);
bInvis3 = (ver2.z > 1.0E-3);
TVector3D vtNew = pFace->GetNormal();
if ((vtNew & vtOld) < 0)
{
// 可见标记也要反转
BOOL b1 = bInvis1, b2 = bInvis2, b3 = bInvis3;
bInvis1 = b2;
bInvis2 = b3;
bInvis3 = b1;
}
int nFlag = pFace->GetFlag();
if (bInvis1)
{
nFlag |= 0x01;
}
else
{
nFlag &= ~0x01;
}
if (bInvis2)
{
nFlag |= 0x02;
}
else
{
nFlag &= ~0x02;
}
if (bInvis3)
{
nFlag |= 0x04;
}
else
{
nFlag &= ~0x04;
}
pFace->SetFlag(nFlag);
}
BOOL Ge3DFace::SubSectByX(double xSect, PtrList<Ge3DFace> &leftFaces, PtrList<Ge3DFace> &rightFaces) const
{
Ge3DFace face = *this;
if (face.GetFlag() & FLAG_TRIANGLE)
{
//3角形
int nFlag1 = CompareDouble(face.GetVertex(0).x, xSect);
int nFlag2 = CompareDouble(face.GetVertex(1).x, xSect);
int nFlag3 = CompareDouble(face.GetVertex(2).x, xSect);
if (nFlag3 <= 0)
{
leftFaces.Append(new Ge3DFace(face));
}
else if (nFlag1 >= 0)
{
//无切割发生
rightFaces.Append(new Ge3DFace(face));
}
else
{
//发生切割
double x1 = face.GetVertex(0).x, x2 = face.GetVertex(1).x, x3 = face.GetVertex(2).x;
double y1 = face.GetVertex(0).y, y2 = face.GetVertex(1).y, y3 = face.GetVertex(2).y;
double x = xSect;
Ge3DFace *newFace = new Ge3DFace(face);
int nFlag = face.GetFlag();
int nFlagNew = newFace->GetFlag();
if (nFlag2 > 0) //切割第一点, 三角形 + 四边形
{
nFlagNew |= 0x02 + 0x08;
double y = ((x - x1) * y2 + y1 * (x2 - x)) / (x2 - x1);
newFace->SetVertex(1, ADSGePoint3d(x, y));
y = ((x - x1) * y3 + y1 * (x3 - x)) / (x3 - x1);
newFace->SetVertex(2, ADSGePoint3d(x, y));
face.SetVertex(0, newFace->GetVertex(1));
face.SetVertex(3, newFace->GetVertex(2));
nFlag |= 0x08;
nFlag &= ~FLAG_TRIANGLE;
}
else if (nFlag2 == 0) // 三角形+三角形
{
nFlagNew |= 0x02 + 0x08;
double y = ((x - x1) * y3 + y1 * (x3 - x)) / (x3 - x1);
newFace->SetVertex(2, ADSGePoint3d(x, y));
nFlag |= 0x01 + 0x08;
face.SetVertex(0, ADSGePoint3d(x, y));
face.SetVertex(3, ADSGePoint3d(x, y));
}
else // 四边形 + 三角形
{
double y = ((x - x3) * y2 + y3 * (x2 - x)) / (x2 - x3);
nFlagNew |= 0x04;
newFace->SetVertex(2,ADSGePoint3d(x,y));
y = ((x - x1) * y3 + y1 * (x3 - x)) / (x3 - x1);
newFace->SetVertex(3, ADSGePoint3d(x, y));
if (nFlag & 0x04)
{
nFlagNew |= 0x08;
}
else
{
nFlagNew &= ~0x08;
}
face.SetVertex(0, newFace->GetVertex(3));
face.SetVertex(3, newFace->GetVertex(3));
face.SetVertex(1, newFace->GetVertex(2));
nFlag |= 0x01 + 0x08;
}
face.SetFlag(nFlag);
newFace->SetFlag(nFlagNew);
leftFaces.Append(newFace);
rightFaces.Append(new Ge3DFace(face));
}
}
else
{
ASSERT(0);
return FALSE;
}
return TRUE;
}
bool Ge3DFace::IsKindOf(GeEntity::TEntityId entType) const
{
switch(entType)
{
case GeEntity::eEntity:
case GeEntity::e3DFace:
return true;
}
return false;
}
GeEntity::TEntityId Ge3DFace::Type() const
{
return GeEntity::e3DFace;
}
void Ge3DFace::CopyFrom(const GeEntity* pImpSrc)
{
if (this != pImpSrc && pImpSrc->IsKindOf(GeEntity::e3DFace))
{
m_nFlag = ((Ge3DFace* )pImpSrc)->m_nFlag;
for (int i = 0; i < 4; i++)
{
m_ptVertex[i] = ((Ge3DFace* )pImpSrc)->m_ptVertex[i];
}
}
}