Atsai 发表于 2015-8-18 18:39:23

根据輸入面积调整多段线单点或单边至符合面积!!

本帖最后由 Atsai 于 2015-8-18 18:36 编辑

首先是看到 树櫴希德 这个帖子http://bbs.mjtd.com/thread-169081-1-1.html
因为这个功能不一定只在测绘版块用到,所以重新贴到这里!!

单一点调整面积的思路
1、选择多线段,获取『原始面积』area-o1,以行列式读点表获取面积的方法,
   以G版的代码可以实现:http://bbs.mjtd.com/forum.php?mo ... 04&page=1#pid577391;; 返回由表 L1 构成的多边形面积. 点逆时针为正,顺时针为负
;;简洁写法
(defun getplarea (l)
(* 0.5
   (apply '+
            (mapcar '(lambda (a b)
                     (- (* (car a) (cadr b)) (* (car b) (cadr a)))
                     )
                  l
                  (append (cdr l) (list (car l)))
                  )
            )
   )
)要获取多段线的点表则由无痕大大的:;; 獲取聚合線點表
(defun vxs (e / i v lst)
(setq i -1)
(while
    (setq v (vlax-curve-getpointatparam e (setq i (1+ i))))
   (setq lst (cons v lst))
)
(reverse lst)
)2、输入『调整后面积』area-n

3、利用自贡黄明儒前辈的关于多线段的帖子:http://bbs.mjtd.com/thread-108149-1-1.html
   ;;164.19 [功能] 多段线所点击点最近的一个顶点
   =>得到要移动的最近点

   ;;164.18 [功能] 多段线所点击子段的两端点列表
   =>得到要移动最近点的选择边的二个端点 ps、pe

4、由第1步骤得到的点表ptlist移除要移动的顶点,重新用行列式得到『移除移动点后的面积』area-o2
      面积差 = -

5、由移动点的位置得到前、后的二个点为sp、ep,并画直线line (e1)
      以面积差=1/2*B*h =>h
      offset 直线sp-ep,偏移量=h =>获取生成后的直线物件 (e2)
      得到e2 的二个端点 p1、p2
6、利用 (setq pt (inters ps pe sp-el ep-el nil)),得到边上的交点pt

7、利用subst更新点表,完成。

   
单一边调整面积的思路也是类似的,只是求『三角形的高』,变成求『梯形的高』
area-m=1/2*(a+h*tan(θ1)+a+h*tan(θ2))*h
(tan(θ1)+tan(θ2))*h^2+2a*h-2*area-m=0
=>解1元2次方程式
h+={-2a+[(2a)^2-4*(tan(θ1)+tan(θ2))(-2*area-m)]^1/2}/
h-={-2a-[(2a)^2-4*(tan(θ1)+tan(θ2))(-2*area-m)]^1/2}/,这个解是负数不合。
求得高之后偏移,交梯形的二边得pt1、pt2
再subst更新data就可以了。


执行成果如下:


单一点调整源码如下:
**** Hidden Message *****
单一边调整源码如下:

迷失1786 发表于 2019-9-8 21:58:44

很强大,谢谢

tianyuan 发表于 2016-10-10 11:51:56

我发现您的这个程序在距离坐标原点附近如坐标0,0,0附近的多边形执行改程序就没有任何问题,单是离着原点(0,0,0)越远,执行程序调整面积就会出现误差,如坐标值(X/Y均为9位数)39580000,414000,请问该如何修改?谢谢

fzhemail 发表于 2019-5-4 14:38:03

fzhemail 发表于 2019-5-4 00:00
命令: _appload 已成功加载 tmj2-单一边依面积调整多边形.lsp。 命令: ; 错误: 读入的 (八进制) 字符不正确 ...

另存为 → “编码ANSI”→就可以了。刚刚度过,可行

lucas_3333 发表于 2015-8-18 18:58:00

看着很高级, 大师的作品要支持

hao3ren 发表于 2015-8-18 19:27:36

来看大师的作品

cable2004 发表于 2015-8-18 20:04:30

本帖最后由 cable2004 于 2015-8-18 21:35 编辑

还要考虑一个bug,就是当梯形两边延伸到一点后面积还达不到要求,然后转三角形延伸!

Atsai 发表于 2015-8-18 20:13:37

哈哈!我是拼装众大师们的函数啦!
拼装车能开就好,要看精简的源码应该看不到!

hastan 发表于 2015-8-18 20:25:37

q3_2006 发表于 2015-8-18 21:10:23

原来整这个呀...

newbuser 发表于 2015-8-18 21:30:14

看来很精练啊。来学习下。

囗Peanut囗 发表于 2015-8-19 02:02:20

回复一下看看,学习学习~~

ps122hb 发表于 2015-8-19 08:48:36

很强大,谢谢
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 根据輸入面积调整多段线单点或单边至符合面积!!