changyiran 发表于 2012-7-16 16:57:33

楼主帮忙看下我的算不算精简程序?

461045462 发表于 2012-7-17 21:41:52

changyiran 发表于 2012-7-16 11:00 static/image/common/back.gif
也发个内插的吧,不需要选等高线

首先谢谢changyiran 的分享!
收藏了,学习学习。
试了试,觉得有些待改进:
1.请输入搜索距离,不好掌握范围
2.等高线不能拟合,选择重量复合线

changyiran 发表于 2012-7-18 10:08:12

461045462 发表于 2012-7-17 21:41 static/image/common/back.gif
首先谢谢changyiran 的分享!
收藏了,学习学习。
试了试,觉得有些待改进:


第一个问题好解决,搜索距离可以尽可能往大的输,一般为图上两相邻等高线之间距离的最大值即可,就算输大点例如1000(估计对所有图形这个距离是足够了)对程序的效率也可以说没有任何影响。至于第二个问题,不知道我理解的对不对,你的意思是不是说如果等高线是拟合的话程序就不能用了?

changyiran 发表于 2012-7-18 10:10:02

461045462 发表于 2012-7-17 21:41 static/image/common/back.gif
首先谢谢changyiran 的分享!
收藏了,学习学习。
试了试,觉得有些待改进:


第一个问题好解决,搜索距离可以尽可能往大的输,一般为图上两相邻等高线之间距离的最大值即可,就算输大点例如1000(估计对所有图形这个距离是足够了)对程序的效率也可以说没有任何影响。至于第二个问题,不知道我理解的对不对,你的意思是不是说如果等高线是拟合的话程序就不能用了?

changyiran 发表于 2012-7-18 12:39:18

461045462 发表于 2012-7-17 21:41 static/image/common/back.gif
首先谢谢changyiran 的分享!
收藏了,学习学习。
试了试,觉得有些待改进:


这个符合你的要求,距离100是足够了,不管是拟不拟合也都行,你试下!(defun c:tqgc(/ BZ DGJ DGX1 DGX2 DGXGS EL1 EL2 EN GC1 GC2 H J JLB SS SSJL VLA XHB YSZB ZJD ZJDZB ZXZB);对等高线附近位置进行高程注记
(setq ssjl 100)
(while (setq zjd(getpoint"\n请选择注记点位置:"))
       (setq zjd(list(car zjd)(cadr zjd)));三维点转换为二维点
       (setq yszb(list(+ ssjl (car zjd))(+ ssjl (cadr zjd)))zxzb(list(- (car zjd)ssjl)(- (cadr zjd)ssjl)));构造搜索范围框
       (setq ss(ssget "c"yszb zxzb'((0 . "*polyline")(8 . "dgx")))jlb'()j -1)
       (if (and ss(>= (setq dgxgs(sslength ss))2))
       (progn
         (repeat dgxgs
   (setq en(ssname ss(setq j(1+ j))))
   (setq vla(vlax-ename->vla-object en));转换成vla对象
   (setq zjdzb(vlax-curve-getClosestPointTo vla zjd));获得离注记点最近的曲线上的点的坐标
   (setq jlb(cons (list (distance zjd zjdzb)zjdzb)jlb));构造图元名和相应距离表
         )
         (setq xhb(VL-SORT-Ijlb'(lambda(x y)(< (car x)(car y)))));返回按距离从小到大排序后的表
         (setq jl1(car(nth(car xhb)jlb))jl2(car(nth(cadr xhb)jlb)));获得指定点与离指定点最近的两条等高线之间的距离
         (setq gc1(caddr(cadr(nth(car xhb)jlb)))gc2(caddr(cadr(nth(cadr xhb)jlb))));获得离指定点最近的两条等高线的高程值
         (setq bz(/ jl1 (+ jl1 jl2)));获得两距离比值
         (setq dgj(- gc2 gc1))
         (setq h (+ gc1 (* dgj bz)))
         (command "drawgcd" "" zjd h "")
       )
       (alert"没有找到等高线!")
   )
)
(alert"注记完毕")
(princ)
)

461045462 发表于 2012-7-18 20:31:24

本帖最后由 461045462 于 2012-7-18 20:38 编辑

changyiran 发表于 2012-7-18 12:39 http://bbs.mjtd.com/static/image/common/back.gif
这个符合你的要求,距离100是足够了,不管是拟不拟合也都行,你试下!

谢谢!
现在拟合也能标注了,很好。
能否再提提需要改进的:
等高线在同一个高程值内,比如山顶;同高的开阔地,同一高程等高线回合时,标注有误
或许要求太高,不好意思。
见谅。

461045462 发表于 2012-7-18 20:34:27

changyiran 发表于 2012-7-18 10:10 static/image/common/back.gif
第一个问题好解决,搜索距离可以尽可能往大的输,一般为图上两相邻等高线之间距离的最大值即可,就算输大 ...

谢谢!
是这个意思。
后面已经修改好了!

changyiran 发表于 2012-7-19 09:19:44

461045462 发表于 2012-7-18 20:31 static/image/common/back.gif
谢谢!
现在拟合也能标注了,很好。
能否再提提需要改进的:


你好,能不能发个附件,最好把你说的这几种情况都标注出来,让我看下具体的情况。

461045462 发表于 2012-7-19 21:11:05

changyiran 发表于 2012-7-19 09:19 static/image/common/back.gif
你好,能不能发个附件,最好把你说的这几种情况都标注出来,让我看下具体的情况。

传上一个附件麻烦您看看。
谢谢!

changyiran 发表于 2012-7-20 18:48:38

461045462 发表于 2012-7-19 21:11 static/image/common/back.gif
传上一个附件麻烦您看看。
谢谢!

我的这个程序其实是针对两条等高线之间的点的高程注记来编写的,所以你的这个问题不好解决,希望你能想出个好办法。
页: 1 [2] 3 4 5 6
查看完整版本: 南方CASS 内插高程点程序