TuttoCAD Forum

TuttoCAD Forum
[ Home | Registrati | Discussioni Attive | Discussioni Recenti | Segnalibro | Msg privati | Sondaggi Attivi | Utenti | Album Fotografico | Download | | Cerca | FAQ ]
Nome Utente:
Password:
Salva Password
Password Dimenticata?

 Tutti i Forum
 1 - TuttoCAD Software
 AutoLISP
 vlax-curve-flessi
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
I seguenti utenti stanno leggendo questo Forum Qui c'è:
Autore Discussione Precedente Discussione Discussione Successiva  

joseph
Utente Master



Regione: Lombardia
Prov.: Cremona
Città: Casalmaggiore


1884 Messaggi

Inserito il - 06 dicembre 2011 : 17:19:32  Mostra Profilo Invia a joseph un Messaggio Privato  Rispondi Quotando
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




Modificato da - joseph in Data 06 dicembre 2011 17:26:29

GP
Utente Master


Regione: Piemonte
Prov.: Vercelli


2776 Messaggi

Inserito il - 06 dicembre 2011 : 19:24:09  Mostra Profilo Invia a GP un Messaggio Privato  Rispondi Quotando
Spiegato da "vero" docente.
Torna all'inizio della Pagina
  Discussione Precedente Discussione Discussione Successiva  
 Nuova Discussione  Rispondi
 Versione Stampabile Bookmark this Topic Aggiungi Segnalibro
Vai a:
TuttoCAD Forum © 2001-2010 CADLandia Torna all'inizio della Pagina
Pagina generata in 0,42 secondi.