147 lines
3.8 KiB
C++
147 lines
3.8 KiB
C++
// XRect.cpp: implementation of the XRect class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "XRect.h"
|
|
#include "globalFunc.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;
|
|
GlobalFunc::GetPointList(seg, row_num, lstPt, iDist2Wall);
|
|
if(lstPt.Length() != row_num)
|
|
return FALSE;
|
|
for(int i=0;i<row_num;i++){
|
|
XPoint pt1, pt2;
|
|
pt1 = *lstPt[i];
|
|
ads_polar(pt1, rect.x_angle, rect.nWidth, pt2);
|
|
XLine lineTmp(pt1, pt2, 1);
|
|
XPointList lstPt2;
|
|
XCurveSegment seg2;
|
|
seg2 = lineTmp;
|
|
GlobalFunc::GetPointList(seg2, col_num, lstPt2, iDist2Wall);
|
|
if(lstPt2.Length() != col_num)
|
|
break;
|
|
int iCount = 0;
|
|
for(int j=0;j<col_num;j++){
|
|
iCount ++;
|
|
XPoint ptIns;
|
|
ptIns = *lstPt2[j];
|
|
// if(!bIsDiamond || (iCount % 2 != 0 && i % 2 == 0) || (iCount % 2 == 0 && i % 2 != 0))
|
|
lstInsPt.NewAppend(ptIns);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
XRect::XRect(XPoint ptS, XPoint ptE, double nAngle)
|
|
{
|
|
if(nAngle > 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;
|
|
}
|
|
}
|