HOME OGGETTI 3D LIBRI CORSI TUTORIAL FORUM SHOP CONTATTI   LOGIN









Autore Topic: Risoluzione arco  (Letto 1989 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

marcomasetti

  • Newbie
    ...sono qui da poco, il mio miglior amico è il pulsante RICERCA
  • *
  • Post: 183
Risoluzione arco
« il: 18 Febbraio 2013, 22:52 »
 Il comando
 resol n
definisce in 3D il numero di facce n  del poligono che simula la circonferenza.
Costruendo un arco di ampiezza be tramite i valori di stato, ad esempio con EXTRUDE,la suddivisione  dell’arco risulterà proporzionale al valore dell’arco stesso.
Volendo costruire analiticamente un arco, si incontrano due difficoltà:
1)   La divisione dell’arco, volendo applicare gli stessi intervalli di suddivisione del cerchio intero, non potrà generalmente essere effettuata in parti tutte uguali, dato che rimarrà un resto.
2)   La suddivisione in parti non comincerà generalmente dal punto iniziale dell’arco stesso, corrispondente al raggio inclinato su x di be.
Risulta:
an=360/n
Il valore:
CEIL (be/an)    !intero approssimato per difetto di be/an
fornisce il numero di parti intere di ampiezza an in cui può essere suddiviso l’angolo be.
Il resto è dato da:
rbe=be- CEIL (be/an)*an
Il valore   rbe=0  se  be è multiplo di an.
Lo stesso ragionamento si applica all’angolo al:
CEIL (al/an)=intero approssimato per difetto di al/an
ral=al- CEIL (al/an)*an= resto di al suddiviso in CEIL (al/an) parti.
Il primo nodo sull’angolo be viene allora a trovarsi in corrispondenza dell’angolo:
(CEIL (al/an)+1)*an
Questo valore diventa an se l’angolo al era multiplo di an.
Pertanto le suddivisioni di be in an parti dovranno corrispondere a CEIL (be/an)
In conclusione i nodi relativi all’angolo be sono dati da:
x0=
y0=  !centro arco
r=     !raggio arco
al=    !angolo inizio su x+
be=   !ampiezza arco
n=     !risoluzione su 360°
an=360/n
put  x0+r*cos(al), y0+r*sin(al)
FOR i=0   to   CEIL (be/an)-1
put  x0+r*cos( CEIL(al/an)*an+an*i ), y0+r*sin( CEIL(al/an)*an+an*i )
next i
bt= abs(sgn(CEIL(al/an)*an+an*(CEIL (be/an)-1)-be-al))     
if  bt=1 then put  x0+r*cos(al+be), y0+r*sin(al+be)
!punti totali arco= CEIL (be/an)+2 con bt=1, altrimenti: CEIL (be/an)+1
Nota: se l’ultimo punto ha valore angolare be+al non deve essere ripetuto, per questo è stato inserito il comando if che esclude l’evenienza.
L’ultimo punto del loop ha valore angolare:
CEIL(al/an)*an+an*(CEIL (be/an)-1)
La sua differenza con il valore be+al è stata inserita entro abs(sgn( )) per trasformarla in bit.

In realtà il programma, ad esempio nel comando 3D:
ARC raggio, alfa, beta
usa un metodo meno sofisticato, non tenendo conto del valore di inizio dell’arco al,
questo significa che un oggetto costruito con CIRCLE avrà in generale i nodi che, in generale, non andranno a sovrapporsi a quelli generati da ARC con il medesimo raggio.
Dalla verifica è risultato che, salvo per valori bassi, si sovrappongono esattamente i nodi su
ARC ra, al, al+be
con i punti generati dallo script:
nm=INT(be/an)   !eventualmente va aggiunto 1
FOR i=0   to  nm
put  x0+r*cos( al+be/nm*i ), y0+r*sin( al+be/nm*i )
next i
!punti totali arco=nm+1

Ovvero il comando ARC suddivide l’arco in parti uguali, la cui ampiezza non può essere in generale uguale a quella ottenuta con la suddivisione del cerchio intero, anche se vi si approssima.