175 lines
3.8 KiB
C++
175 lines
3.8 KiB
C++
//-----------------------------------------------------------------------------+
|
|
// Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd.
|
|
// = FileName : TBArc.cpp
|
|
// = Version : ver2.0
|
|
// = Author : xlc
|
|
// = CreateDate : 2002-09-09
|
|
// = Description: ÀàµÄ¶¨Òå
|
|
// = Maintainers:
|
|
//
|
|
//-----------------------------------------------------------------------------+
|
|
#include "StdAfx.h"
|
|
#include "TBArc.h"
|
|
|
|
TBArc::TBArc()
|
|
{
|
|
}
|
|
|
|
TBArc::~TBArc()
|
|
{
|
|
}
|
|
|
|
TBArc::TBArc(AcGePoint3d& cen,double radius,double startAng,double centAng)
|
|
{
|
|
m_centPt = cen;
|
|
m_R = radius;
|
|
m_startAngle = startAng;
|
|
m_centAngle = centAng;
|
|
}
|
|
|
|
TBArc& TBArc::operator = (const TBArc& arc)
|
|
{
|
|
m_centPt = arc.m_centPt;
|
|
m_R = arc.m_R;
|
|
m_startAngle = arc.m_startAngle;
|
|
m_centAngle = arc.m_centAngle;
|
|
return *this;
|
|
}
|
|
|
|
AcGePoint3d TBArc::GetPtAtAngle(double detaAng) const
|
|
{
|
|
AcGePoint3d pt;
|
|
pt.x = m_centPt.x + m_R * cos(m_startAngle + detaAng);
|
|
pt.y = m_centPt.y + m_R * sin(m_startAngle + detaAng);
|
|
pt.z = m_centPt.z;
|
|
return pt;
|
|
}
|
|
|
|
double TBArc::GetMinX() const
|
|
{
|
|
double dvalue = 0.0;
|
|
double dendAng = m_startAngle + m_centAngle;
|
|
if ((m_startAngle < PI - fTOL) && (dendAng > PI + fTOL) && (m_centAngle > fTOL) ||
|
|
(m_startAngle > PI + fTOL) && (dendAng < PI - fTOL) && (m_centAngle < -fTOL) ||
|
|
(m_startAngle < PI - fTOL) && (dendAng < -PI - fTOL) && (m_centAngle < -fTOL) ||
|
|
(m_startAngle > PI + fTOL) && (dendAng > 3 * PI + fTOL) && (m_centAngle > fTOL))
|
|
{
|
|
dvalue = m_centPt.x-m_R;
|
|
}
|
|
else
|
|
{
|
|
AcGePoint3d ptend = GetEndPoint();
|
|
dvalue = GetStartPoint().x;
|
|
if (dvalue > ptend.x)
|
|
{
|
|
dvalue = ptend.x;
|
|
}
|
|
}
|
|
return dvalue;
|
|
}
|
|
|
|
double TBArc::GetMaxX() const
|
|
{
|
|
double dvalue = 0.0;
|
|
double dendAng = m_startAngle + m_centAngle;
|
|
if (m_startAngle < 2 * PI && dendAng > 2 * PI && m_centAngle >0. ||
|
|
m_startAngle < 2 * PI && dendAng < 0. && m_centAngle < 0.)
|
|
{
|
|
dvalue = m_centPt.x + m_R;
|
|
}
|
|
else
|
|
{
|
|
AcGePoint3d ptend = GetEndPoint();
|
|
dvalue = GetStartPoint().x;
|
|
if (dvalue < ptend.x)
|
|
{
|
|
dvalue = ptend.x;
|
|
}
|
|
}
|
|
return dvalue;
|
|
}
|
|
|
|
double TBArc::GetMinY() const
|
|
{
|
|
double dvalue = 0.0;
|
|
double PI32 = 3 * PI / 2.0;
|
|
double dendAng = m_startAngle + m_centAngle;
|
|
if (m_startAngle < PI32 && dendAng > PI32 && m_centAngle > 0. ||
|
|
m_startAngle > PI32 && dendAng < PI32 && m_centAngle < 0. ||
|
|
m_startAngle < PI32 && dendAng < -0.5 * PI && m_centAngle < 0.||
|
|
m_startAngle > PI32 && dendAng > 3.5 * PI && m_centAngle > 0.)
|
|
{
|
|
dvalue = m_centPt.y - m_R;
|
|
}
|
|
else
|
|
{
|
|
AcGePoint3d ptend = GetEndPoint();
|
|
dvalue = GetStartPoint().y;
|
|
if (dvalue > ptend.y)
|
|
{
|
|
dvalue = ptend.y;
|
|
}
|
|
}
|
|
return dvalue;
|
|
}
|
|
|
|
double TBArc::GetMaxY() const
|
|
{
|
|
double dvalue;
|
|
double PI12 = PI / 2.;
|
|
double dendAng = m_startAngle + m_centAngle;
|
|
if (m_startAngle < PI12 && dendAng > PI12 && m_centAngle > 0. ||
|
|
m_startAngle > PI12 && dendAng < PI12 && m_centAngle < 0. ||
|
|
m_startAngle < PI12 && dendAng < -1.5 * PI && m_centAngle < 0. ||
|
|
m_startAngle > PI12 && dendAng > 2.5 * PI && m_centAngle > 0.)
|
|
{
|
|
dvalue = m_centPt.y + m_R;
|
|
}
|
|
else
|
|
{
|
|
AcGePoint3d ptend = GetEndPoint();
|
|
dvalue = GetStartPoint().y;
|
|
if (dvalue < ptend.y)
|
|
{
|
|
dvalue = ptend.y;
|
|
}
|
|
}
|
|
return dvalue;
|
|
}
|
|
|
|
AcGePoint3d TBArc::GetPtAtS(double s)
|
|
{
|
|
if (fabs(m_R) < TOL)
|
|
{
|
|
return m_centPt;
|
|
}
|
|
double detang = s / m_R;
|
|
if (m_centAngle < 0)
|
|
{
|
|
detang = -detang;
|
|
}
|
|
return GetPtAtAngle(detang);
|
|
}
|
|
|
|
AcGePoint3d TBArc::GetEndPoint() const
|
|
{
|
|
AcGePoint3d pt;
|
|
pt.x = m_centPt.x + m_R * cos(m_startAngle + m_centAngle);
|
|
pt.y = m_centPt.y + m_R * sin(m_startAngle + m_centAngle);
|
|
pt.z = m_centPt.z;
|
|
return pt;
|
|
}
|
|
|
|
AcGePoint3d TBArc::GetStartPoint() const
|
|
{
|
|
AcGePoint3d pt;
|
|
pt.x = m_centPt.x + m_R * cos(m_startAngle);
|
|
pt.y = m_centPt.y + m_R * sin(m_startAngle);
|
|
pt.z = m_centPt.z;
|
|
return pt;
|
|
}
|
|
|
|
double TBArc::Length()
|
|
{
|
|
return fabs(m_R * m_centAngle);
|
|
} |