//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, SH Software Co. Ltd. // = FileName : XTriangle 类 // = Version : ver2.0 // = Author : zjq // = CreateDate : 2002-09-09 // = Description: XTriangle 类定义 // = Maintainers: // //-----------------------------------------------------------------------------+ #include "StdAfx.h" #include "XTriangle.h" #include "XLine.h" #include "XPrivateGlobalFunc.h" #include "XGlobalCurveFunc.h" #include "XCurveInline.h" void XTriangle::Ecs2Wcs(XVector3D vtEcs) { vertex1 = XPrivate::Ecs2Wcs(vertex1, vtEcs); vertex2 = XPrivate::Ecs2Wcs(vertex2, vtEcs); vertex3 = XPrivate::Ecs2Wcs(vertex3, vtEcs); } void XTriangle::Wcs2Ecs(XVector3D vtEcs) { vertex1 = XPrivate::Wcs2Ecs(vertex1, vtEcs); vertex2 = XPrivate::Wcs2Ecs(vertex2, vtEcs); vertex3 = XPrivate::Wcs2Ecs(vertex3, vtEcs); } // 判断三角形是否退化为线或点 int XTriangle::IsLinear() { XLine ln(vertex1, vertex2); if (ln.GetLength() < 1E-9) { return 1; } int nPrFlag = vertex3 & ln; if (nPrFlag != PR_OUTSIDE) { return 1; } return 0; } // 1~3-命中1~3点;-1~-3 -命中1~3边;0-外部;4-内部 int XTriangle::HitTest2d(const XPoint &ptTest) const { // 0--错误;1-左边;2-右边;3-起始点;4-终止点;5-线内;6-起始侧延长线;7-终止侧延长线 int nHit1 = XLine(vertex1, vertex2).HitTest2d(ptTest); if (nHit1 == 3) { return HIT_VERTEX1; // verttex1 } if (nHit1 == 4) { return HIT_VERTEX2; } if (nHit1 == 5) { return HIT_SIDE1; } int nHit2 = XLine(vertex2, vertex3).HitTest2d(ptTest); if (nHit2 == 4) { return HIT_VERTEX3; } if (nHit2 == 5) { return HIT_SIDE2; } int nHit3 = XLine(vertex3, vertex1).HitTest2d(ptTest); if (nHit3 == 5) { return HIT_SIDE3; } if (nHit1 == 1 && nHit2 == 1 && nHit3 == 1) { return HIT_INSIDE; //全部在左边,因此在内部 } return HIT_OUTSIDE; //外部 } XTriangle::XTriangle(const XPoint &pt1, const XPoint &pt2, const XPoint &pt3, int nFlag) : vertex1(pt1), vertex2(pt2), vertex3(pt3), m_nFlag(nFlag) { } XTriangle::~XTriangle() { } int XTriangle::IsInvisible() { return (m_nFlag == SIDE1_INVISIBLE + SIDE2_INVISIBLE + SIDE3_INVISIBLE); } void XTriangle::AsFace(X3DFace &face) const { face.SetVertex(0, vertex1); face.SetVertex(3, vertex1); face.SetVertex(1, vertex2); face.SetVertex(2, vertex3); face.SetVisible(0, !(m_nFlag & SIDE1_INVISIBLE)); face.SetVisible(1, !(m_nFlag & SIDE2_INVISIBLE)); face.SetVisible(2, !(m_nFlag & SIDE3_INVISIBLE)); }