首先,针对您的特定示例,不可能生成一个图形,使得边的权重是线的长度。
例如,如果节点1、2和3之间的距离与您的数组相符,则2 → 3的距离必须介于40和60之间,否则三角形不存在。而您的数组指定这个距离为90。
为了直观地演示这一点,如果您在长度为50的线上跨越节点1和2,如果在该线的两端构造半径等于节点1→3和2→3之间距离的圆,则这些圆必须相交才能存在三角形。
目前,根据您指定的权重,不存在这样的交点:
因此,假设每个节点的任意位置,并将节点坐标作为函数参数提供,您可以使用以下AutoLISP示例函数构建所需的图形:
(defun graph ( pts sls tls wgt )
( (lambda ( l )
(foreach x l (text (cdr x) (itoa (car x)) 0.0 1))
(mapcar
'(lambda ( a b c / p q r )
(setq p (cdr (assoc a l))
q (cdr (assoc b l))
r (angle p q)
)
(entmake (list '(0 . "LINE") (cons 10 p) (cons 11 q) '(62 . 8)))
(text
(mapcar '(lambda ( x y ) (/ (+ x y) 2.0)) p q)
(itoa c)
(if (and (< (* pi 0.5) r) (<= r (* pi 1.5))) (+ r pi) r)
2
)
)
sls tls wgt
)
)
(mapcar 'cons (vl-sort (append sls tls) '<) pts)
)
)
(defun text ( p s a c )
(entmake
(list
'(0 . "TEXT")
(cons 10 p)
(cons 11 p)
(cons 50 a)
(cons 01 s)
(cons 62 c)
'(40 . 2)
'(72 . 1)
'(73 . 2)
)
)
)
当使用以下参数(其中第一个参数表示七个节点的坐标)评估上述函数时:
(graph
'((75 25) (115 45) (90 60) (10 5) (45 0) (45 55) (0 25))
'( 1 1 1 1 2 2 3 4 4 5 6)
'( 2 3 4 5 3 6 6 5 7 7 7)
'(50 10 20 80 90 90 30 20 100 40 60)
)
它将在AutoCAD中产生以下结果:
如果您希望权重由提供的节点坐标之间的二维距离确定,则可以考虑以下AutoLISP函数:
(defun graph ( pts sls tls )
( (lambda ( l )
(foreach x l (text (cdr x) (itoa (car x)) 0.0 1))
(mapcar
'(lambda ( a b / p q r )
(setq p (cdr (assoc a l))
q (cdr (assoc b l))
r (angle p q)
)
(entmake (list '(0 . "LINE") (cons 10 p) (cons 11 q) '(62 . 8)))
(text
(mapcar '(lambda ( x y ) (/ (+ x y) 2.0)) p q)
(rtos (distance p q) 2)
(if (and (< (* pi 0.5) r) (<= r (* pi 1.5))) (+ r pi) r)
2
)
)
sls tls
)
)
(mapcar 'cons (vl-sort (append sls tls) '<) pts)
)
)
(defun text ( p s a c )
(entmake
(list
'(0 . "TEXT")
(cons 10 p)
(cons 11 p)
(cons 50 a)
(cons 01 s)
(cons 62 c)
'(40 . 2)
'(72 . 1)
'(73 . 2)
)
)
)
提供节点坐标列表和两个连接节点的列表:
(graph
'((75 25) (115 45) (90 60) (10 5) (45 0) (45 55) (0 25))
'(1 1 1 1 2 2 3 4 4 5 6)
'(2 3 4 5 3 6 6 5 7 7 7)
)
这个函数将产生以下结果:
这里,权重的精度将由AutoCAD中的
LUPREC
系统变量的值确定(在上面的示例中设置为
4
)。您还可以通过向我的代码中的
rtos
函数提供精度参数来覆盖它,例如,对于
3
位小数的精度,表达式将是:
(rtos (distance p q) 2 3)