//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, SH Software Co. Ltd. // = FileName : CBArc.cpp // = Version : ver2.0 // = Author : zjq // = CreateDate : 2002-09-09 // = Description: 类的定义 // = Maintainers: // //-----------------------------------------------------------------------------+ #include "StdAfx.h" #include "CBArc.h" CBArc::CBArc() { } CBArc::~CBArc() { } CBArc::CBArc(AcGePoint3d& cen,double radius,double startAng,double centAng) { m_centPt = cen; m_R = radius; m_startAngle = startAng; m_centAngle = centAng; } CBArc& CBArc::operator = (const CBArc& arc) { m_centPt = arc.m_centPt; m_R = arc.m_R; m_startAngle = arc.m_startAngle; m_centAngle = arc.m_centAngle; return *this; } AcGePoint3d CBArc::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 CBArc::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 CBArc::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 CBArc::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 CBArc::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 CBArc::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 CBArc::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 CBArc::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 CBArc::Length() { return fabs(m_R * m_centAngle); }