找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1509|回复: 7

[讨论]:这是求椭圆弧中间点方法,但方法2为何不行?????

[复制链接]
发表于 2002-11-11 15:46:17 | 显示全部楼层 |阅读模式

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

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

×
;;这是求椭圆弧中间点方法,但方法2为何不行?????

  1. (defun c:test ()
  2.   (setvar "PELLIPSE" 0)
  3.   (entmake '((0 . "ELLIPSE")
  4.              (100 . "AcDbEntity")
  5.              (67 . 0)
  6.              (410 . "Model")
  7.              (8 . "0")
  8.              (100 . "AcDbEllipse")
  9.              (10 319.594 142.135 0.0)
  10.              (11 274.456 96.6051 0.0)
  11.              (210 0.0 0.0 1.0)
  12.              (40 . 0.187371)
  13.              (41 . 2.40226)
  14.              (42 . 5.14988)
  15.             )
  16.   )
  17.   (setq WW (vlax-ename->vla-object (entlast)))

  18.   ;;求椭圆弧中间点方法1
  19.   (setq        TLEN (/        (vlax-curve-getdistatparam
  20.                   WW
  21.                   (vlax-curve-getendparam WW)
  22.                 )
  23.                 2
  24.              )
  25.   )
  26.   (setq MID-POINT1 (vlax-curve-getpointatdist WW TLEN))
  27.   (command "_.POINT" MID-POINT1)

  28.   ;;求椭圆弧中间点方法2
  29.   (setq STARTSPLINE (vlax-curve-getstartparam WW))
  30.   (setq ENDSPLINE (vlax-curve-getendparam WW))
  31.   (setq        MID-POINT2
  32.          (vlax-curve-getpointatparam
  33.            WW
  34.            (/ (- ENDSPLINE STARTSPLINE) 2)
  35.          )
  36.   )
  37.   (command "_.POINT" MID-POINT2)
  38.   (princ)
  39. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-11-11 15:50:40 | 显示全部楼层
一和二的差别就在于一是根据距离来求,二是根据参数值来求。

距离的一半肯定是中点,充分必要条件。

参数的一半不一定是中点,即不充分也不必要,只有参数值是线性变化的,才是。

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

使用道具 举报

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

使用道具 举报

发表于 2002-11-11 17:05:29 | 显示全部楼层
最初由 LUCAS 发布
[B]那参数真正义意是甚么??? [/B]


曲线的参数化方程式。不是笛卡儿坐标X,Y表示,通过参数化,用一个变量表示。

比如直线,从1,1,1到2,4,5画一条直线,方程可以为:

L=(1,1,1)+U×(1,3,4)

U从0到1变化,U就是参数值。

再如,一个圆心0,0,0,半径1的园,参数化如下:

C=(cos(u)+sin(u),0);
U的范围0-360度,如果减少取值范围,那么就可以得到一段弧。

建议你去看看《AUTOCAD 2000 对象开发从入门到精通》这本书,里面讲了ACAD下的所有对象,其中对曲线的描述很全面。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-11-11 18:47:32 | 显示全部楼层
最初由 烛光 发布
[B]一和二的差别就在于一是根据距离来求,二是根据参数值来求。

距离的一半肯定是中点,充分必要条件。

参数的一半不一定是中点,即不充分也不必要,只有参数值是线性变化的,才是。

我的观点,不知是否正确。 [/B]


在帮助文件中有如下的一个例子,难道这个例子有错?

  1.   [FONT=courier new]
  2. 获取曲线的开始参数:

  3. _$ (setq startSpline (vlax-curve-getStartParam splineObj))

  4. 0.0

  5. 获取曲线的结束参数:

  6. _$ (setq endSpline (vlax-curve-getEndParam splineObj))

  7. 17.1546

  8. 确定曲线的中点:

  9. _$ (vlax-curve-getPointAtParam splineObj  
  10.    ( / (- endspline startspline) 2))

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-11 22:59:40 | 显示全部楼层
最初由 efan2000 发布
[B][QUOTE]最初由 烛光 发布
[B]一和二的差别就在于一是根据距离来求,二是根据参数值来求。

距离的一半肯定是中点,充分必要条件。

参数的一半不一定是中点,即不充分也不必要,只有参数值是线性变化的?.. [/B]


不能说错,但是不完全。

我写XDRX_API的时候就注意到了,开始朋友说有BUG,中点有时候对,有的实体不对。后来用了距离的方法。

在ADN开发资料中,ADESK也给了求中点的代码,也是用的距离的一半。

大家看下下面的代码,求POLYLINE任一段的中点,蓝色的注意。


  1. [FONT=courier new]

  2. 问题:
  3. How do I find the midpoint of a curve and the midpoint of each segment for an
  4. AcDbPolyline?

  5. 解答:
  6. The following code finds the midpoint on the [color=blue]perimeter (not the parametric
  7. space)[/color] of each segment on a curve.


  8. Acad::ErrorStatus getMidPointOnEachSegOfCrv(AcDbCurve *pCurve)
  9. {
  10.     Acad::ErrorStatus    es;
  11.     AcGePoint3d pt;

  12.     double startParam, endParam;
  13.    
  14.     if(!pCurve->isKindOf(AcDbCurve::desc()))
  15.     {
  16.         acutPrintf("\nSelected entity is not a CURVE derived object");

  17.         return Acad::eInvalidInput;
  18.     }
  19.    
  20.     AcDbPolyline      *pPline;
  21.     pPline = AcDbPolyline::cast(pCurve);

  22.     if ( pPline != NULL )
  23.     {
  24.         int num;
  25.         num = pPline->numVerts();
  26.         for( int index=0; index < num-1; index++ )
  27.         {
  28.             if( pPline->segType(index) == AcDbPolyline::kLine )
  29.             {
  30.                 AcGeLineSeg2d lineSeg;

  31.                 es = pPline->getLineSegAt(index, lineSeg);
  32.                 if( Acad::eOk != es )
  33.                 {
  34.                     acutPrintf("\nFailed to get segment at
  35. %d.", index);
  36.                     return es;
  37.                 }
  38.                
  39.                 AcGePoint2d pt;
  40.                 pt = lineSeg.midPoint();
  41.                 acutPrintf("\nMidpoint of %i segment LINE is:
  42. %f,%f,%f.", index, pt[0], pt[1], pt[2]);
  43.             }
  44.             else if( pPline->segType(index) == AcDbPolyline::kArc )
  45.             {
  46.                 AcGeCircArc2d ArcSeg;
  47.                 es = pPline->getArcSegAt(index, ArcSeg);
  48.                 if( Acad::eOk != es )
  49.                 {
  50.                     acutPrintf("\nFailed to get segment at
  51. %d.", index);
  52.                     return es;
  53.                 }
  54.                
  55.                 double startAng, endAng;
  56.                
  57.                 startAng = ArcSeg.startAng();
  58.                 endAng = ArcSeg.endAng();
  59.                
  60.                 AcGePoint2d pt;
  61.                 pt = ArcSeg.evalPoint((startAng+endAng)/2);
  62.                
  63.                 acutPrintf("\nMidpoint of %i segment ARC is:
  64. %f,%f,%f.", index, pt[0], pt[1], pt[2]);
  65.             }
  66.         }
  67.         pPline->close();
  68.         return Acad::eOk;
  69.     }
  70.    
  71.     es = pCurve->getStartParam( startParam );
  72.     if( Acad::eOk != es )
  73.     {
  74.         acutPrintf("\nFailed to get start Parameter.");
  75.         return es;
  76.     }
  77.     acutPrintf("\nstartParam is %fl", startParam);
  78.    
  79.     es =  pCurve->getEndParam( endParam );
  80.     if( Acad::eOk != es )
  81.     {
  82.         acutPrintf("\nFailed to get end Parameter.");
  83.         return es;
  84.     }
  85.     acutPrintf("\nendParam is %fl", endParam);

  86.     double distStParam;
  87.     es = pCurve->getDistAtParam( startParam , distStParam);
  88.     if( Acad::eOk != es )
  89.     {
  90.         acutPrintf("\nFailed to get the distance at start Parameter.");
  91.         return es;
  92.     }
  93.    
  94.     double distEndParam;
  95.     es = pCurve->getDistAtParam( endParam , distEndParam);
  96.     if( Acad::eOk != es )
  97.     {
  98.         acutPrintf("\nFailed to get the distance at end Parameter.");
  99.         return es;
  100.     }
  101.    
  102.     if(distStParam > 1.e-10)
  103.     {
  104.         acutPrintf("\nWARNING: The distance at starting parameter is not
  105. zero. A Trivial situation");
  106.     }
  107.    
  108.     [color=blue]double midDist = distEndParam / 2.0;
  109.    
  110.     es = pCurve->getPointAtDist(midDist, pt);[/color]
  111.     if( Acad::eOk != es )
  112.     {
  113.         acutPrintf("\nFailed to get the distance at end Parameter.");
  114.         return es;
  115.     }
  116.     acutPrintf("\n%f,%f,%f", pt[0], pt[1], pt[2]);

  117.     es = pCurve->close() ;
  118.     if( Acad::eOk != es )
  119.     {
  120.         acutPrintf("\nFailed to get the distance at end Parameter.");
  121.         return es;
  122.     }
  123.    
  124.     return Acad::eOk;
  125. }
  126. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-11-12 10:45:51 | 显示全部楼层
你可能没有注意到,我在台湾,要找到《AUTOCAD 2000 对象开发从入门到精通》这本书有点困难。
如曲线的参数化方程式用一个变量表示。那就是说每条曲线都有个别的参数化方程式,在我所列的方法2中
STARTSPLINE的值是2.40226
ENDSPLINE的值是5.14988
对椭圆弧&圆弧来说这些参数值一点用都没有吗???
是否有例子说明这些参数值在椭圆弧&圆弧中的应用实例。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-12 11:19:28 | 显示全部楼层
最初由 LUCAS 发布
[B]你可能没有注意到,我在台湾,要找到《AUTOCAD 2000 对象开发从入门到精通》这本书有点困难。
如曲线的参数化方程式用一个变量表示。那就是说每条曲线都有个别的参数化方程式,在我所列的方法2中
STARTSPLINE的值是2.... [/B]


参数值就是特征值啊,它是唯一的,不象点,如果曲线封闭,那么起点和终点是相等的,但参数值不等,所以参数值可以用来做排序的关键字。

参数值和点一样,ARX提供了很多处理参数值的函数,根据参数值能得到点,距离等等。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 05:18 , Processed in 0.186892 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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