Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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;
}
}