首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将图转换为二维图

将图转换为二维图
EN

Stack Overflow用户
提问于 2020-01-15 13:34:45
回答 1查看 412关注 0票数 7

我想创建一个2D图,如下所示,

上面的图像是用MATLAB中的Graph (参考)创建的。

代码语言:javascript
复制
s = [1 1 1 1 2 2 3 4 4 5 6];
t = [2 3 4 5 3 6 6 5 7 7 7];
weights = [50 10 20 80 90 90 30 20 100 40 60];
G = graph(s,t,weights)
plot(G,'EdgeLabel',G.Edges.Weight)

该信息存储为graph的节点、边缘、边缘权重。我想要创建一个2D CAD绘图使用这些信息。线的长度可以使用边缘权重来指定。但是,我不知道如何从图中提取角度。据我所知,边的方向取决于为创建图形对象而选择的布局。我想要创建一个x,y坐标文件并导入到Autocad。

编辑:从下面解释的答案中,我了解到将边缘权重指定为长度并不简单。作为另一种选择,我希望从图像中获取节点的坐标,计算节点之间的距离,并将距离指定为边缘权重(忽略上面提供的权重)。通过坐标、节点连接和节点距离,我想以编程的方式生成一个一维CAD图形。

EDIT2:由于节点的坐标不能直接从MATLAB输出中获得,而且边缘权重(在原始输入中)不能作为边缘长度分配,所以我想尝试另一种方法。例如,如果这些是节点((75 25) (115 45) (90 60) (10 5) (45 0) (45 55) (0 25))的坐标,我希望计算坐标之间的欧几里德距离,并将距离赋值为边权。据我所知,dimension选项卡在AutoCAD中计算欧几里德距离。然而,我不知道如何分配这个输出作为边缘权重。

任何关于如何进行的建议将是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-17 19:32:25

首先,对于您的特定示例,不可能生成边权为直线长度的图形。

例如,如果节点123之间的距离为每个数组的距离:

  • 1 → 2 = 50
  • 1 → 3 = 10

那么距离2 → 3必须在4060之间,否则三角形就不存在。而您的数组将此距离指定为90

为了直观地演示这一点,如果要描绘一条长度为50的跨越节点1 & 2的线,如果在这条线的两端构造圆圈的半径等于节点1 → 32 → 3之间的距离,则这些圆圈必须相交才能存在三角形。

目前,对于您指定的权重,没有这样的交集:

因此,假设每个节点的任意位置,并将节点坐标作为函数的参数,您可以使用一个函数来构造所需的图,如下面的AutoLISP示例:

代码语言:javascript
复制
(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)
        )
    )
)

当使用以下参数计算上述函数时(其中第一个参数指示七个节点的坐标):

代码语言:javascript
复制
(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中产生以下结果:

但是,如果希望通过每个提供的节点坐标之间的2D距离来确定权重,可以考虑以下AutoLISP函数:

代码语言:javascript
复制
(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)
        )
    )
)

提供了一个节点坐标列表和两个连接节点列表:

代码语言:javascript
复制
(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)
)

这一职能将产生以下结果:

在这里,权重的准确性将取决于LUPREC系统变量在AutoCAD中的值(在上面的示例中被设置为4 )。您也可以通过在我的代码中向rtos函数提供精度参数来覆盖这一点,例如,对于3小数位的精度,表达式如下:

代码语言:javascript
复制
(rtos (distance p q) 2 3)
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59752533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档