下面是一个测试程序,纯粹抛砖引玉:),请高手帮忙改进
作用,画出面积平分线
;;by snoopychen ,Guangzhou
;;找出过区域内某点的某封闭区域的面积平分线测试版
;;main program
(defun c:test ()
(setvar "osmode" 0)
(command "undo" "BE")
(setq pa (getpoint "域内一点"))
(setq dis (getdist "区域内部最窄处的大概距离"))
; (setq lstarea nil)
(setq areaall (mj pa))
(setq n 16 te nil)
(setq lstres (rep 0.0 360.000000000))
(while (= te nil)
(setq ang_s (caddr lstres))
(setq ang_all (cadddr lstres))
(setq lstres (rep ang_s ang_all))
(if (< (cadr lstres) 0.01)
(progn
(setq te 1)
(command "xline" "a" (caddr lstres) pa "")
)
)
)
(command "undo" "E")
)
;;根据16分或者n分求出割线某一边的面积离总面积一般最接近的位置
(defun rep (ang-s ang-all / i ang-i ssxl pa90)
(setq lstarea nil i 0)
(repeat n
(setq ang-i (+ (- ang-s (/ ang-all 2)) (* (/ ang-all n) i)))
(command "xline" "a" ang-i pa "")
(setq ssxl (ssget "l"))
(setq pa90 (polar pa (+ (DTR ang-i) (* pi 0.5)) (/ dis 3)))
(grdraw (list 0 0 0) pa90 1)
(setq mj1 (mj pa90))
(setq lstarea (append
lstarea
(list mj1)
)
)
(command "erase" ssxl "")
(grdraw (list 0 0 0) pa90 0)
(setq i (1+ i))
)
(setq lstarea1 (mapcar
'(lambda (x)
(abs (- (/ areaall 2) x))
)
lstarea
)
)
(setq index (min-index-list lstarea1))
(setq indexarea (nth index lstarea1))
(setq indexangle (+ (- ang-s (/ ang-all 2)) (* (/ ang-all n) index)))
(setq allangle (* (/ ang-all n) 2))
(list index indexarea indexangle allangle)
)
;;域内求面积
(defun mj (point / a)
(command "bpoly" point "" "y")
(command "region" "l" "")
(command "area" "o" "l")
(command "erase" "l" "")
(prompt "\n the area is ")
(setq a (getvar "area"))
a
)
;;找出表最小值项所处位置
(defun min-index-list (lst / a b flag i)
(setq a (nth 0 lst)
i 0
flag 0
)
(while (< i (length lst))
(setq b (nth i lst))
(if (< b a)
(setq a b
flag i
)
)
(setq i (1+ i))
)
flag
)
;角度到弧度
(defun DTR (d)
(* pi (/ d 180.0))
)
缺点不少,大概有
1.命令行中提示太多,效率很低,不知道有什么好的子程序来求面积
2.容错功能没有怎么作
3.因为是自动查找boundary找面积,所要划分的区域不能有
其他实体,要选择的点最好先用point画出。
4.只能针对域内的点,因为点假如在域外,思路不一样的
5.对于有多个面积平分线,比如正多边形,没法求出多条平分线
6.由于编程技术比较差,程序比较罗嗦
说明:
编程的思路:比较直接,硬来的,先用16分线,或者更多
割图形,求出某一边的面积,总有一个和真正的半面积最解决
于是,再在这个角度附近,进行再搜索,直到找到精确(<0.1)的为止。
里面有一个叫“区域内部最窄处的大概距离”,是因为boundary建立
时候经常会出错而定的。