找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1782|回复: 6

[求助]:随点画了个N边形,请问怎么得到这个N边形的面积

[复制链接]
发表于 2005-9-27 15:36:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
随点画了个N边形,请问怎么得到这个N边形的面积,好象可以通过这种方法得到:
                AcDbPolyline * pPline ;
                double area=0;
                 pPline->getArea(area);
                 acutPrintf("\n面积为 %.3f\n",area);
可是我不知道如何添加?(加了几次了都取不到面积  很郁闷 )
#include <aced.h>
#include <acedads.h>
#include <dbents.h>
#include <dbsymtb.h>
#include <dbgroup.h>
#include <dbapserv.h>
#include <acestext.h>
#include <migrtion.h>
#include <geassign.h>
#include <math.h>
#include <dbpl.h >

        ads_point  pt1[512];
        AcGePoint3d  pt[512];
        int NodeNumCount;
void  area()
{
        int i=0;
        acedGetPoint(NULL,"\n请选择起始点:",asDblArray(pt[0]));

        do           {
                acedGetPoint(asDblArray(pt),"\n拾取下一点:",asDblArray(pt[i+1]));
                AcDbLine *pLine=new AcDbLine(pt,pt[i+1]);
                AcDbBlockTable *pBlkTable2;
                acdbHostApplicationServices()->workingDatabase()
                        ->getSymbolTable(pBlkTable2, AcDb::kForRead);
                AcDbBlockTableRecord *pBlockTableRecord;
               
                pBlkTable2->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
                        AcDb::kForWrite);
                pBlkTable2->close();
               
                AcDbObjectId lineId=AcDbObjectId::kNull;
                pBlockTableRecord->appendAcDbEntity(lineId, pLine);
                pBlockTableRecord->close();
                pLine->close();
                changepoint(pt1[i+1],pt[i+1]);//转换点的类型
                changepoint(pt1[0],pt[0]);//转换点的类型
                        i++;
                        NodeNumCount=i;//取得边数
          }
        while((Equal_Points (pt1, pt1[0]))==0);//起始点=终点时结束循环
}

int Equal_Points (const ads_point p1, const ads_point p2) //判断两点是否为同一点
{
    // 指定误差范围
    const ads_real Equality_Margin = (ads_real)0.0001;
    int c ;
    for (c = X ; c <= Z ; c++)
        {
        if (fabs(p1[c] - p2[c]) > Equality_Margin)
                {
            return (0) ;
        }
    }
        {
                        AcDbLine *pLine=new AcDbLine(pt[0],pt[NodeNumCount]);//连接起始点与终点(形成pline组成的闭合n边形)
                        AcDbBlockTable *pBlkTable2;
                acdbHostApplicationServices()->workingDatabase()
                        ->getSymbolTable(pBlkTable2, AcDb::kForRead);
               
                AcDbBlockTableRecord *pBlockTableRecord;
               
                pBlkTable2->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,
                        AcDb::kForWrite);
                pBlkTable2->close();
               
                AcDbObjectId lineId=AcDbObjectId::kNull;
                pBlockTableRecord->appendAcDbEntity(lineId, pLine);
                pBlockTableRecord->close();
                pLine->close();
           return (1) ;
        }
}

void changepoint(ads_point& ads_pt,AcGePoint3d acge_pt)  //AcGePoint3d转换成ads_point类型
{
        double x=acge_pt[0];
        double y=acge_pt[1];
        double z=acge_pt[2];
        ads_pt[X]=x;
        ads_pt[Y]=y;
        ads_pt[Z]=z;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-9-27 15:56:20 | 显示全部楼层
用数学方法也很简单啊,下面的函数希望对你有帮助:


  1.   [FONT=courier new]
  2. double GetArea(const AcGePoint3dArray ptArray)
  3. {

  4.         double rArea = 0.0;
  5.         int n = ptArray.logicalLength();

  6.          for(int i = 0; i < n - 1; i++)
  7.                 rArea += (ptArray[i + 1].x - ptArray[i].x) *
  8.                         (ptArray[i + 1].y + ptArray[i].y) / 2;

  9.          rArea += (ptArray[n - 1].x - ptArray[0].x) *
  10.                         (ptArray[n - 1].y + ptArray[0].y) / 2;

  11.         return fabs(rArea);
  12.                
  13. }
  14.   [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-27 16:40:48 | 显示全部楼层
非常感谢楼上的,给了我一个新的方法!
谢谢!:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-8 17:31:34 | 显示全部楼层
画一个辅助的闭合PolyLine,然后测量这个PolyLine的面积,然后把这个PolyLine删除。
VBA里面是这么做的。ARX我没试验过。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-9 15:24:04 | 显示全部楼层
多谢楼上的指教,我正在这样做!但是遇到点小问题!已经能读取到pline线的面积
但是当选择的不是pline线时会跳出异常!:(
我的程序:http://p4.xdcad.net/forum/showthread.php?s=&threadid=471251
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-9-8 23:11:08 | 显示全部楼层
markmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmarkmark
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-11-24 20:22:22 | 显示全部楼层
这个数学方法计算面积看着好神奇!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-21 04:34 , Processed in 0.312703 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表