- UID
- 1
- 积分
- 16111
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-3
- 最后登录
- 1970-1-1
|
发表于 2003-2-20 18:05:16
|
显示全部楼层
我把XDRX_API里面的求任何曲线实体或者给定点表判断时针的代码贴出来(用行列式求面积的方法,修改下本函数,可以求任意曲线或者点表组成的面积),下面的函数适合“任意形状的凹凸曲线”
下面是定义的LISP调用的外部函数,逆时针返回T
- <normalfont>
- int isAntiClockWise()
- {
- resbuf *rb=ads_getargs();
- Acad::ErrorStatus es;
- if (rb==NULL)
- return RTNORM;
- AcGePoint3dArray nPts;
- if (rb->restype==RTENAME){
- if (XdDbUtils::isAntiClockWise(rb->resval.rlname)){
- ads_rett();
- return RTNORM;
- }
- }
- resbuf *tail=NULL;
- es=XdRbUtils::getPtArrayFromRbList(nPts,rb,tail);
- if (es!=Acad::eOk)
- return RTNORM;
- if (XdDbUtils::isAntiClockWise(nPts))
- ads_rett();
- return RTNORM;
- }
- </normalfont>
复制代码
下面是通用的库
- <normalfont>
- BOOL XdDbUtils::isAntiClockWise(AcGePoint3dArray nPts)
- {
- double area=0;
- area=XdGeUtils::getPtArrayArea(&nPts);
- if (area>0)
- return TRUE;
- else if (area<0)
- return FALSE;
- else return FALSE;
- }
- BOOL XdDbUtils::isAntiClockWise(ads_name ent)
- {
- AcDbCurve *pCurve;
- pCurve=isAcDbCurveEnt(ent);
- if (pCurve==NULL)
- return FALSE;
- AcGePoint3dArray nPts;
- double tol=XdDbUtils::getScreenHigh()/40;
- if ((XdDbUtils::getPolyVertxFromCurve(pCurve,nPts,tol))&&(isAntiClockWise(nPts))){
- return TRUE;
- }
- return FALSE;
- }
- BOOL XdDbUtils::isAntiClockWise(AcDbCurve *pCurve)
- {
- if (pCurve==NULL)
- return FALSE;
- AcGePoint3dArray nPts;
- double tol=XdDbUtils::getScreenHigh()/40;
- if ((XdDbUtils::getPolyVertxFromCurve(pCurve,nPts,tol))&&(isAntiClockWise(nPts))){
- return TRUE;
- }
- return FALSE;
- }
- </normalfont>
复制代码
下面是求封闭多边形面积的通用库(利用行列式算法,如果逆时针,面积为正,顺时针,面积为负)
- <normalfont>
- double XdGeUtils::getPtArrayArea(AcGePoint3dArray *nPts)
- {
- int len=nPts->length();
- double area=0.0;
- if (len<3)
- return FALSE;
- AcGePoint3d spt,p1,p2;
- spt=nPts->at(0);
- for (int i=0;i<len-1;i++){
- p1=nPts->at(i);
- p2=nPts->at(i+1);
- area+=(p1.x*p2.y-p2.x*p1.y);
- }
- area=(area+(p2.x*spt.y-spt.x*p2.y))/2.0;
- return area;
- }
- double XdGeUtils::getPtArrayArea(AcGePoint2dArray *nPts)
- {
- int len=nPts->length();
- double area=0.0;
- if (len<3)
- return 0;
- AcGePoint2d spt,p1,p2;
- spt=nPts->at(0);
- for (int i=0;i<len-1;i++){
- p1=nPts->at(i);
- p2=nPts->at(i+1);
- area+=(p1.x*p2.y-p2.x*p1.y);
- }
- area=(area+(p2.x*spt.y-spt.x*p2.y))/2.0;
- return area;
- }
- </normalfont>
复制代码 |
|