明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2215|回复: 9

[讨论] 想写一个等高线内插的小程序,思路不太清晰,求达人提点

[复制链接]
发表于 2011-4-17 01:16:21 | 显示全部楼层 |阅读模式
处理等高线的情况太多了

CASS自带的等高线内插太蹩脚了

想自己写个等高线内插程序

希望两条等高线中间内插一条等高线就OK了,

求达人给个构思。

发表于 2012-12-8 10:02:42 | 显示全部楼层
本帖最后由 阿然 于 2012-12-8 10:48 编辑

我有个想法,没实践过,获取两条等高线的长度,然后按照等比例步长用(vlax-curve-getPointAtDist curve-objdist)获取在两条等高线的点,然后取这两个点的中点,得到一串点表,根据这些点表绘制polyline

  1. (vl-load-com)
  2. (setq *AcadDoc* (vla-get-ActiveDocument (vlax-get-Acad-Object)))
  3. (setq *MoSpace* (vla-get-ModelSpace *AcadDoc*))

  4. (defun c:dgx-insert (/        pline1   pline2  len1   len2
  5.          step     step1    step2  i   pt
  6.          pt1      pt2      ptlist  ptlistlen
  7.          ptsafearray elev1 elev2 elev newpline
  8.         )
  9.   (if (setq pline1 (vlax-ename->vla-object
  10.          (car (entsel "\n选择第一条等高线:"))
  11.        )
  12.       )
  13.     (if  (setq pline2 (vlax-ename->vla-object
  14.            (car (entsel "\n选择第二条等高线:"))
  15.          )
  16.   )
  17.       (progn
  18.   (setq len1 (vlax-get-property pline1 'length)
  19.         len2 (vlax-get-property pline2 'length)
  20.         elev1 (vlax-get-property pline1 'Elevation )
  21.         elev2 (vlax-get-property pline2 'Elevation )
  22.         elev (/ (+ elev1 elev2) 2)
  23.   )
  24.   (if (setq step (getint "\n请输入内插步长:"))
  25.     (setq  step1 (/ len1 step)
  26.     step2 (/ len2 step)
  27.     i     0
  28.     )
  29.   )
  30.   (while (<= i step)
  31.     (setq  pt1 (vlax-curve-getPointAtDist pline1 (* i step1))
  32.     pt2 (vlax-curve-getpointatdist pline2 (* i step2))
  33.     )
  34.     (setq pt (mapcar '(lambda (x y) (/ (+ x y) 2.0)) pt1 pt2))
  35.     (setq ptlist (append ptlist pt))
  36.     (setq i (1+ i))
  37.   )
  38.   (setq ptlistlen (1- (length ptlist)))
  39.   (setq ptsafearray
  40.          (vlax-make-safearray
  41.      vlax-vbdouble
  42.      (cons 0 ptlistlen)
  43.          )
  44.   )
  45.   (setq ptsafearray (vlax-safearray-fill ptsafearray ptlist))
  46.   (setq newpline (vla-AddPolyline *mospace* ptsafearray))
  47.   (vlax-put-property newpline 'Elevation elev)
  48.       )
  49.     )
  50.   )
  51. )

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

发表于 2012-12-5 15:53:35 | 显示全部楼层
CASS内插处理起来真的太费力了,等高线生成之后要处理的问题太多了。
发表于 2012-12-8 10:12:58 | 显示全部楼层
阿然 发表于 2012-12-8 10:02
我有个想法,没实践过,获取两条等高线的长度,然后按照等比例步长用(vlax-curve-getPointAtDist curve-obj ...

这思路很赞
发表于 2012-12-8 10:26:02 | 显示全部楼层
本帖最后由 yarp 于 2012-12-8 11:08 编辑



http://bbs.mjtd.com/thread-95698-1-1.html

我用arx写的,用lisp的可能太慢了。
我的坐标计算器中也集成了这个功能,基本上可以在所有版本cad中用。
基本思路就是从中线上向前搜索,找到下一个点,该点分别到两根线的最近距离相等或为一定比例,再继续向前搜索。
所附的dwg文件是内插出来的效果,中间的是内插线。

本帖子中包含更多资源

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

x
发表于 2012-12-8 10:31:21 | 显示全部楼层
附上代码,2004测试通过
发表于 2015-2-2 20:07:37 | 显示全部楼层
还是不太智能化。。。
发表于 2017-11-20 15:05:30 | 显示全部楼层
直接等比例插线并不符合实际地形,某一段可能离两条线的距离相等,另一段可能离一条线近点,离另一条远些,地形平缓的时候甚至走向都与旁边两条等高线迥异,按比例插线局限太大。
发表于 2018-9-28 17:19:38 | 显示全部楼层
阿然 发表于 2012-12-8 10:02
我有个想法,没实践过,获取两条等高线的长度,然后按照等比例步长用(vlax-curve-getPointAtDist curve-obj ...

代码运行的时候出错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-19 10:42 , Processed in 0.181553 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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