// XRect.cpp: implementation of the XRect class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "tapi.h" #include "XRect.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// BOOL GetRectInsPt(XPoint ptS, XPoint ptE, double nAngle, int row_num, int col_num, XPointList &lstInsPt, int iDist2Wall) { lstInsPt.Reset(); XRect rect(ptS, ptE, nAngle); XLine line(rect.lowLeft, rect.upLeft, 1); XCurveSegment seg; XPointList lstPt; seg = line; GetPointList(seg, row_num, lstPt, iDist2Wall); if(lstPt.Length() != row_num) return FALSE; for(int i=0;i 359.99) nAngle = nAngle - 360; m_ptS = ptS; m_ptE = ptE; m_nAngle = nAngle; double nRadius = m_nAngle * PI / 180; double blk_angle(0), m_angle(0), m_dist(0), m_x(0), m_y(0); m_dist=ads_distance(m_ptS,m_ptE); m_angle=ads_angle(m_ptS,m_ptE); m_x=fabs(m_dist*cos(m_angle-nRadius)); m_y=fabs(m_dist*sin(m_angle-nRadius)); GetAngle(nRadius, m_angle, x_angle,y_angle, blk_angle); m_BlkAngle = blk_angle; ads_point x_point,y_point; ads_polar(m_ptS, x_angle, m_x, x_point); ads_polar(m_ptS, y_angle, m_y, y_point); lowLeft = y_point; lowRight = m_ptE; upRight = x_point; upLeft = m_ptS; nWidth = ads_distance(upLeft, upRight); nHeight = ads_distance(upLeft, lowLeft); } void XRect::AsPoly2D(XPoly2D &poly) { poly.SetFlag(1); poly.AppendNode(lowLeft); poly.AppendNode(lowRight); poly.AppendNode(upRight); poly.AppendNode(upLeft); } //通过用户输入的行向角,确定块布置的行向角和列向角 void XRect::GetAngle(ads_real sel_angle/*用户输入的行向角*/, ads_real m_angle/*起点与终点连线夹角*/, ads_real& x_angle/*布置行向角*/, ads_real& y_angle/*布置列向角*/, ads_real& blk_angle/*块插入方向角*/) { if(m_angle >= 0 && m_angle < sel_angle) {m_angle+=PI*2;} ads_real temp_angle; if(sel_angle >= 0 && sel_angle < PI/2) temp_angle=sel_angle; else if(sel_angle >= PI/2 && sel_angle < PI) temp_angle=PI-sel_angle; else if(sel_angle >= PI && sel_angle < PI*3/2) temp_angle=sel_angle-PI; else if(sel_angle >= PI*3/2 && sel_angle < 2*PI) temp_angle=PI*2-sel_angle; if((sel_angle >= 0 && sel_angle <= PI/2) || (sel_angle >= PI && sel_angle <= PI*3/2)) {blk_angle=temp_angle;} else if((sel_angle > PI/2 && sel_angle <= PI) || (sel_angle >= PI*3/2 && sel_angle <= PI*2)) {blk_angle=PI*2-temp_angle;} if((m_angle >= sel_angle) && (m_angle < (sel_angle+PI/2))) { x_angle=sel_angle; y_angle=sel_angle+PI/2; } else if((m_angle >= (sel_angle+PI/2)) && (m_angle < (sel_angle+PI))) { x_angle=sel_angle+PI; y_angle=sel_angle+PI/2; } else if((m_angle >= (sel_angle+PI)) && (m_angle < (sel_angle+PI*3/2))) { x_angle=sel_angle+PI; y_angle=sel_angle+PI*3/2; } else if((m_angle >= (sel_angle+PI*3/2)) && (m_angle < (sel_angle+PI*2))) { x_angle=sel_angle+PI*2; y_angle=sel_angle+PI*3/2; } }