找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: rave

[日积月累]:Arx函数集,网友自制

 火... [复制链接]
发表于 2005-1-22 10:41:50 | 显示全部楼层

Re: 我认为PointIsInPolygon函数有问题

最初由 lzxlzx 发布
[B]根据射线法求交点个数,偶数-区域外,奇数-区域内
但如果射线刚好通过顶点,产生偶数,却在区域内。 [/B]


改进版



  1.   [FONT=courier new]
  2. //0:出错
  3. //1:在线上;
  4. //2:在里面;
  5. //3在外面;
  6. //算法:1 先看点否在pPolyline上.是返回1.
  7. //     2 否则,过点testPt作一条射线,同时这条射线不能过pPolyline上的任何一点,
  8. //则,求该射线与pPolyline的交点个数.
  9. //奇数个:该点在位于内部.
  10. //偶数个:该点在位于外部.
  11. int  ptIsInsideClosePline( AcGePoint3d testPt,AcDbPolyline * pPolyline)
  12. {
  13.        
  14.         AcGePoint3d pointOnCurve;
  15.         pPolyline->getClosestPointTo(testPt,pointOnCurve);
  16.         if(testPt.isEqualTo(pointOnCurve))
  17.         {
  18.                 pPolyline->close();
  19.                 return 1;
  20.         }
  21.        
  22.         AcDbRay Xline;
  23.         Xline.setBasePoint(testPt);
  24.         Xline.setUnitDir(AcGeVector3d::kXAxis);
  25.        
  26.         //找一个方向,使RAY不与PL上的顶点相交
  27.         AcGeVector3dArray unitDirArr;
  28.         for(int i=0;(unsigned int)i < pPolyline->numVerts();i++)
  29.         {
  30.                 AcGePoint3d pt;
  31.                 pPolyline->getPointAt(i,pt);
  32.                 unitDirArr.append((pt-testPt).normal());
  33.         }
  34.         AcGeVector3d UnitDir=AcGeVector3d::kXAxis;
  35.         while (1)
  36.         {
  37.                 int foundAt;
  38.                 if(!unitDirArr.find(UnitDir,foundAt))
  39.                         break;
  40.                 UnitDir.rotateBy(PI*0.03,AcGeVector3d::kZAxis);
  41.         }
  42.         //求交点
  43.         AcGePoint3dArray points;
  44.         pPolyline->intersectWith(&Xline,AcDb::kOnBothOperands,points);
  45.         int nLen=points.length();
  46.         if(nLen%2==0)//偶数个
  47.         {
  48.                 pPolyline->close();
  49.                 return 3;
  50.         }
  51.         else //奇数个
  52.         {
  53.                 pPolyline->close();
  54.                 return 2;
  55.         }
  56.         return 0;       
  57. }

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

使用道具 举报

发表于 2005-2-14 19:03:26 | 显示全部楼层
对不起,我不懂ARX,能否像lisp一样运用呢?可以换成lisp文件吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-25 11:59:51 | 显示全部楼层
/////////////////////创建窗体图层"Window_Layer"/////////////////
AcDbObjectId
createWindowsLayer()
{
//打开层表,打开方式为只写///
AcDbLayerTable *pLayerTable;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pLayerTable,AcDb::kForWrite);
//初始化层表记录对象,并设定层表记录的名称“Window_Layer”

AcDbLayerTableRecord *pLayerTableRecord=new AcDbLayerTableRecord;
pLayerTableRecord->setName("Window_Layer");

        AcCmColor color;
        color.setColorIndex(1); // set color to red
        
pLayerTableRecord->setColor(color);
//层的其他属性(线型等)都用缺省值////

//将新建的层表记录添加到层表中,并将层表记录的ID保存到pLayerId作为函数的返回值////

AcDbObjectId pLayerId;
pLayerTable->add(pLayerId,pLayerTableRecord);
//关闭层表和层表记录对象///
pLayerTable->close();
pLayerTableRecord->close();

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

使用道具 举报

已领礼包: 194个

财富等级: 日进斗金

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

使用道具 举报

发表于 2005-3-26 14:26:09 | 显示全部楼层

Re: Re: 我认为PointIsInPolygon函数有问题

最初由 amw3 发布
[B]

改进版


[CODE]
  
//0:出错... [/B]

该程序仍然存在死角: 射线与Polyline 相切情况!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-30 21:29:30 | 显示全部楼层
///*************在指定点插入指定块*******************\\\
void CTestPlate::OnBlockInsert()
{
        // TODO: Add your control notification handler code here
        acDocManager->lockDocument(curDoc());
        AcDbObjectId blockId;   //要插入的块的Id值
        AcDbBlockTable *pBlockTable;
        acdbHostApplicationServices()->workingDatabase()
                ->getSymbolTable(pBlockTable,AcDb::kForRead);
        Acad::eOk!=pBlockTable->getAt("ASDK-NO-ATTR",
                blockId,AcDb::kForRead)//根据块名获得要插入的块的ID值
        AcDbBlockReference *pBlkRef=new AcDbBlockReference;//插入块实质是插入块的引用
        pBlkRef->setBlockTableRecord(blockId);//指定所引用的图块表记录的对象ID
        resbuf to,from;
        from.restype=RTSHORT;//插入图块要进行用户坐标与世界坐标的转换
        from.resval.rint=1;//UCS
        to.restype=RTSHORT;
        to.resval.rint=0;//WCS
        AcGeVector3d normal(0.0,0.0,1.0);
        acedTrans(&(normal.x),&from,&to,Adesk::kTrue,&(normal.x));//转换函数
        AcGePoint3d basePoint(12,23,0);//指定的插入点(可以根据需要输入)
        //acedGetPoint(NULL,"\nEnter insertion point:",asDblArray(basePoint));
        pBlkRef->setPosition(basePoint);
        pBlkRef->setRotation(0.0);
        pBlkRef->setNormal(normal);
        AcDbBlockTableRecord *pBlockTableRecord;
        pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);
        pBlockTable->close();
        AcDbObjectId newEntId;
        pBlockTableRecord->appendAcDbEntity(newEntId,pBlkRef);
        pBlockTableRecord->close();
        pBlkRef->close();
        acDocManager->lockDocument(curDoc());
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 10:23 , Processed in 0.614396 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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