Author Topic: ==={Challenge}=== Voronoi sphere  (Read 2885 times)

0 Members and 1 Guest are viewing this topic.

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
==={Challenge}=== Voronoi sphere
« on: August 14, 2013, 07:44:48 AM »
So, inspired with these topics :

http://www.theswamp.org/index.php?topic=45085.0
and
http://www.theswamp.org/index.php?topic=44259.0

I tried to construct something of both codes combined...
I had no luck in getting desired results, as on www there is some pictures showing correct results... I have trouble in connecting projected circumcenters of triangles that are around making outer faces envelope (SPHERE-TIN) - projected on sphere and can't whatever I think make correct condition of how to make these connections... After studying Voronoi diagram and observing triangles in 3D space I came to conclusion that this condition is as opposite in plane (checking circle-circle intersections) in 3D is checking sphere-sphere intersections - so my (if (< (distance o1 o2) (+ r1 r2)) ... ) should work, but when executing routine something is wrong, not to mention that I firstly wanted to connect these projected circumcenters with arcs, but then I abandoned this as something again wasn't correct either with arbitary axis orientation or and something with calculating correct arcs start-end angles-parameters (dxf 50, dxf 51)... It would be nice if connection with arcs would work, but even with simple point-point connection with straight lines doesn't satisfy...

So if you see something I haven't and you wish to help, you're very welcome...

I'll attach 36 RND points cloud with center of sphere at point (50.0 50.0 50.0), so you can do tests...

Code - Auto/Visual Lisp: [Select]
  1. (defun c:voronoi-sphere ( / unit mxv v^v transptucs transptwcs _reml AssocOn mid otr acos angle3d checkpts
  2.                             pt1l pt2l ss n pt ptlst nor x tr oo ol rl orl osph o1l r r1 r2 in o1 o2 oo1 oo2 tmp uz ux uy pux a1 a2 ce )
  3.  
  4.   (or (tblsearch "LAYER" "SPHERE-TIN")
  5.       (entmake
  6.         (list
  7.             '(0 . "LAYER")
  8.             '(100 . "AcDbSymbolTableRecord")
  9.             '(100 . "AcDbLayerTableRecord")
  10.             '(2 . "SPHERE-TIN")
  11.             '(70 . 0)
  12.             '(62 . 8)
  13.             '(6 . "Continuous")
  14.             '(290 . 1)
  15.             '(370 . -3)
  16.         )
  17.       )
  18.   )
  19.  
  20.   (setvar "CLAYER" "SPHERE-TIN")
  21.  
  22.   (defun unit ( v )
  23.     (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  24.   )
  25.  
  26.   (defun mxv ( m v )
  27.     (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
  28.   )
  29.  
  30.   (defun v^v ( u v )
  31.     (mapcar '(lambda ( n ) (- (* (nth (car n) u) (nth (cadr n) v)) (* (nth (cadr n) u) (nth (car n) v)))) '((1 2) (2 0) (0 1)))
  32.   )
  33.  
  34.   (defun transptucs ( pt p1 p2 p3 / ux uy uz )
  35.     (setq uz (unit (v^v (mapcar '- p2 p1) (mapcar '- p3 p1))))
  36.     (setq ux (unit (mapcar '- p2 p1)))
  37.     (setq uy (unit (mapcar '- p3 p1)))
  38.    
  39.     (mxv (list ux uy uz) (mapcar '- pt p1))
  40.   )
  41.  
  42.   (defun transptwcs ( pt pt1 pt2 pt3 / pt1n pt2n pt3n )
  43.     (setq pt1n (transptucs '(0.0 0.0 0.0) pt1 pt2 pt3))
  44.     (setq pt2n (transptucs '(1.0 0.0 0.0) pt1 pt2 pt3))
  45.     (setq pt3n (transptucs '(0.0 1.0 0.0) pt1 pt2 pt3))
  46.     (transptucs pt pt1n pt2n pt3n)
  47.   )
  48.  
  49.   (defun _reml (l1 l2 / a n ls)
  50.     (while
  51.       (setq n nil
  52.             a (car l2)
  53.       )
  54.       (while (and l1 (null n))
  55.         (if (equal a (car l1) 1e-8)
  56.           (setq l1 (cdr l1)
  57.                 n t
  58.           )
  59.           (setq ls (append ls (list (car l1)))
  60.                 l1 (cdr l1)
  61.           )
  62.         )
  63.       )
  64.       (setq l2 (cdr l2))
  65.     )
  66.     (append ls l1)
  67.   )
  68.  
  69.   (defun AssocOn ( SearchTerm Lst func fuzz )
  70.     (car
  71.       (vl-member-if
  72.         (function
  73.           (lambda (pair) (equal SearchTerm (apply func (list pair)) fuzz))
  74.         )
  75.         lst
  76.       )
  77.     )
  78.   )
  79.  
  80.   (defun mid ( p1 p2 )
  81.     (mapcar '(lambda (a b) (/ (+ a b) 2.0)) p1 p2)
  82.   )
  83.  
  84.   (defun otr ( tr / p1 p2 p3 p12 p23 p31 z o )
  85.     (setq p1 (car tr)
  86.           p2 (cadr tr)
  87.           p3 (caddr tr)
  88.     )
  89.     (setq z (v^v (mapcar '- p3 p1) (mapcar '- p2 p1)))
  90.     (setq p12 (mid p1 p2)
  91.           p23 (mid p2 p3)
  92.           p31 (mid p3 p1)
  93.     )
  94.     (setq o (inters p12 (mapcar '+ p12 (v^v (mapcar '- p2 p1) z)) p23 (mapcar '+ p23 (v^v (mapcar '- p3 p2) z)) nil))
  95.     o
  96.   )
  97.  
  98.   (defun acos ( x )
  99.     (cond
  100.       ((equal x 1.0 1e-8) 0.0)
  101.       ((equal x -1.0 1e-8) pi)
  102.       ((equal x 0.0 1e-8) (/ pi 2.0))
  103.       ((equal x -0.0 1e-8) (* 3.0 (/ pi 2.0)))
  104.       ((atan (/ (sqrt (- 1.0 (* x x))) x)))
  105.     )
  106.   )
  107.  
  108.   (defun angle3d ( p1 por p2 / vec1 vec2 dd ang )
  109.     (setq vec1 (unit (mapcar '- p1 por))
  110.           vec2 (unit (mapcar '- p2 por))
  111.           dd (distance vec1 vec2)
  112.           ang (acos (- 1.0 (/ (expt dd 2) 2.0)))
  113.     )
  114.     (if (minusp ang) (+ ang pi) ang)
  115.   )
  116.  
  117.   (defun checkpts ( ptlst pt1 x nor / y )
  118.     (if (and (setq oneside (if (< (length signs) 2) T (if (eq (car signs) (cadr signs)) T nil))) ptlst)
  119.       (cond ((> (setq y (cadr (transptucs (car ptlst) pt1 (mapcar '+ pt1 x) (mapcar '+ pt1 nor)))) 1e-8)
  120.              (setq signs (cons T signs))
  121.              (checkpts (cdr ptlst) pt1 x nor)
  122.             )
  123.             ((< y -1e-8)
  124.              (setq signs (cons nil signs))
  125.              (checkpts (cdr ptlst) pt1 x nor)
  126.             )
  127.             ((equal y 0.0 1e-10)
  128.              (if signs (setq signs (cons (car signs) signs)))
  129.              (checkpts (cdr ptlst) pt1 x nor)
  130.             )
  131.       )
  132.       oneside
  133.     )
  134.   )
  135.  
  136.   (setq ss (ssget "_:L" '((0 . "POINT"))))
  137.   (repeat (setq n (sslength ss))
  138.     (setq pt (cdr (assoc 10 (entget (ssname ss (setq n (1- n)))))))
  139.     (setq ptlst (cons pt ptlst))
  140.   )
  141.   (foreach pt1 ptlst
  142.     (setq pt1l (cons pt1 pt1l))
  143.     (foreach pt2 (_reml ptlst pt1l)
  144.       (setq pt2l (cons pt2 pt2l))
  145.       (foreach pt3 (_reml (_reml ptlst pt1l) pt2l)
  146.         (setq nor (v^v (setq x (mapcar '- pt3 pt1)) (mapcar '- pt2 pt1)))
  147.         (if (not (equal nor '(0.0 0.0 0.0) 1e-8))
  148.           (if (checkpts (vl-remove pt1 (vl-remove pt2 (vl-remove pt3 ptlst))) pt1 x nor)
  149.             (progn
  150.               (entmake (list '(0 . "3DFACE") (cons 10 pt1) (cons 11 pt1) (cons 12 pt2) (cons 13 pt3)))
  151.               (setq tr (list pt1 pt2 pt3))
  152.               (setq ol (cons (setq oo (otr tr)) ol))
  153.               (setq rl (cons (distance oo pt1) rl))
  154.             )
  155.           )
  156.         )
  157.         (setq signs nil oneside nil)
  158.       )
  159.     )
  160.   )
  161.  
  162.   (or (tblsearch "LAYER" "SPHERE-Voronoi")
  163.       (entmake
  164.         (list
  165.             '(0 . "LAYER")
  166.             '(100 . "AcDbSymbolTableRecord")
  167.             '(100 . "AcDbLayerTableRecord")
  168.             '(2 . "SPHERE-Voronoi")
  169.             '(70 . 0)
  170.             '(62 . 10)
  171.             '(6 . "Continuous")
  172.             '(290 . 1)
  173.             '(370 . -3)
  174.         )
  175.       )
  176.   )
  177.  
  178.   (setvar "CLAYER" "SPHERE-Voronoi")
  179.  
  180.   (setq orl (mapcar '(lambda ( a b ) (cons a b)) ol rl))
  181.   (setq osph (inters
  182.                (setq oo (otr (list (car ptlst) (cadr ptlst) (caddr ptlst))))
  183.                (mapcar '+ oo (v^v (mapcar '- (caddr ptlst) (car ptlst)) (mapcar '- (cadr ptlst) (car ptlst))))
  184.                (setq oo (otr (list (car ptlst) (cadr ptlst) (cadddr ptlst))))
  185.                (mapcar '+ oo (v^v (mapcar '- (cadddr ptlst) (car ptlst)) (mapcar '- (cadr ptlst) (car ptlst))))
  186.                nil
  187.              )
  188.         oo nil
  189.   )
  190.   (setq r (distance osph (car ptlst)))
  191.  
  192.   (foreach o1 ol
  193.     (setq o1l (cons o1 o1l))
  194.     (setq r1 (cdr (assocon o1 orl 'car 1e-6)))
  195.     (foreach o2 (_reml ol o1l)
  196.       (setq r2 (cdr (assocon o2 orl 'car 1e-6)))
  197.       (if (< (distance o1 o2) (+ r1 r2))
  198.         (progn
  199.           (setq o1 (mapcar '(lambda ( x ) (* x r)) (unit (mapcar '- o1 osph))))
  200.           (setq o2 (mapcar '(lambda ( x ) (* x r)) (unit (mapcar '- o2 osph))))
  201.           (setq oo1 (mapcar '+ o1 osph) oo2 (mapcar '+ o2 osph))
  202. ;|          (if (minusp (- (* (car o1) (cadr o2)) (* (cadr o1) (car o2)))) (setq tmp oo1 oo1 oo2 oo2 tmp))
  203.           (setq uz (unit (v^v o1 o2)))
  204.           (if (equal uz '(0.0 0.0 1.0) 1e-8) (setq ux '(1.0 0.0 0.0) uy '(0.0 1.0 0.0)))
  205.           (if (equal uz '(0.0 0.0 -1.0) 1e-8) (setq ux '(-1.0 0.0 0.0) uy '(0.0 -1.0 0.0)))
  206.           (if (not (or (equal uz '(0.0 0.0 1.0) 1e-8) (equal uz '(0.0 0.0 -1.0) 1e-8))) (setq ux (unit (v^v '(0.0 0.0 1.0) uz))))
  207.           (if (not uy) (setq uy (unit (v^v uz ux))))
  208.           (setq ce (trans osph 0 uz))
  209.           (setq pux (mapcar '+ osph ux))
  210.           (setq a1 (angle3d pux osph oo1) a2 (angle3d pux osph oo2))
  211.           (if (> a1 a2) (setq tmp a1 a1 a2 a2 tmp))
  212.           (entmake (list '(0 . "ARC") '(100 . "AcDbEntity") '(100 . "AcDbCircle") (cons 10 ce) (cons 40 r) (cons 210 uz) '(100 . "AcDbArc") (cons 50 a1) (cons 51 a2)))
  213. |;
  214.           (entmake (list '(0 . "LINE") (cons 10 oo1) (cons 11 oo2)))
  215.         )
  216.       )
  217.     )
  218.   )
  219.  
  220.   (princ)
  221. )
  222.  

Thanks in advance, M.R.
« Last Edit: August 26, 2013, 05:04:33 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: ==={Challenge}=== Voronoi sphere
« Reply #1 on: August 14, 2013, 10:47:33 AM »
Neither this won't work... Tried with checking same edges...

[EDIT] : Found mistake - now it works

Code - Auto/Visual Lisp: [Select]
  1. (defun c:voronoi-sphere ( / unit mxv v^v transptucs transptwcs _reml AssocOn mid otr checkpts unique _vl-remove erasedup3df
  2.                             osm c1 c2 p1 p2 p3 e1 e2 e3 e11 e12 e13 e21 e22 e23 pt1l pt2l ss s i n pt ptlst nor x tr oo ol oel osph o1l r o1 o2 oo1 oo2 tmp uz ux uy pux a1 a2 ce )
  3.  
  4.                            
  5.   (setq osm (getvar 'osmode))
  6.   (setvar 'osmode 0)
  7.   (or (tblsearch "LAYER" "SPHERE-TIN")
  8.       (entmake
  9.         (list
  10.             '(0 . "LAYER")
  11.             '(100 . "AcDbSymbolTableRecord")
  12.             '(100 . "AcDbLayerTableRecord")
  13.             '(2 . "SPHERE-TIN")
  14.             '(70 . 0)
  15.             '(62 . 8)
  16.             '(6 . "Continuous")
  17.             '(290 . 1)
  18.             '(370 . -3)
  19.         )
  20.       )
  21.   )
  22.  
  23.   (setvar "CLAYER" "SPHERE-TIN")
  24.  
  25.   (defun unit ( v )
  26.     (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  27.   )
  28.  
  29.   (defun mxv ( m v )
  30.     (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
  31.   )
  32.  
  33.   (defun v^v ( u v )
  34.     (mapcar '(lambda ( n ) (- (* (nth (car n) u) (nth (cadr n) v)) (* (nth (cadr n) u) (nth (car n) v)))) '((1 2) (2 0) (0 1)))
  35.   )
  36.  
  37.   (defun transptucs ( pt p1 p2 p3 / ux uy uz )
  38.     (setq uz (unit (v^v (mapcar '- p2 p1) (mapcar '- p3 p1))))
  39.     (setq ux (unit (mapcar '- p2 p1)))
  40.     (setq uy (unit (mapcar '- p3 p1)))
  41.    
  42.     (mxv (list ux uy uz) (mapcar '- pt p1))
  43.   )
  44.  
  45.   (defun transptwcs ( pt pt1 pt2 pt3 / pt1n pt2n pt3n )
  46.     (setq pt1n (transptucs '(0.0 0.0 0.0) pt1 pt2 pt3))
  47.     (setq pt2n (transptucs '(1.0 0.0 0.0) pt1 pt2 pt3))
  48.     (setq pt3n (transptucs '(0.0 1.0 0.0) pt1 pt2 pt3))
  49.     (transptucs pt pt1n pt2n pt3n)
  50.   )
  51.  
  52.   (defun _reml (l1 l2 / a n ls)
  53.     (while
  54.       (setq n nil
  55.             a (car l2)
  56.       )
  57.       (while (and l1 (null n))
  58.         (if (equal a (car l1) 1e-8)
  59.           (setq l1 (cdr l1)
  60.                 n t
  61.           )
  62.           (setq ls (append ls (list (car l1)))
  63.                 l1 (cdr l1)
  64.           )
  65.         )
  66.       )
  67.       (setq l2 (cdr l2))
  68.     )
  69.     (append ls l1)
  70.   )
  71.  
  72.   (defun AssocOn ( SearchTerm Lst func fuzz )
  73.     (car
  74.       (vl-member-if
  75.         (function
  76.           (lambda (pair) (equal SearchTerm (apply func (list pair)) fuzz))
  77.         )
  78.         lst
  79.       )
  80.     )
  81.   )
  82.  
  83.   (defun mid ( p1 p2 )
  84.     (mapcar '(lambda (a b) (/ (+ a b) 2.0)) p1 p2)
  85.   )
  86.  
  87.   (defun otr ( tr / p1 p2 p3 p12 p23 p31 z o )
  88.     (setq p1 (car tr)
  89.           p2 (cadr tr)
  90.           p3 (caddr tr)
  91.     )
  92.     (setq z (v^v (mapcar '- p3 p1) (mapcar '- p2 p1)))
  93.     (setq p12 (mid p1 p2)
  94.           p23 (mid p2 p3)
  95.           p31 (mid p3 p1)
  96.     )
  97.     (setq o (inters p12 (mapcar '+ p12 (v^v (mapcar '- p2 p1) z)) p23 (mapcar '+ p23 (v^v (mapcar '- p3 p2) z)) nil))
  98.     o
  99.   )
  100.  
  101.   (defun checkpts ( ptlst pt1 x nor / y )
  102.     (if (and (setq oneside (if (< (length signs) 2) T (if (eq (car signs) (cadr signs)) T nil))) ptlst)
  103.       (cond ((> (setq y (cadr (transptucs (car ptlst) pt1 (mapcar '+ pt1 x) (mapcar '+ pt1 nor)))) 1e-8)
  104.              (setq signs (cons T signs))
  105.              (checkpts (cdr ptlst) pt1 x nor)
  106.             )
  107.             ((< y -1e-8)
  108.              (setq signs (cons nil signs))
  109.              (checkpts (cdr ptlst) pt1 x nor)
  110.             )
  111.             ((equal y 0.0 1e-10)
  112.              (if signs (setq signs (cons (car signs) signs)))
  113.              (checkpts (cdr ptlst) pt1 x nor)
  114.             )
  115.       )
  116.       oneside
  117.     )
  118.   )
  119.  
  120.   (defun unique ( lst )
  121.     (if lst (cons (car lst) (unique (_vl-remove (car lst) (_vl-remove (list (caar lst) (caddar lst) (cadar lst)) (_vl-remove (list (cadar lst) (caar lst) (caddar lst)) (_vl-remove (list (cadar lst) (caddar lst) (caar lst)) (_vl-remove (list (caddar lst) (caar lst) (cadar lst)) (_vl-remove (list (caddar lst) (cadar lst) (caar lst)) (cdr lst) 1e-6) 1e-6) 1e-6) 1e-6) 1e-6) 1e-6))))
  122.   )
  123.  
  124.   (defun _vl-remove ( el lst fuzz )
  125.     (vl-remove-if '(lambda ( x ) (and (equal (car x) (car el) fuzz) (equal (cadr x) (cadr el) fuzz) (equal (caddr x) (caddr el) fuzz))) lst)
  126.   )
  127.  
  128.   (defun erasedup3df ( ss / n 3df p1 p2 p3 p4 lay 3dfpts 3dflst )
  129.     (repeat (setq n (sslength ss))
  130.       (setq 3df (ssname ss (setq n (1- n))))
  131.       (setq p1 (cdr (assoc 10 (entget 3df)))
  132.             p2 (cdr (assoc 11 (entget 3df)))
  133.             p3 (cdr (assoc 12 (entget 3df)))
  134.             p4 (cdr (assoc 13 (entget 3df)))
  135.             lay (cdr (assoc 8 (entget 3df)))
  136.       )
  137.       (cond ((equal p1 p2 1e-8) (setq 3dfpts (list p1 p3 p4)))
  138.             ((equal p2 p3 1e-8) (setq 3dfpts (list p1 p2 p4)))
  139.             ((equal p3 p4 1e-8) (setq 3dfpts (list p1 p2 p3)))
  140.             ((equal p1 p4 1e-8) (setq 3dfpts (list p2 p3 p4)))
  141.       )
  142.       (setq 3dflst (cons 3dfpts 3dflst))
  143.       (entdel 3df)
  144.     )
  145.     (foreach 3dfpts (unique 3dflst)
  146.       (entmake (list '(0 . "3DFACE") (cons 8 lay) (cons 10 (car 3dfpts)) (cons 11 (car 3dfpts)) (cons 12 (cadr 3dfpts)) (cons 13 (caddr 3dfpts))))
  147.     )
  148.     (princ)
  149.   )  
  150.  
  151.   (setq ss (ssget "_:L" '((0 . "POINT"))))
  152.   (repeat (setq n (sslength ss))
  153.     (setq pt (cdr (assoc 10 (entget (ssname ss (setq n (1- n)))))))
  154.     (setq ptlst (cons pt ptlst))
  155.   )
  156.   (foreach pt1 ptlst
  157.     (setq pt1l (cons pt1 pt1l))
  158.     (foreach pt2 (_reml ptlst pt1l)
  159.       (setq pt2l (cons pt2 pt2l))
  160.       (foreach pt3 (_reml (_reml ptlst pt1l) pt2l)
  161.         (setq nor (v^v (setq x (mapcar '- pt3 pt1)) (mapcar '- pt2 pt1)))
  162.         (if (not (equal nor '(0.0 0.0 0.0) 1e-8))
  163.           (if (checkpts (vl-remove pt1 (vl-remove pt2 (vl-remove pt3 ptlst))) pt1 x nor)
  164.             (progn
  165.               (entmake (list '(0 . "3DFACE") (cons 10 pt1) (cons 11 pt1) (cons 12 pt2) (cons 13 pt3)))
  166.             )
  167.           )
  168.         )
  169.         (setq signs nil oneside nil)
  170.       )
  171.     )
  172.   )
  173.  
  174.   (setq s (ssget "_X" '((0 . "3DFACE") (8 . "SPHERE-TIN"))))
  175.   (erasedup3df s)
  176.  
  177.   (setq s (ssget "_X" '((0 . "3DFACE") (8 . "SPHERE-TIN"))))
  178.   (setq i -1)
  179.   (while (setq 3df (ssname s (setq i (1+ i))))
  180.     (setq p1 (cdr (assoc 11 (entget 3df)))
  181.           p2 (cdr (assoc 12 (entget 3df)))
  182.           p3 (cdr (assoc 13 (entget 3df)))
  183.     )
  184.     (setq tr (list p1 p2 p3))
  185.     (setq ol (cons (setq oo (otr tr)) ol))
  186.     (setq e1 (mapcar '- p2 p1) e2 (mapcar '- p3 p1) e3 (mapcar '- p3 p2))
  187.     (setq oel (cons (list oo (list e1 e2 e3)) oel))
  188.   )
  189.  
  190.   (or (tblsearch "LAYER" "SPHERE-Voronoi")
  191.       (entmake
  192.         (list
  193.             '(0 . "LAYER")
  194.             '(100 . "AcDbSymbolTableRecord")
  195.             '(100 . "AcDbLayerTableRecord")
  196.             '(2 . "SPHERE-Voronoi")
  197.             '(70 . 0)
  198.             '(62 . 10)
  199.             '(6 . "Continuous")
  200.             '(290 . 1)
  201.             '(370 . -3)
  202.         )
  203.       )
  204.   )
  205.  
  206.   (setvar "CLAYER" "SPHERE-Voronoi")
  207.  
  208.   (setq osph (inters
  209.                (setq oo (otr (list (car ptlst) (cadr ptlst) (caddr ptlst))))
  210.                (mapcar '+ oo (v^v (mapcar '- (caddr ptlst) (car ptlst)) (mapcar '- (cadr ptlst) (car ptlst))))
  211.                (setq oo (otr (list (car ptlst) (cadr ptlst) (cadddr ptlst))))
  212.                (mapcar '+ oo (v^v (mapcar '- (cadddr ptlst) (car ptlst)) (mapcar '- (cadr ptlst) (car ptlst))))
  213.                nil
  214.              )
  215.         oo nil
  216.   )
  217.   (setq r (distance osph (car ptlst)))
  218.  
  219.   (foreach o1 ol
  220.     (setq o1l (cons o1 o1l))
  221.     (setq e11 (caadr (assocon o1 oel 'car 1e-6))
  222.           e12 (cadadr (assocon o1 oel 'car 1e-6))
  223.           e13 (caddr (cadr (assocon o1 oel 'car 1e-6)))
  224.     )
  225.     (foreach o2 (_reml ol o1l)
  226.       (setq e21 (caadr (assocon o2 oel 'car 1e-6))
  227.             e22 (cadadr (assocon o2 oel 'car 1e-6))
  228.             e23 (caddr (cadr (assocon o2 oel 'car 1e-6)))
  229.       )
  230.       (if (or
  231.               (equal e11 e21 1e-6) (equal e11 e22 1e-6) (equal e11 e23 1e-6)
  232.               (equal e11 (mapcar '* '(-1.0 -1.0 -1.0) e21) 1e-6) (equal e11 (mapcar '* '(-1.0 -1.0 -1.0) e22) 1e-6) (equal e11 (mapcar '* '(-1.0 -1.0 -1.0) e23) 1e-6)
  233.               (equal e12 e21 1e-6) (equal e12 e22 1e-6) (equal e12 e23 1e-6)
  234.               (equal e12 (mapcar '* '(-1.0 -1.0 -1.0) e21) 1e-6) (equal e12 (mapcar '* '(-1.0 -1.0 -1.0) e22) 1e-6) (equal e12 (mapcar '* '(-1.0 -1.0 -1.0) e23) 1e-6)
  235.               (equal e13 e21 1e-6) (equal e13 e22 1e-6) (equal e13 e23 1e-6)
  236.               (equal e13 (mapcar '* '(-1.0 -1.0 -1.0) e21) 1e-6) (equal e13 (mapcar '* '(-1.0 -1.0 -1.0) e22) 1e-6) (equal e13 (mapcar '* '(-1.0 -1.0 -1.0) e23) 1e-6)
  237.           )
  238.         (progn
  239.           (setq c1 (mapcar '(lambda ( x ) (* x r)) (unit (mapcar '- o1 osph))))
  240.           (setq c2 (mapcar '(lambda ( x ) (* x r)) (unit (mapcar '- o2 osph))))
  241.           (setq oo1 (mapcar '+ c1 osph) oo2 (mapcar '+ c2 osph))
  242.           (entmake (list '(0 . "LINE") (cons 10 oo1) (cons 11 oo2)))
  243.         )
  244.       )
  245.     )
  246.   )
  247.  
  248.   (command "_.-overkill" (ssget "_X" '((0 . "LINE") (8 . "SPHERE-Voronoi"))) "" "")
  249.  
  250.   (setvar 'osmode osm)
  251.  
  252.   (princ)
  253. )
  254.  

THIS IS FINAL LINE VERSION
« Last Edit: August 26, 2013, 12:23:50 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: ==={Challenge}=== Voronoi sphere
« Reply #2 on: August 14, 2013, 01:48:13 PM »
I've found mistake, now could this be done with arcs...

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

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3279
  • Marko Ribar, architect
Re: ==={Challenge}=== Voronoi sphere
« Reply #3 on: August 15, 2013, 01:23:35 AM »
I've given up from (entmake)-ing arcs... But I did it with (command)... Not much slower, as a matter a fact fast like it should be with entmake...

[EDIT]: I've succeed to do it with (entmake) - updating code... Now posted is final one that's fastest...

One more thing - had to use (command "_.-overkill" ...) in both mine versions LINES & ARCS - it makes duplicate entities...

So here is my final code :

Code - Auto/Visual Lisp: [Select]
  1. (defun c:voronoi-sphere ( / unit mxv v^v transptucs transptwcs _reml AssocOn mid otr checkpts unique _vl-remove erasedup3df marc
  2.                             osm c1 c2 p1 p2 p3 e1 e2 e3 e11 e12 e13 e21 e22 e23 pt1l pt2l ss s i n pt ptlst nor x tr oo ol oel osph o1l r o1 o2 oo1 oo2 tmp uz ux uy pux a1 a2 ce )
  3.  
  4.                            
  5.   (setq osm (getvar 'osmode))
  6.   (setvar 'osmode 0)
  7.   (or (tblsearch "LAYER" "SPHERE-TIN")
  8.       (entmake
  9.         (list
  10.             '(0 . "LAYER")
  11.             '(100 . "AcDbSymbolTableRecord")
  12.             '(100 . "AcDbLayerTableRecord")
  13.             '(2 . "SPHERE-TIN")
  14.             '(70 . 0)
  15.             '(62 . 8)
  16.             '(6 . "Continuous")
  17.             '(290 . 1)
  18.             '(370 . -3)
  19.         )
  20.       )
  21.   )
  22.  
  23.   (setvar "CLAYER" "SPHERE-TIN")
  24.  
  25.   (defun unit ( v )
  26.     (mapcar '(lambda ( x ) (/ x (distance '(0.0 0.0 0.0) v))) v)
  27.   )
  28.  
  29.   (defun mxv ( m v )
  30.     (mapcar '(lambda ( r ) (apply '+ (mapcar '* r v))) m)
  31.   )
  32.  
  33.   (defun v^v ( u v )
  34.     (mapcar '(lambda ( n ) (- (* (nth (car n) u) (nth (cadr n) v)) (* (nth (cadr n) u) (nth (car n) v)))) '((1 2) (2 0) (0 1)))
  35.   )
  36.  
  37.   (defun transptucs ( pt p1 p2 p3 / ux uy uz )
  38.     (setq uz (unit (v^v (mapcar '- p2 p1) (mapcar '- p3 p1))))
  39.     (setq ux (unit (mapcar '- p2 p1)))
  40.     (setq uy (unit (mapcar '- p3 p1)))
  41.    
  42.     (mxv (list ux uy uz) (mapcar '- pt p1))
  43.   )
  44.  
  45.   (defun transptwcs ( pt pt1 pt2 pt3 / pt1n pt2n pt3n )
  46.     (setq pt1n (transptucs '(0.0 0.0 0.0) pt1 pt2 pt3))
  47.     (setq pt2n (transptucs '(1.0 0.0 0.0) pt1 pt2 pt3))
  48.     (setq pt3n (transptucs '(0.0 1.0 0.0) pt1 pt2 pt3))
  49.     (transptucs pt pt1n pt2n pt3n)
  50.   )
  51.  
  52.   (defun _reml (l1 l2 / a n ls)
  53.     (while
  54.       (setq n nil
  55.             a (car l2)
  56.       )
  57.       (while (and l1 (null n))
  58.         (if (equal a (car l1) 1e-8)
  59.           (setq l1 (cdr l1)
  60.                 n t
  61.           )
  62.           (setq ls (append ls (list (car l1)))
  63.                 l1 (cdr l1)
  64.           )
  65.         )
  66.       )
  67.       (setq l2 (cdr l2))
  68.     )
  69.     (append ls l1)
  70.   )
  71.  
  72.   (defun AssocOn ( SearchTerm Lst func fuzz )
  73.     (car
  74.       (vl-member-if
  75.         (function
  76.           (lambda (pair) (equal SearchTerm (apply func (list pair)) fuzz))
  77.         )
  78.         lst
  79.       )
  80.     )
  81.   )
  82.  
  83.   (defun mid ( p1 p2 )
  84.     (mapcar '(lambda (a b) (/ (+ a b) 2.0)) p1 p2)
  85.   )
  86.  
  87.   (defun otr ( tr / p1 p2 p3 p12 p23 p31 z o )
  88.     (setq p1 (car tr)
  89.           p2 (cadr tr)
  90.           p3 (caddr tr)
  91.     )
  92.     (setq z (v^v (mapcar '- p3 p1) (mapcar '- p2 p1)))
  93.     (setq p12 (mid p1 p2)
  94.           p23 (mid p2 p3)
  95.           p31 (mid p3 p1)
  96.     )
  97.     (setq o (inters p12 (mapcar '+ p12 (v^v (mapcar '- p2 p1) z)) p23 (mapcar '+ p23 (v^v (mapcar '- p3 p2) z)) nil))
  98.     o
  99.   )
  100.  
  101.   (defun checkpts ( ptlst pt1 x nor / y )
  102.     (if (and (setq oneside (if (< (length signs) 2) T (if (eq (car signs) (cadr signs)) T nil))) ptlst)
  103.       (cond ((> (setq y (cadr (transptucs (car ptlst) pt1 (mapcar '+ pt1 x) (mapcar '+ pt1 nor)))) 1e-8)
  104.              (setq signs (cons T signs))
  105.              (checkpts (cdr ptlst) pt1 x nor)
  106.             )
  107.             ((< y -1e-8)
  108.              (setq signs (cons nil signs))
  109.              (checkpts (cdr ptlst) pt1 x nor)
  110.             )
  111.             ((equal y 0.0 1e-10)
  112.              (if signs (setq signs (cons (car signs) signs)))
  113.              (checkpts (cdr ptlst) pt1 x nor)
  114.             )
  115.       )
  116.       oneside
  117.     )
  118.   )
  119.  
  120.   (defun unique ( lst )
  121.     (if lst (cons (car lst) (unique (_vl-remove (car lst) (_vl-remove (list (caar lst) (caddar lst) (cadar lst)) (_vl-remove (list (cadar lst) (caar lst) (caddar lst)) (_vl-remove (list (cadar lst) (caddar lst) (caar lst)) (_vl-remove (list (caddar lst) (caar lst) (cadar lst)) (_vl-remove (list (caddar lst) (cadar lst) (caar lst)) (cdr lst) 1e-6) 1e-6) 1e-6) 1e-6) 1e-6) 1e-6))))
  122.   )
  123.  
  124.   (defun _vl-remove ( el lst fuzz )
  125.     (vl-remove-if '(lambda ( x ) (and (equal (car x) (car el) fuzz) (equal (cadr x) (cadr el) fuzz) (equal (caddr x) (caddr el) fuzz))) lst)
  126.   )
  127.  
  128.   (defun erasedup3df ( ss / n 3df p1 p2 p3 p4 lay 3dfpts 3dflst )
  129.     (repeat (setq n (sslength ss))
  130.       (setq 3df (ssname ss (setq n (1- n))))
  131.       (setq p1 (cdr (assoc 10 (entget 3df)))
  132.             p2 (cdr (assoc 11 (entget 3df)))
  133.             p3 (cdr (assoc 12 (entget 3df)))
  134.             p4 (cdr (assoc 13 (entget 3df)))
  135.             lay (cdr (assoc 8 (entget 3df)))
  136.       )
  137.       (cond ((equal p1 p2 1e-8) (setq 3dfpts (list p1 p3 p4)))
  138.             ((equal p2 p3 1e-8) (setq 3dfpts (list p1 p2 p4)))
  139.             ((equal p3 p4 1e-8) (setq 3dfpts (list p1 p2 p3)))
  140.             ((equal p1 p4 1e-8) (setq 3dfpts (list p2 p3 p4)))
  141.       )
  142.       (setq 3dflst (cons 3dfpts 3dflst))
  143.       (entdel 3df)
  144.     )
  145.     (foreach 3dfpts (unique 3dflst)
  146.       (entmake (list '(0 . "3DFACE") (cons 8 lay) (cons 10 (car 3dfpts)) (cons 11 (car 3dfpts)) (cons 12 (cadr 3dfpts)) (cons 13 (caddr 3dfpts))))
  147.     )
  148.     (princ)
  149.   )
  150.  
  151.   (defun marc ( c p1 p2 / dxf10 dxf40 dxf210 dxf50 dxf51 uz )
  152.     (setq dxf10 (trans c 0 (setq uz (v^v (mapcar '- p1 c) (mapcar '- p2 c)))))
  153.     (setq dxf40 (distance c p1))
  154.     (setq dxf210 (unit uz))
  155.     (setq dxf50 (angle dxf10 (trans p1 0 uz)))
  156.     (setq dxf51 (angle dxf10 (trans p2 0 uz)))
  157.     (entmake (list '(0 . "ARC") '(100 . "AcDbEntity") '(100 . "AcDbCircle") (cons 10 dxf10) (cons 40 dxf40) (cons 210 dxf210) '(100 . "AcDbArc") (cons 50 dxf50) (cons 51 dxf51)))
  158.   )
  159.  
  160.   (setq ss (ssget "_:L" '((0 . "POINT"))))
  161.   (repeat (setq n (sslength ss))
  162.     (setq pt (cdr (assoc 10 (entget (ssname ss (setq n (1- n)))))))
  163.     (setq ptlst (cons pt ptlst))
  164.   )
  165.   (foreach pt1 ptlst
  166.     (setq pt1l (cons pt1 pt1l))
  167.     (foreach pt2 (_reml ptlst pt1l)
  168.       (setq pt2l (cons pt2 pt2l))
  169.       (foreach pt3 (_reml (_reml ptlst pt1l) pt2l)
  170.         (setq nor (v^v (setq x (mapcar '- pt3 pt1)) (mapcar '- pt2 pt1)))
  171.         (if (not (equal nor '(0.0 0.0 0.0) 1e-8))
  172.           (if (checkpts (vl-remove pt1 (vl-remove pt2 (vl-remove pt3 ptlst))) pt1 x nor)
  173.             (progn
  174.               (entmake (list '(0 . "3DFACE") (cons 10 pt1) (cons 11 pt1) (cons 12 pt2) (cons 13 pt3)))
  175.             )
  176.           )
  177.         )
  178.         (setq signs nil oneside nil)
  179.       )
  180.     )
  181.   )
  182.  
  183.   (setq osph (inters
  184.                (setq oo (otr (list (car ptlst) (cadr ptlst) (caddr ptlst))))
  185.                (mapcar '+ oo (v^v (mapcar '- (caddr ptlst) (car ptlst)) (mapcar '- (cadr ptlst) (car ptlst))))
  186.                (setq oo (otr (list (car ptlst) (cadr ptlst) (cadddr ptlst))))
  187.                (mapcar '+ oo (v^v (mapcar '- (cadddr ptlst) (car ptlst)) (mapcar '- (cadr ptlst) (car ptlst))))
  188.                nil
  189.              )
  190.         oo nil
  191.   )
  192.   (setq r (distance osph (car ptlst)))
  193.  
  194.   (setq s (ssget "_X" '((0 . "3DFACE") (8 . "SPHERE-TIN"))))
  195.   (erasedup3df s)
  196.  
  197.   (setq s (ssget "_X" '((0 . "3DFACE") (8 . "SPHERE-TIN"))))
  198.   (setq i -1)
  199.   (while (setq 3df (ssname s (setq i (1+ i))))
  200.     (setq p1 (cdr (assoc 11 (entget 3df)))
  201.           p2 (cdr (assoc 12 (entget 3df)))
  202.           p3 (cdr (assoc 13 (entget 3df)))
  203.     )
  204.     (if (minusp (- (* (car (mapcar '- p1 osph)) (cadr (mapcar '- p2 osph))) (* (cadr (mapcar '- p1 osph)) (car (mapcar '- p2 osph))))) (marc osph p2 p1) (marc osph p1 p2))
  205.     (if (minusp (- (* (car (mapcar '- p2 osph)) (cadr (mapcar '- p3 osph))) (* (cadr (mapcar '- p2 osph)) (car (mapcar '- p3 osph))))) (marc osph p3 p2) (marc osph p2 p3))
  206.     (if (minusp (- (* (car (mapcar '- p3 osph)) (cadr (mapcar '- p1 osph))) (* (cadr (mapcar '- p3 osph)) (car (mapcar '- p1 osph))))) (marc osph p1 p3) (marc osph p3 p1))
  207.     (setq tr (list p1 p2 p3))
  208.     (setq ol (cons (setq oo (otr tr)) ol))
  209.     (setq e1 (mapcar '- p2 p1) e2 (mapcar '- p3 p1) e3 (mapcar '- p3 p2))
  210.     (setq oel (cons (list oo (list e1 e2 e3)) oel))
  211.   )
  212.  
  213.   (or (tblsearch "LAYER" "SPHERE-Voronoi")
  214.       (entmake
  215.         (list
  216.             '(0 . "LAYER")
  217.             '(100 . "AcDbSymbolTableRecord")
  218.             '(100 . "AcDbLayerTableRecord")
  219.             '(2 . "SPHERE-Voronoi")
  220.             '(70 . 0)
  221.             '(62 . 10)
  222.             '(6 . "Continuous")
  223.             '(290 . 1)
  224.             '(370 . -3)
  225.         )
  226.       )
  227.   )
  228.  
  229.   (setvar "CLAYER" "SPHERE-Voronoi")
  230.  
  231.   (foreach o1 ol
  232.     (setq o1l (cons o1 o1l))
  233.     (setq e11 (caadr (assocon o1 oel 'car 1e-6))
  234.           e12 (cadadr (assocon o1 oel 'car 1e-6))
  235.           e13 (caddr (cadr (assocon o1 oel 'car 1e-6)))
  236.     )
  237.     (foreach o2 (_reml ol o1l)
  238.       (setq e21 (caadr (assocon o2 oel 'car 1e-6))
  239.             e22 (cadadr (assocon o2 oel 'car 1e-6))
  240.             e23 (caddr (cadr (assocon o2 oel 'car 1e-6)))
  241.       )
  242.       (if (or
  243.               (equal e11 e21 1e-6) (equal e11 e22 1e-6) (equal e11 e23 1e-6)
  244.               (equal e11 (mapcar '* '(-1.0 -1.0 -1.0) e21) 1e-6) (equal e11 (mapcar '* '(-1.0 -1.0 -1.0) e22) 1e-6) (equal e11 (mapcar '* '(-1.0 -1.0 -1.0) e23) 1e-6)
  245.               (equal e12 e21 1e-6) (equal e12 e22 1e-6) (equal e12 e23 1e-6)
  246.               (equal e12 (mapcar '* '(-1.0 -1.0 -1.0) e21) 1e-6) (equal e12 (mapcar '* '(-1.0 -1.0 -1.0) e22) 1e-6) (equal e12 (mapcar '* '(-1.0 -1.0 -1.0) e23) 1e-6)
  247.               (equal e13 e21 1e-6) (equal e13 e22 1e-6) (equal e13 e23 1e-6)
  248.               (equal e13 (mapcar '* '(-1.0 -1.0 -1.0) e21) 1e-6) (equal e13 (mapcar '* '(-1.0 -1.0 -1.0) e22) 1e-6) (equal e13 (mapcar '* '(-1.0 -1.0 -1.0) e23) 1e-6)
  249.           )
  250.         (progn
  251.           (setq c1 (mapcar '(lambda ( x ) (* x r)) (unit (mapcar '- o1 osph))))
  252.           (setq c2 (mapcar '(lambda ( x ) (* x r)) (unit (mapcar '- o2 osph))))
  253.           (setq oo1 (mapcar '+ c1 osph) oo2 (mapcar '+ c2 osph))
  254.           (if (minusp (- (* (car c1) (cadr c2)) (* (cadr c1) (car c2)))) (setq tmp oo1 oo1 oo2 oo2 tmp))
  255.           (marc osph oo1 oo2)
  256.         )
  257.       )
  258.     )
  259.   )
  260.  
  261.   (command "_.-overkill" (ssget "_X" '((0 . "ARC") (8 . "SPHERE-Voronoi,SPHERE-TIN"))) "" "")
  262.  
  263.   (setvar 'osmode osm)
  264.  
  265.   (princ)
  266. )
  267.  

THIS IS FINAL ARC VERSION
« Last Edit: August 25, 2013, 05:13:02 PM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube