0

This is a followup to my previous post here

The following code (ref) can be used to generate a 2D diagram when coordinates, nodes, and edges of a graph are given.

(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)
        )
    )
)

Input:

(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)
)

I'd like to ask for suggestions on how the above code has to be modified to draw 3D diagrams when 3D coordinates of nodes are available.

(graph
   '((75 25 0) (115 45 24) (90 60 21) (10 5 4) (45 0 1) (45 55 23) (0 25 123))
   '( 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)
)
Natasha
  • 1,111
  • 5
  • 28
  • 66

1 Answers1

1

There is nothing in my code which is inherently restricted to a 2D environment - supplying the function with 3D coordinates should yield a 3D graph, albeit the text labelling will be parallel to the WCS plane since text is a planar object.

The following was generated using your sample coordinates:

enter image description here

Lee Mac
  • 15,615
  • 6
  • 32
  • 80
  • Thank you very much, I could generate the 3D diagram. I mistook p and q to be x and y coordinates. Could you please explain how to position the text along the line? – Natasha Jul 22 '20 at 02:00
  • Whilst you can easily rotate the text to align with each line, text is planar and must reside in a given plane, and a line alone does not define a plane, hence the text could be oriented in infinitely many ways around the line. – Lee Mac Jul 22 '20 at 21:30