Author Topic: Triangulation (re-visited)  (Read 317726 times)

0 Members and 2 Guests are viewing this topic.

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: Triangulation (re-visited)
« Reply #360 on: April 01, 2015, 02:01:03 PM »
...
However as stated before, you do not really need it,
just remove triangles with a vertex on the supertriangles.

ymg

That's correct, but how can you guarantee that supertriangle is good and big enough to make such conclusion...

Look in my attachments...

M.R.
« Last Edit: April 29, 2015, 04:37:43 PM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #361 on: April 01, 2015, 05:12:34 PM »
Marko,

There is an alternative to supertriangle.

You could start the triangulation with points p1 and p2 plus an infinite point. (Ray)
You would have triangle p1 p2 pinf and p2 p1 pinf as a start.

I've never tried it myself, but see the comments by Wolfgang Ortmann
at bottom of this page : http://www.codeguru.com/cpp/cpp/algorithms/general/article.php/c8901/Delaunay-Triangles.htm

ymg

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: Triangulation (re-visited)
« Reply #362 on: April 01, 2015, 06:18:19 PM »
I've developed my variant to satisfy all possibilities - now should make convex triangulation in my opinion no matter how points are distributed...

[EDIT : Even better optimized LM:Convex Hull subfunction for this purpose - triangulation]

Code - Auto/Visual Lisp: [Select]
  1. (defun c:triangulate-MR-EE-LM ( / mid 3D->2D MR:Collinear-p LM:Clockwise-p LM:ConvexHull triangulate ss i p pl ell tl z )
  2.  
  3.   (defun mid ( p1 p2 )
  4.     (mapcar '(lambda ( a b ) (/ (+ a b) 2.0)) p1 p2)
  5.   )
  6.  
  7.   ;; 3D to 2D point  -  M.R.
  8.   ;; Returns 2D point list from supplied 3D point list or returns supplied argument if it isn't 3D point list
  9.  
  10.   (defun 3D->2D ( p )
  11.       (if (and (listp p) (vl-every '(lambda ( x ) (eq (type x) 'REAL)) p) (eq (length p) 3))
  12.           (list (car p) (cadr p))
  13.           p
  14.       )
  15.   )
  16.  
  17.   ;; Collinear-p  -  M.R.
  18.   ;; Returns T if p1,p2,p3 are collinear
  19.  
  20.   (defun MR:Collinear-p ( p1 p2 p3 )
  21.       (equal  (distance p1 p3)
  22.               (+ (distance p1 p2) (distance p2 p3))
  23.           1e-8
  24.       )
  25.   )
  26.  
  27.   ;; Clockwise-p  -  Lee Mac
  28.   ;; Returns T if p1,p2,p3 are clockwise oriented or collinear
  29.  
  30.   (defun LM:Clockwise-p ( p1 p2 p3 )
  31.       (<  (-  (* (- (car  p2) (car  p1)) (- (cadr p3) (cadr p1)))
  32.               (* (- (cadr p2) (cadr p1)) (- (car  p3) (car  p1)))
  33.           )
  34.           1e-8
  35.       )
  36.   )
  37.  
  38.   ;; Convex Hull  -  Lee Mac
  39.   ;; Implements the Graham Scan Algorithm to return the Convex Hull of a list of points.
  40.    
  41.   (defun LM:ConvexHull ( lst / ch p0 )
  42.       (cond
  43.           (   (< (length lst) 4) lst)
  44.           (   (setq p0 (car lst))
  45.               (foreach p1 (cdr lst)
  46.                   (if (or (< (cadr p1) (cadr p0))
  47.                           (and (equal (cadr p1) (cadr p0) 1e-8) (< (car p1) (car p0)))
  48.                       )
  49.                       (setq p0 p1)
  50.                   )
  51.               )
  52.               (setq lst
  53.                   (vl-sort lst
  54.                       (function
  55.                           (lambda ( a b / c d )
  56.                               (if (equal (setq c (angle p0 a)) (setq d (angle p0 b)) 1e-8)
  57.                                   (< (distance p0 a) (distance p0 b))
  58.                                   (< (if (equal c (* 2.0 pi) 1e-8) 0.0 c) (if (equal d (* 2.0 pi) 1e-8) 0.0 d))
  59.                               )
  60.                           )
  61.                       )
  62.                   )
  63.               )
  64.               (setq ch (list (caddr lst) (cadr lst) (car lst)))
  65.               (foreach pt (cdddr lst)
  66.                   (setq ch (cons pt ch))
  67.                   (while (and (caddr ch) (LM:Clockwise-p (caddr ch) (cadr ch) pt) (not (MR:Collinear-p (3D->2D (caddr ch)) (3D->2D (cadr ch)) (3D->2D pt))))
  68.                       (setq ch (cons pt (cddr ch)))
  69.                   )
  70.               )
  71.               ch
  72.           )
  73.       )
  74.   )
  75.  
  76.   (defun triangulate ( pl factor / tl pll getcircumcircle xmin xmax ymin ymax cs pmin pmax t1 t2 t3 al p el tr l n str och ich iche i )
  77.  
  78.     (defun getcircumcircle ( p el / circumcircle cp cr rr )
  79.        
  80.       (defun circumcircle ( p1 p2 p3 / ang c r )
  81.         (if
  82.           (not
  83.             (zerop
  84.               (setq ang (- (angle p2 p3) (angle p2 p1)))
  85.             )
  86.           )
  87.           (setq c (polar p3 (+ -1.570796326794896 (angle p3 p1) ang) (setq r (/ (distance p1 p3) (sin ang) 2.0)))
  88.                r (abs r)
  89.           )
  90.         )
  91.         (list c r)
  92.       )
  93.  
  94.       (setq cp (car (setq cr (circumcircle (3D->2D p) (3D->2D (car el)) (3D->2D (cadr el))))) rr (cadr cr))
  95.       (list (mapcar '+ cp (list rr 0.0)) cp rr (list p (car el) (cadr el))) ;;; Added X apex of circumscribed triangle circle as first element of (getcircumcircle) output list ;;;
  96.     )
  97.  
  98.     (setq pll pl)
  99.     (setq xmin (caar (setq pl (vl-sort pl '(lambda ( a b ) (< (car a) (car b))))))) ;;; Sorted pl by X ;;;
  100.     (setq xmax (caar (vl-sort pl '(lambda ( a b ) (> (car a) (car b))))))
  101.     (setq ymin (cadar (vl-sort pl '(lambda ( a b ) (< (cadr a) (cadr b))))))
  102.     (setq ymax (cadar (vl-sort pl '(lambda ( a b ) (> (cadr a) (cadr b))))))
  103.     (setq cs (list (+ xmin (/ (- xmax xmin) 2.0)) (+ ymin (/ (- ymax ymin) 2.0))))
  104.     (setq pmin (list xmin ymin) pmax (list xmax ymax))
  105.     (setq t1 (polar cs 0.0 (if (setq n (atoi (substr (setq str (rtos (distance pmin cs) 1 0)) (- (strlen str) 2)))) (setq rs (expt factor (+ n 2)))))) ;;; Added 0.0 in polar for rotating supertriangle t1 is max X apex ;;;
  106.     ;;(setq t1 (polar cs 0.0 (setq rs (* 2.0 factor (distance pmin cs)))))
  107.     (setq t2 (polar cs (+ 0.0 (/ (* 2.0 pi) 3.0)) rs))
  108.     (setq t3 (polar cs (+ 0.0 (/ (* 4.0 pi) 3.0)) rs))
  109.     (setq al (list (list t1 cs rs (list t1 t2 t3))))
  110.     (while pl
  111.       (setq p (car pl))
  112.       (setq pl (cdr pl))
  113.       (setq el nil)
  114.       (while al
  115.         (setq tr (car al))
  116.         (setq al (cdr al))
  117.         (cond
  118.           ( (< (caar tr) (car p)) ;;; Comparison of X values ;;;
  119.             (setq tl (cons (cadddr tr) tl))
  120.           )
  121.           ( (< (distance p (cadr tr)) (caddr tr))
  122.             (setq el (append (list
  123.                               (list (car (last tr)) (cadr (last tr)))
  124.                               (list (cadr (last tr)) (caddr (last tr)))
  125.                               (list (caddr (last tr)) (car (last tr)))
  126.                             ) el
  127.                     )
  128.             )
  129.           )
  130.           ( t (setq l (cons tr l)) )
  131.         )
  132.       )
  133.       (if l (setq al l l nil))
  134.       (while el
  135.         (if (or (member (reverse (car el)) el)
  136.                (member (car el) (cdr el))
  137.             )
  138.             (setq el (vl-remove (reverse (car el)) el)
  139.                   el (vl-remove (car el) el)
  140.             )
  141.             (setq al (cons (getcircumcircle p (car el)) al)
  142.                   el (cdr el)
  143.             )
  144.         )
  145.       )
  146.     )
  147.     (foreach tr al (setq tl (cons (cadddr tr) tl)))
  148.     (setq tl (vl-remove-if '(lambda ( x ) (or (member t1 x) (member t2 x) (member t3 x))) tl))
  149.     (setq pl pll)
  150.     (if (null ell)
  151.       (progn
  152.         (setq el (mapcar '(lambda ( a b ) (list a b)) (setq och (LM:ConvexHull pll)) (cdr (reverse (cons (car och) (reverse och))))))
  153.         (mapcar '(lambda ( x ) (setq pll (vl-remove x pll))) och)
  154.         (setq ich (LM:ConvexHull pll))
  155.       )
  156.     )
  157.     (if ich
  158.       (progn
  159.         (setq ell t)
  160.         (foreach e el
  161.           (if (not (vl-some '(lambda ( x ) (and (member (car e) x) (member (cadr e) x))) tl))
  162.             (progn
  163.               (setq ich (vl-sort ich '(lambda ( a b ) (< (distance a (mid (3D->2D (car e)) (3D->2D (cadr e)))) (distance b (mid (3D->2D (car e)) (3D->2D (cadr e))))))))
  164.               (setq iche (vl-remove-if '(lambda ( x ) (> (distance x (mid (3D->2D (car e)) (3D->2D (cadr e)))) (distance (car e) (mid (3D->2D (car e)) (3D->2D (cadr e)))))) ich))
  165.               (foreach p iche
  166.                 (if (or
  167.                       (and
  168.                         (vl-some '(lambda ( x ) (if (and (member (car e) x) (member p x)) (setq tr x))) tl)
  169.                         (vl-some '(lambda ( x ) (and (member (car e) x) (member p x))) (vl-remove tr tl))
  170.                       )
  171.                       (and
  172.                         (vl-some '(lambda ( x ) (if (and (member (cadr e) x) (member p x)) (setq tr x))) tl)
  173.                         (vl-some '(lambda ( x ) (and (member (cadr e) x) (member p x))) (vl-remove tr tl))
  174.                       )
  175.                     )
  176.                     (setq iche (vl-remove p iche))
  177.                 )
  178.               )
  179.               (setq i (length iche))
  180.               (setq iche (cons (car e) iche) iche (cons (cadr e) iche))
  181.               (if (null z)
  182.                 (setq z 10.0)
  183.               )
  184.               (setq z
  185.                 (cond
  186.                   ( (<= i (length (car (triangulate iche 10.0))))
  187.                     (if (>= z 10.0)
  188.                       z
  189.                       (setq z 10.0)
  190.                     )
  191.                   )
  192.                   ( (<= i (length (car (triangulate iche 25.0))))
  193.                     (if (>= z 25.0)
  194.                       z
  195.                       (setq z 25.0)
  196.                     )
  197.                   )
  198.                   ( (<= i (length (car (triangulate iche 50.0))))
  199.                     (if (>= z 50.0)
  200.                       z
  201.                       (setq z 50.0)
  202.                     )
  203.                   )
  204.                   ( (<= i (length (car (triangulate iche 100.0))))
  205.                     (if (>= z 100.0)
  206.                       z
  207.                       (setq z 100.0)
  208.                     )
  209.                   )
  210.                   ( (<= i (length (car (triangulate iche 250.0))))
  211.                     (if (>= z 250.0)
  212.                       z
  213.                       (setq z 250.0)
  214.                     )
  215.                   )
  216.                   ( (<= i (length (car (triangulate iche 500.0))))
  217.                     (if (>= z 500.0)
  218.                       z
  219.                       (setq z 500.0)
  220.                     )
  221.                   )
  222.                   ( (<= i (length (car (triangulate iche 1000.0))))
  223.                     (if (>= z 1000.0)
  224.                       z
  225.                       (setq z 1000.0)
  226.                     )
  227.                   )
  228.                 )
  229.               )
  230.             )
  231.           )
  232.         )
  233.       )
  234.     )
  235.     (list tl z)
  236.   ) ;;; end of triangulate
  237.  
  238.   (setq ss (ssget '((0 . "POINT"))))
  239.   (repeat (setq i (sslength ss))
  240.     (setq p (cdr (assoc 10 (entget (ssname ss (setq i (1- i)))))))
  241.     (setq pl (cons p pl))
  242.   )
  243.   (setq z (cadr (triangulate pl 10.0)))
  244.   (foreach tr (car (triangulate pl z))
  245.     (entmake
  246.       (list (cons 0 "3DFACE")
  247.         (cons 10 (car tr))
  248.         (cons 11 (car tr))
  249.         (cons 12 (cadr tr))
  250.         (cons 13 (caddr tr))
  251.       )
  252.     )
  253.   )
  254.   (princ)
  255. )
  256.  

 8-)
« Last Edit: February 16, 2016, 05:29:07 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: Triangulation (re-visited)
« Reply #363 on: April 02, 2015, 05:50:07 AM »
I had modified my last code further more... Had to change Lee's Convex Hull subfunction to include collinear points along Hull...
I think that now is fine, test it and if you find some bug, please inform us...

Regards, M.R.
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

lamarn

  • Swamp Rat
  • Posts: 636
Re: Triangulation (re-visited)
« Reply #364 on: April 02, 2015, 05:58:25 AM »
Will do! Thanks..
Design is something you should do with both hands. My 2d hand , my 3d hand ..

lamarn

  • Swamp Rat
  • Posts: 636
Re: Triangulation (re-visited)
« Reply #365 on: April 02, 2015, 06:18:00 AM »
I tried it on a vertical en horizontal node model.
Seems so create some strange 3D faces .. (?)
Hope it helps you a bit futher
Design is something you should do with both hands. My 2d hand , my 3d hand ..

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: Triangulation (re-visited)
« Reply #366 on: April 02, 2015, 07:18:08 AM »
I don't understand, triangulation is planar algorithm that can be applied to 3D points to form TOP view triangulated surface... I've changed again Convex Hull sub - checking collinear positions of 2D projected points as Convex Hull sub is also planar algorithm that can be also applied on 3D points... This intervention may fix some bugs, but I don't know what do you want to achieve with vertical triangulation... You can make it normal WCS oriented and then if you want you can rotate 3d FACES in 3D space using rotate3d command...
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: Triangulation (re-visited)
« Reply #367 on: April 02, 2015, 11:03:24 AM »
I've noticed also that when supplied to (circumcircle) subfunction 3D points as arguments with Z=0.0 there is some sort of bug in triangulation... So I've changed this to supply only 2D points inside (getcircumcircle) to (circumcircle) subfunction... So, please retest the code again and inform me if something's also wrong...

Regards...
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #368 on: April 02, 2015, 05:34:47 PM »
Marko,

When you use the polar function in getcircumcircle is
where you need your 2d point.

Another way to insure your convex hull would be to
normalize the points on the interval 0,1

Also has the advantage of adding to the accuracy,
specially when using big coordinates.

ymg

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: Triangulation (re-visited)
« Reply #369 on: April 04, 2015, 04:30:32 AM »
ymg, can you show your implementation if you are not busy... I've cleaned and updated once again all my posted codes, and I've changed animated gif along with its example...

lamarn, if you still have trouble with your point cloud, can you upload your example to us to try to fix where the problem occur - maybe final Convex triangulation code needs more cleaning...

M.R.
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #370 on: April 04, 2015, 06:40:15 PM »
Marko,

What I mean by normalizing the point list is this:

Code - Auto/Visual Lisp: [Select]
  1.           (setq bb (list (apply 'mapcar (cons 'min pl))
  2.                           (apply 'mapcar (cons 'max pl))
  3.                         )
  4.                xmin (caar bb)      
  5.                xmax (caadr bb)      
  6.                ymin (cadar bb)      
  7.                ymax (cadadr bb)
  8.                dmax (max (- xmax xmin)(- ymax ymin))
  9.                  ; Points are Scaled to 1 along Max of x and y dimensions     ;
  10.                  pl (mapcar
  11.                        (function
  12.                            (lambda (a) (list (/ (- (car a) xmin) dmax)
  13.                                              (/ (- (cadr a) ymin) dmax)
  14.                                              (caddr a)
  15.                                        )
  16.                            )        
  17.                        )
  18.                        pl
  19.                     )
  20.  

Then before outputting the triangle, you reverse the process:

Code - Auto/Visual Lisp: [Select]
  1.                      (function
  2.                          (lambda (a) (list (+ (* (car  a) dmax) xmin)
  3.                                            (+ (* (cadr a) dmax) ymin)
  4.                                            (caddr a)
  5.                                      )
  6.                          )
  7.                       )  
  8.                       pl
  9.                   )
  10.          )
  11.  


For the circumcircle function, I've removed the call to a routine
and put the code inline.

Code - Auto/Visual Lisp: [Select]
  1. ;Removes doubled edges, computes circumcircles and add them to al ;
  2.            
  3.             (while el
  4.                (if (or (member (reverse (car el)) el)
  5.                        (member (car el) (cdr el)))
  6.                  (setq el (vl-remove (reverse (car el)) el)
  7.                        el (vl-remove (car el) el)
  8.                  )
  9.                  (progn  ; This replaces call to getcircumcircle function     ;
  10.                       (setq p (nth n pl)
  11.                             b (nth (caar el) pl)
  12.                             c (nth (cadar el) pl)
  13.                             c (list (car c) (cadr c)) ; Point c has to be 2d
  14.                            vl (list n (caar el) (cadar el))
  15.                       )
  16.                       (if (not (zerop (setq ang (- (angle b c) (angle b p)))))
  17.                          (setq cp (polar c (+ *-pi/2* (angle c p) ang)(setq r (/ (distance p c) (sin ang) 2.0)))
  18.                                al (cons (list (+ (car cp) (abs r)) cp (abs r) vl) al)
  19.                                el (cdr el)
  20.                          )
  21.                       )
  22.                  )
  23.                )
  24.             )
  25.  

ymg
« Last Edit: April 04, 2015, 06:52:28 PM by ymg »

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: Triangulation (re-visited)
« Reply #371 on: April 06, 2015, 11:01:15 AM »
I've added here :

http://www.theswamp.org/index.php?topic=9042.msg543147#msg543147

The second better optimized code for Convex Hull variant - it should be faster than previous one especially on larger point clouds...

Regards and thanks for the input ymg, although I think that now it's not necessary to make such implementation - maybe in your versions...
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #372 on: April 06, 2015, 01:14:32 PM »
Marko,

I do not scale the point list in my implementation.

It is however done by Sloan and also by Shewchuk.

As I told you, you gain some accuracy specially
if your point are like (5356897.235 287561.236 99.63)

The important thing is to know about the limitation
of any algorithm.

ymg

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: Triangulation (re-visited)
« Reply #373 on: April 29, 2015, 01:56:03 PM »
Now that I saw your newest version of TriangV0.6.2.6 I saw that you used LOFT command to create 3DSOLIDs and by my tests it's faster 10% than my previous version with EXTRUDE "D"... Still I am using my version of convex triangulation as base for creating single terrain 3DSOLID... Here is the code and if you have some remarks how to make it even faster I am all your ears...

Code - Auto/Visual Lisp: [Select]
  1. (defun c:terrain ( / mid 3D->2D MR:Collinear-p LM:Clockwise-p LM:ConvexHull triangulate 3df2sol ss i p pl elmin elevmin ss3f ti ell z )
  2.  
  3.   (defun mid ( p1 p2 )
  4.     (mapcar '(lambda ( a b ) (/ (+ a b) 2.0)) p1 p2)
  5.   )
  6.  
  7.   ;; 3D to 2D point  -  M.R.
  8.   ;; Returns 2D point list from supplied 3D point list or returns supplied argument if it isn't 3D point list
  9.  
  10.   (defun 3D->2D ( p )
  11.       (if (and (listp p) (vl-every '(lambda ( x ) (eq (type x) 'REAL)) p) (eq (length p) 3))
  12.           (list (car p) (cadr p))
  13.           p
  14.       )
  15.   )
  16.  
  17.   ;; Collinear-p  -  M.R.
  18.   ;; Returns T if p1,p2,p3 are collinear
  19.  
  20.   (defun MR:Collinear-p ( p1 p2 p3 )
  21.       (equal  (distance p1 p3)
  22.               (+ (distance p1 p2) (distance p2 p3))
  23.           1e-8
  24.       )
  25.   )
  26.  
  27.   ;; Clockwise-p  -  Lee Mac
  28.   ;; Returns T if p1,p2,p3 are clockwise oriented or collinear
  29.  
  30.   (defun LM:Clockwise-p ( p1 p2 p3 )
  31.       (<  (-  (* (- (car  p2) (car  p1)) (- (cadr p3) (cadr p1)))
  32.               (* (- (cadr p2) (cadr p1)) (- (car  p3) (car  p1)))
  33.           )
  34.           1e-8
  35.       )
  36.   )
  37.  
  38.   ;; Convex Hull  -  Lee Mac
  39.   ;; Implements the Graham Scan Algorithm to return the Convex Hull of a list of points.
  40.    
  41.   (defun LM:ConvexHull ( lst / ch p0 )
  42.       (cond
  43.           (   (< (length lst) 4) lst)
  44.           (   (setq p0 (car lst))
  45.               (foreach p1 (cdr lst)
  46.                   (if (or (< (cadr p1) (cadr p0))
  47.                           (and (equal (cadr p1) (cadr p0) 1e-8) (< (car p1) (car p0)))
  48.                       )
  49.                       (setq p0 p1)
  50.                   )
  51.               )
  52.               (setq lst
  53.                   (vl-sort lst
  54.                       (function
  55.                           (lambda ( a b / c d )
  56.                               (if (equal (setq c (angle p0 a)) (setq d (angle p0 b)) 1e-8)
  57.                                   (< (distance p0 a) (distance p0 b))
  58.                                   (< (if (equal c (* 2.0 pi) 1e-8) 0.0 c) (if (equal d (* 2.0 pi) 1e-8) 0.0 d))
  59.                               )
  60.                           )
  61.                       )
  62.                   )
  63.               )
  64.               (setq ch (list (caddr lst) (cadr lst) (car lst)))
  65.               (foreach pt (cdddr lst)
  66.                   (setq ch (cons pt ch))
  67.                   (while (and (caddr ch) (LM:Clockwise-p (caddr ch) (cadr ch) pt) (not (MR:Collinear-p (3D->2D (caddr ch)) (3D->2D (cadr ch)) (3D->2D pt))))
  68.                       (setq ch (cons pt (cddr ch)))
  69.                   )
  70.               )
  71.               ch
  72.           )
  73.       )
  74.   )
  75.  
  76.   (defun triangulate ( pl factor / tl pll getcircumcircle xmin xmax ymin ymax cs pmin pmax t1 t2 t3 al p el tr l n str ich iche i )
  77.  
  78.     (defun getcircumcircle ( p el / circumcircle cp cr rr )
  79.        
  80.       (defun circumcircle ( p1 p2 p3 / ang c r )
  81.         (if
  82.           (not
  83.             (zerop
  84.               (setq ang (- (angle p2 p3) (angle p2 p1)))
  85.             )
  86.           )
  87.           (setq c (polar p3 (+ -1.570796326794896 (angle p3 p1) ang) (setq r (/ (distance p1 p3) (sin ang) 2.0)))
  88.                r (abs r)
  89.           )
  90.         )
  91.         (list c r)
  92.       )
  93.  
  94.       (setq cp (car (setq cr (circumcircle (3D->2D p) (3D->2D (car el)) (3D->2D (cadr el))))) rr (cadr cr))
  95.       (list (+ (car cp) rr) cp rr (list p (car el) (cadr el))) ;;; Added X max of circumscribed triangle circle as first element of (getcircumcircle) output list ;;;
  96.     )
  97.  
  98.     (setq pll pl)
  99.     (setq xmin (caar (setq pl (vl-sort pl '(lambda ( a b ) (< (car a) (car b))))))) ;;; Sorted pl by X ;;;
  100.     (setq xmax (caar (vl-sort pl '(lambda ( a b ) (> (car a) (car b))))))
  101.     (setq ymin (cadar (vl-sort pl '(lambda ( a b ) (< (cadr a) (cadr b))))))
  102.     (setq ymax (cadar (vl-sort pl '(lambda ( a b ) (> (cadr a) (cadr b))))))
  103.     (setq cs (list (+ xmin (/ (- xmax xmin) 2.0)) (+ ymin (/ (- ymax ymin) 2.0))))
  104.     (setq pmin (list xmin ymin) pmax (list xmax ymax))
  105.     (setq t1 (polar cs 0.0 (if (setq n (atoi (substr (setq str (rtos (distance pmin cs) 1 0)) (- (strlen str) 2)))) (setq rs (expt factor (+ n 2)))))) ;;; Added 0.0 in polar for rotating supertriangle t1 is max X apex ;;;
  106.     ;;(setq t1 (polar cs 0.0 (setq rs (* 2.0 factor (distance pmin cs)))))
  107.     (setq t2 (polar cs (+ 0.0 (/ (* 2.0 pi) 3.0)) rs))
  108.     (setq t3 (polar cs (+ 0.0 (/ (* 4.0 pi) 3.0)) rs))
  109.     (setq al (list (list (car t1) cs rs (list t1 t2 t3))))
  110.     (while pl
  111.       (setq p (car pl))
  112.       (setq pl (cdr pl))
  113.       (setq el nil)
  114.       (while al
  115.         (setq tr (car al))
  116.         (setq al (cdr al))
  117.         (cond
  118.           ( (< (car tr) (car p)) ;;; Comparison of X values ;;;
  119.             (setq tl (cons (cadddr tr) tl))
  120.           )
  121.           ( (< (distance p (cadr tr)) (caddr tr))
  122.             (setq el (append (list
  123.                               (list (car (last tr)) (cadr (last tr)))
  124.                               (list (cadr (last tr)) (caddr (last tr)))
  125.                               (list (caddr (last tr)) (car (last tr)))
  126.                             ) el
  127.                     )
  128.             )
  129.           )
  130.           ( t (setq l (cons tr l)) )
  131.         )
  132.       )
  133.       (if l (setq al l l nil))
  134.       (while el
  135.         (if (or (member (reverse (car el)) el)
  136.                (member (car el) (cdr el))
  137.             )
  138.             (setq el (vl-remove (reverse (car el)) el)
  139.                   el (vl-remove (car el) el)
  140.             )
  141.             (setq al (cons (getcircumcircle p (car el)) al)
  142.                   el (cdr el)
  143.             )
  144.         )
  145.       )
  146.     )
  147.     (foreach tr al (setq tl (cons (cadddr tr) tl)))
  148.     (setq tl (vl-remove-if '(lambda ( x ) (or (member t1 x) (member t2 x) (member t3 x))) tl))
  149.     (setq pl pll)
  150.     (if (null ell)
  151.       (progn
  152.         (setq el (mapcar '(lambda ( a b ) (list a b)) (setq och (LM:ConvexHull pll)) (cdr (reverse (cons (car och) (reverse och))))))
  153.         (mapcar '(lambda ( x ) (setq pll (vl-remove x pll))) och)
  154.         (setq ich (LM:ConvexHull pll))
  155.       )
  156.     )
  157.     (if ich
  158.       (progn
  159.         (setq ell t)
  160.         (foreach e el
  161.           (if (not (vl-some '(lambda ( x ) (and (member (car e) x) (member (cadr e) x))) tl))
  162.             (progn
  163.               (setq ich (vl-sort ich '(lambda ( a b ) (< (distance a (mid (3D->2D (car e)) (3D->2D (cadr e)))) (distance b (mid (3D->2D (car e)) (3D->2D (cadr e))))))))
  164.               (setq iche (vl-remove-if '(lambda ( x ) (> (distance x (mid (3D->2D (car e)) (3D->2D (cadr e)))) (distance (car e) (mid (3D->2D (car e)) (3D->2D (cadr e)))))) ich))
  165.               (foreach p iche
  166.                 (if (or
  167.                       (and
  168.                         (vl-some '(lambda ( x ) (if (and (member (car e) x) (member p x)) (setq tr x))) tl)
  169.                         (vl-some '(lambda ( x ) (and (member (car e) x) (member p x))) (vl-remove tr tl))
  170.                       )
  171.                       (and
  172.                         (vl-some '(lambda ( x ) (if (and (member (cadr e) x) (member p x)) (setq tr x))) tl)
  173.                         (vl-some '(lambda ( x ) (and (member (cadr e) x) (member p x))) (vl-remove tr tl))
  174.                       )
  175.                     )
  176.                     (setq iche (vl-remove p iche))
  177.                 )
  178.               )
  179.               (setq i (length iche))
  180.               (setq iche (cons (car e) iche) iche (cons (cadr e) iche))
  181.               (if (null z)
  182.                 (setq z 10.0)
  183.               )
  184.               (setq z
  185.                 (cond
  186.                   ( (<= i (length (car (triangulate iche 10.0))))
  187.                     (if (>= z 10.0)
  188.                       z
  189.                       (setq z 10.0)
  190.                     )
  191.                   )
  192.                   ( (<= i (length (car (triangulate iche 25.0))))
  193.                     (if (>= z 25.0)
  194.                       z
  195.                       (setq z 25.0)
  196.                     )
  197.                   )
  198.                   ( (<= i (length (car (triangulate iche 50.0))))
  199.                     (if (>= z 50.0)
  200.                       z
  201.                       (setq z 50.0)
  202.                     )
  203.                   )
  204.                   ( (<= i (length (car (triangulate iche 100.0))))
  205.                     (if (>= z 100.0)
  206.                       z
  207.                       (setq z 100.0)
  208.                     )
  209.                   )
  210.                   ( (<= i (length (car (triangulate iche 250.0))))
  211.                     (if (>= z 250.0)
  212.                       z
  213.                       (setq z 250.0)
  214.                     )
  215.                   )
  216.                   ( (<= i (length (car (triangulate iche 500.0))))
  217.                     (if (>= z 500.0)
  218.                       z
  219.                       (setq z 500.0)
  220.                     )
  221.                   )
  222.                   ( (<= i (length (car (triangulate iche 1000.0))))
  223.                     (if (>= z 1000.0)
  224.                       z
  225.                       (setq z 1000.0)
  226.                     )
  227.                   )
  228.                 )
  229.               )
  230.             )
  231.           )
  232.         )
  233.       )
  234.     )
  235.     (list tl z)
  236.   ) ;;; end of triangulate
  237.  
  238.   ;;                                                                            ;
  239.   ;; 3df2sol     by  ymg   mod by M.R.                                          ;
  240.   ;;                                                                            ;
  241.   ;; Given a triangle point list of 3DFACE Loft it Down to Elevation - elev     ;
  242.   ;; Returns the ename of the Solid created.                                    ;
  243.   ;; Original 3DFACE is deleted.                                                ;
  244.   ;;                                                                            ;
  245.  
  246.   (defun 3df2sol ( tr elev / en1 en2 p1 p2 p3 p4 )
  247.     (setq
  248.       p1 (car tr)
  249.       p2 (cadr tr)
  250.       p3 (caddr tr)
  251.       p4 (car tr)
  252.     )
  253.     (setq
  254.       en1
  255.       (entmakex
  256.         (list
  257.           (cons 0 "3DFACE")
  258.           (cons 10 (list (car p1) (cadr p1) elev))
  259.           (cons 11 (list (car p2) (cadr p2) elev))
  260.           (cons 12 (list (car p3) (cadr p3) elev))
  261.           (cons 13 (list (car p4) (cadr p4) elev))
  262.         )
  263.       )
  264.     )
  265.     (setq
  266.       en2
  267.       (entmakex
  268.         (list
  269.           (cons 0 "3DFACE")
  270.           (cons 10 p1)
  271.           (cons 11 p2)
  272.           (cons 12 p3)
  273.           (cons 13 p4)
  274.         )
  275.       )
  276.     )
  277.     (vl-cmdf "_.LOFT" en1 en2 "_MO" "_SOLID")
  278.     (while (> (getvar 'cmdactive) 0) (vl-cmdf ""))
  279.     (if (entget en1) (entdel en1))
  280.     (if (entget en2) (entdel en2))
  281.     (entlast)
  282.   )
  283.  
  284.   (prompt "\n................................................")
  285.   (prompt "\nTERRAIN TRIANGULATION IRREGULAR NETWORK MODELING")
  286.   (prompt "\n................................................")
  287.   (prompt "\n................................................")
  288.   (prompt "\nSELECT RANDOM 3D POINTS...")
  289.   (setq ss (ssget '((0 . "POINT"))))
  290.   (repeat (setq i (sslength ss))
  291.     (setq p (cdr (assoc 10 (entget (ssname ss (setq i (1- i)))))))
  292.     (setq pl (cons p pl))
  293.   )
  294.  
  295.   (setq elevmin (caddar (setq pl (vl-sort pl '(lambda ( a b ) (< (caddr a) (caddr b)))))))
  296.   (setq elmin (getreal (strcat "\nInput base elevation of terrain (must be < " (rtos elevmin 2 15) " ) : ")))
  297.   (while (>= elmin elevmin)
  298.     (setq elmin (getreal (strcat "\nInput base elevation of terrain (must be < " (rtos elevmin 2 15) " ) : ")))
  299.   )
  300.  
  301.   (setq ti (car (_vl-times)))
  302.   (setq ss3f (ssadd))
  303.   (setq z (cadr (triangulate pl 10.0)))
  304.   (foreach tr (car (triangulate pl z))
  305.     (ssadd
  306.       (3df2sol tr elmin)
  307.       ss3f
  308.     )
  309.   )
  310.  
  311.   (vl-cmdf "_.UNION" ss3f "")
  312.  
  313.   (prompt (strcat "\nElapsed time: " (rtos (/ (- (car (_vl-times)) ti) 1000.) 2 4) " secs."))
  314.   (princ)
  315. )
  316.  

M.R.
« Last Edit: February 16, 2016, 05:32:27 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ymg

  • Guest
Re: Triangulation (re-visited)
« Reply #374 on: April 29, 2015, 03:41:57 PM »
Marko,

I may as well post this version here.

I've done some work on the c:prof command,
the dialog box is mpe or less completed for it.

I've also corrected some nasties in c:Xshape
plus a few speed improvements and some clean up
of routine not used.

I will look at your code when I have a chance and
share any though I might have.

Still lots of work required to make the layer control
fully effective when switching between surfaces.

I also attached a drawing with  four different surfaces
for those who would like to experiment with Xshapes.

ymg
« Last Edit: April 30, 2015, 05:05:59 AM by ymg »