- UID
- 267086
- 积分
- 0
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2005-5-26
- 最后登录
- 1970-1-1
|
发表于 2005-7-31 02:05:12
|
显示全部楼层
最初由 xukai7 发布
[B]怎样求两条直线的夹度? [/B]
//获得直线的夹角(0-90度)
ads_name ssName;
struct resbuf eb;
char strbuf[20];
eb.restype = 0; //实体类型
strcpy(strbuf, "LINE");
eb.resval.rstring = strbuf; //只选择直线
eb.rbnext = NULL;
ads_ssget(NULL, NULL, NULL, &eb, ssName);
long ssLen = 0;
ads_sslength(ssName, &ssLen);
if (ssLen != 2)
{
ads_ssfree(ssName);
return;
}
ads_name en;
AcDbObjectId enId;
AcDbLine *pLine = NULL;
AcGePoint3d ptS, ptE;
double xS, yS, xE, yE;
double *alfa = new double[2];
double fErr = 1.0E-10f;
double PI = 3.14159265358979;
//取得直线的角度,在Wcs下
for (int i=0; i<ssLen; i++)
{
ads_ssname(ssName, i, en); //取得选择集中的一个实体名
acdbGetObjectId(enId, en); //取得id
if (Acad::eOk == acdbOpenObject(pLine, enId, AcDb::kForRead))
{
pLine->getStartPoint(ptS);
pLine->getEndPoint(ptE);
xS = ptS.x;
yS = ptS.y;
xE = ptE.x;
yE = ptE.y;
//取得直线的角度,在Wcs下
double xDelta = xE - xS;
double yDelta = yE - yS;
alfa = atan2(yDelta, xDelta); //返回值在[-180,180]
if (alfa < 0)
{
alfa += 2.0f*PI;
}
//alfa = alfa * 180.0f / PI;
pLine->close(); //关闭实体
}
//ads_printf("*********");
//ads_printf("\n alfa= %0.5f", alfa);
}
//计算直线的夹角
double alfaDelta = fabs(alfa[1] - alfa[0]);
if (PI/2.0f < alfaDelta && alfaDelta <= PI) //90到180
{
alfaDelta = PI - alfaDelta;
}
else if (PI < alfaDelta && alfaDelta <= 3.0f*PI/2.0f) //180到270
{
alfaDelta = alfaDelta - PI;
}
else if (3.0f*PI/2.0f < alfaDelta && alfaDelta <=2.0f*PI) //270到360
{
alfaDelta = 2.0f*PI - alfaDelta;
}
else if (alfaDelta > 2.0f*PI)
{
alfaDelta = 0;
}
alfaDelta = alfaDelta * 180.0f / PI;
ads_printf("*********");
ads_printf("\n 直线的夹角= %0.5f", alfaDelta);
delete[] alfa;
alfa = NULL;
ads_ssfree(ssName); |
|