V I S U A L I Z Z A D I S C U S S I O N E |
joseph |
Inserito il - 06 dicembre 2011 : 17:19:32 Approfondimento sull'uso delle funzioni applicate alle curve (vlax-curve-......) e sul significato del Parametro nei singoli oggetti in VisualLisp. (per il riscontro dei dati, vedi il disegno vlax-curve-flessi.dwg allegato)
Indichiamo con: (setq pt (getpoint)) ;punto generico sulla curva (setq Obj (vlax-ename->vla-object (car (entsel)))) ;entità da esaminare (setq drv1 (vlax-curve-getFirstDeriv obj param)) ;derivata prima (vettore tangente) (setq drv2 (vlax-curve-getSecondDeriv obj param)) ;derivata seconda (vettore diretto verso il centro di curvatura)
1 CASO. SEGMENTO (comando LINEA) A(0,250)-B(200,340) inclinato (A->param=0, B->param=1) (setq endParm (vlax-curve-getEndParam obj)) -> 219.317= lunghezza del segmento (setq pt (getpoint)) -> (147.313 316.291 0.0) -> punto qualsiasi sul segmento (setq ParmP (vlax-curve-getParamAtPoint obj pt)) -> 161.542 distanza dall'origine A (setq drv1 (vlax-curve-getFirstDeriv obj 1)) -> (200.0 90.0 0.0) -> vettore, dal punto (0 0 0) al punto (200 90 0) che, spostato sul punto A, ha la stessa pendenza e la stessa lunghezza dl segmento AB (setq drv2 (vlax-curve-getSecondDeriv obj 1)) -> non essendo una curva, la deriv.sec. è sempre nulla. 2 CASO. CERCHIO di centro C (1000,250) e raggio R=100 (setq endParm (vlax-curve-getEndParam obj)) -> 6.28319 (2*pi) il cerchio viene tracciato dal punto A (per gli archi di cerchio il parametro indica l'apertura in radianti) (setq Pt (vlax-curve-getPointAtParam obj (/ endParm 4))) -> si ottiene il punto B (si deduce quindi che i cerchi sono disegnati in senso antiorario) nel punto A: (setq drv1 (vlax-curve-getFirstDeriv obj (* 2 pi))) -> (0.0 100.0 0.0) vettore tang. al cerchio, di valore uguale al raggio R=100 (setq drv2 (vlax-curve-getSecondDeriv obj (* 2 pi))) -> (-100.0 0.0 0.0) vettore diretto verso il centro, di valore R=100 Nota: il comportamento di drv1 e drv2 è uguale per qualunque punto del cerchio.
3 CASO. ELLISSE di centro C1 (500,500) e semiassi C1-A(700,500), C1-B(500,620). (setq endParm (vlax-curve-getEndParam obj)) -> 6.28319 (come per il cerchio) (setq Pt (vlax-curve-getPointAtParam obj (/ endParm 4))) -> (500.0 620.0 0.0) si ottiene il punto B
nel punto A: (setq drv1 (vlax-curve-getFirstDeriv obj (* 2 pi))) -> (0.0 120.0 0.0) vettore vert. di valore =semiasse minore, tang. all'ellisse (setq drv2 (vlax-curve-getSecondDeriv obj (* 2 pi))) -> (-200.0 0.0 0.0) vettore di valore =semiasse maggiore, diretto verso il centro
nel punto B: (setq drv1 (vlax-curve-getFirstDeriv obj (/ pi 2))) -> (-200.0 7.34788e-015 0.0) vett. orizz. di valore = semiasse magg., tang. all'ellisse (setq drv2 (vlax-curve-getSecondDeriv obj (/ pi 2))) -> (0.0 -120.0 0.0) vettore di valore =semiasse minore, diretto verso il centro
in un punto Pt (qualsiasi) (setq pt (getpoint)) -> (660.983 571.207 0.0) (setq ParmP (vlax-curve-getParamAtPoint obj pt)) -> 0.635268 (setq drv1 (vlax-curve-getFirstDeriv obj ParmP)) -> (-118.679 96.5895 0.0) vett. tang. nel punto Pt (setq drv2 (vlax-curve-getSecondDeriv obj ParmP)) -> (-160.983 -71.2072 0.0) vettore diretto verso il centro, uguale al semiasse in quel punto (vale per qualsiasi punto)
4 CASO. SPLINE (setq pt (getpoint)) -> (560.644 116.797 0.0) -> punto Pt qualsiasi (setq ParmFin ((vlax-curve-getendParam obj))) -> lungh.tot.= 731.134 (setq ParmP (vlax-curve-getParamAtPoint obj pt)) -> lunghezza del tratto A-Pt = 367.68 (setq drv1 (vlax-curve-getFirstDeriv obj ParmP)) (1.00943 0.203028 0.0) (nel disegno moltiplicato per 100) vettore tangente, diretto verso valori crescenti da A a B. (setq drv2 (vlax-curve-getSecondDeriv obj ParmP)) (0.000563762 -0.00338551 0.0) (nel disegno moltiplicato per 10000) vettore diretto verso il centro di curvatura in quel punto
5 CASO. Polilinea a tratti misti (rettilinei e archi di cerchio) (setq Parm (vlax-curve-getEndParam obj)) -> 7.0 indica il numero tot. dei vertici iniziando da 0, per cui i vertici (in questo caso 8) corrispondono a valori interi del parametro. Di conseguenza il valore del parametro, p.es. a metà fra i vertici 2 e 3, vale 2.5. Per i valori, la direzione e il verso delle due derivate, prime e seconde, vale quanto detto per i segmenti e gli archi di cerchio.
;;;;;;;;;
Riassumendo, il valore del parametro assume significati diversi in base all'oggetto in esame: - segmento e spline -> distanza dall'origine (in particolare, la lunghezza totale) - cerchio, arco di cerchio ed ellisse -> ampiezza in radianti - polilinea -> se intero, il numero del vertice iniziando da 0, altrimenti una posizione intermedia fra i vertici
PUNTI DI FLESSO Nelle Polilinee, in presenza di tratti curvi, possono presentarsi punti particolari detti PUNTI DI FLESSO; in corrispondenza di essi il valore del parametro di curvatura (BULGE)(estraibile con il metodo GETBULGE) calcolato sul tratto precedente e sul tratto seguente, si inverte di segno; invece la tangente in quel punto ad entrambi i tratti di curva contigui è unica (vedi punti 4,5,6). Per individuare i punti di flesso occorre perciò cercare il vertice in cui il param. BULGE si inverte di segno; in quel punto il valore del vettore-tangente (calcolato con vlax-curve-getFirstDeriv) assume un valore massimo o minimo relativo; per il calcolo valgono sempre le regole precedenti. La derivata seconda (con vlax-curve-getSecondDeriv) restituisce invece un segmento (vettore), applicato nell'origine del WCS che, traslato sul punto di flesso, risulta perpendicolare alla curva; tuttavia in quel punto non esiste nessun centro di curvatura (detto in linguaggio semi-matematico, è come se il centro fosse posto all'infinito, e quindi in prossimità del punto la curva è assimilabile a un tratto di retta). ;;;;; ESEMPIO applicato a una polilinea. Restituisce una lista dei punti di flesso, di ognuno dei quali viene estratto: Valore del parametro coordinate del punto di flesso estremo del vettore-deriv. prima, rispetto all'origine WCS estremo del vettore-deriv. seconda, rispetto all'origine WCS ;;;;;;;;; (vl-load-com) (setq acadObj (vlax-get-acad-object)) (setq docObj (vla-get-activedocument acadObj)) (setq MSobj (vla-get-modelspace docObj)) (setq obj (vlax-ename->vla-object (car (entsel)))) (setq endParm (vlax-curve-getEndParam obj)) (setq parm 0 lst NIL lst-pt nil lst-der nil)
(repeat (fix endparm) ;;; (setq p11 (vlax-curve-getPointAtParam obj (1+ parm))) ;;; (setq lst-pt (cons p11 lst-pt)) ;;; (setq deriv11 (vlax-curve-getFirstDeriv obj (1+ parm))) ;;; (setq deriv22 (vlax-curve-getSecondDeriv obj (1+ parm))) ;;; (setq lst-der (CONS (list (1+ parm) p11 deriv11 deriv22) lst-der)) (if (minusp (* (vlax-invoke-method obj 'getbulge parm) (vlax-invoke-method obj 'getbulge (1+ parm)))) (progn (setq pf (vlax-curve-getPointAtParam obj (1+ parm))) (setq drv1f (vlax-curve-getFirstDeriv obj (1+ parm))) (setq drv2f (vlax-curve-getSecondDeriv obj (1+ parm))) (setq lst (CONS (list (1+ parm) pf drv1f derv2f) lst)) ) ) (setq parm (1+ parm)) ) (setq lst (reverse lst)) ;(setq lst-pt (reverse lst-pt)) ;(setq lst-der (reverse lst-der))
NOTA: Mancano i casi particolari in cui il punto di flesso ha la tangente orizzontale o verticale. ;;;;;;;
Per le Spline, che non possiedono la proprietà BULGE, occorre procedere per approssimazione: suddividere la curva in piccoli tratti calcolare di ogni punto la derivata prima calcolare i punti di massimo o minimo della derivata prima calcolare in quei punti il valore della derivata seconda
Scarica allegato:
vlax-curve-flessi.zip 38,66 KB
Immagine inserita:
75,82 KB
|
1 U L T I M E R I S P O S T E (in alto le più recenti) |
GP |
Inserito il - 06 dicembre 2011 : 19:24:09 Spiegato da "vero" docente.
|
|
|