Files
envi-code/SourceCode/Code2026/AdsXRx/XTriangle.cpp
T
2026-09-28 15:28:50 +08:00

122 lines
2.5 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.
//-----------------------------------------------------------------------------+
// 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));
}