buon sabato a tutti,
dubbio su quale strada percorrere:
mi servirebbe poter dividere parte del dominio di una retta
per un n di sezioni ora non sapendo a priori di preciso
per quante sezioni, vorrei realizzare uno script dove
cliccando sulla retta mi faccia cambiare il n di sezioni
qualcuno ha qualche idea in merito su come si potrebbe gestire bene la cosa?
questo dopo aver ottenuto giĂ la prima divisione spero sia piĂą chiaro adesso
mi rompo ogni volta seleziono i punti li cancello ripeto la divisione
e questo più e più volte su più curve è uno strazio
quindi un tratto di curva è divisa per 4 con il comando per quel tratto cancella i punti e divide per 5
(credo che il nocciolo sia dove e come memorizzare tali informazioni)
… Anche se non capisco perche’ non ci sia un metodo rs.PointCurveDistance() …
( Almeno, io non lo trovo )
Ma in effetti non capisco tante cose di Rhino …
… Cerco di utilizzare quel poco che credo di capire.
Credo che ObjectsByType faccia da solo quello per cui io avevo pensato ai primi due metodi.
Bene !
GetPointCoordinates serve se clicchi i punti a mano …
Allora ObjectsByType non serve piu’ … e nemmeno tutto il resto.
Se clicchi i punti a mano, lo script ricava subito il numero dei vecchi punti e puo’ aggiornare N
Nel caso in cui tu non clicchi nessun punto, ma lasci fare tutto allo script, ad esempio con
ObjectsByType, servono per calcolare la distanza del punto dalla curva e quindi capire se il punto e’ sulla curva o meno.
Emilio e che facciamo vogliamo automatizzare il processo e poi ci mettiamo a cliccare a mano
i codici li provo sempre prima, in questo caso non clicco i punti a mano
Rhino.GetPointCoordinates(, True) ho messo True come opzione
credo che funge da click su tutti i punti selezionati con Rhino.ObjectsByType(1, True)
(ma pensadoci bene forse PointCoordinates(pts) ci sta meglio così non li seleziono nemmeno)
quindi se il punto vicino alla curva è simile al punto selezionato il punto è sopra la curva giusto
adesso provo
ps una cosa soltanto come mai convertivi i punti con EvaluateCurve?
Infatti. e Distance() serve per vedere se e’ vicino.
Perche’ CurveClosestPoint() ti da’ il valore del parametro.
Con EvaluateCurve() e il parametro, ottieni la posizione del punto …
… Che serve quando usi Distance().
Si’, capita a volte che in GH ci siano cose che Rhino non considera …
Penso sia un pregio di GH il fatto di essere abbastanza indipendente da Rhino, come impostazione.
Mi sa che siamo piu’ di due … e purtroppo non solo in ambito CAD.
Dim crv
crv = Rhino.GetObject()
Dim pnt
For Each pnt In Rhino.ObjectsByType(1)
Rhino.Print Rhino.Distance(Rhino.PointCoordinates(pnt), Rhino.EvaluateCurve(crv, Rhino.CurveClosestPoint(crv, Rhino.PointCoordinates(pnt))))
Next
il codice realizzato l’altro giorno che funzionava bene adesso non funziona più…
in pratica se la distanza è 0 mi dovrebbe selezionare il punto provando adesso in pratica mettendo un print ho notato che anche se i punti sono sulla curva la distanza non è 0 anzi alcuni mi riporta distanza come
“8.88178419700125E-16” è questo capita sia se inserisco io i punti sulla curva ma anche se uso dividi.
come mai questa cosa? mica è cambiato qualcosa nei settaggi?
mah cambiando l’inclinazione della retta cambiano i i valori della distanza
ps come ci sono i misteri della fede, ci sono anche i misteri di rhino
Ci sono due fattori.
Uno: su Rhino setti un certo valore di tolleranza, e lui puo’ accontantarsi di quella precisione.
Due: La precisione che ottieni usando i numeri floating point a 64 bit, qualunque programma tu stia usando, e’ limitata ( a circa 15 o 16 cifre significative ).
In casi particolari puoi ottenere zero, ma generalmente ottieni un valore molto piccolo.
Se ottieni quei valori per la distanza, direi che Rhino non si risparmia e fa quello che puo’, ma oltre la precisione dei floating point non puo’ andare.
Se parliamo di numeri decimali, col computer i valori approssimati sono la regola.
Quelli esatti l’eccezione.
Confrontando due numeri decimali, non si verifica mai se sono uguali, ma se la loro differenza e’ abbastanza piccola.
nessun mistero. In tutti i linguaggi di programmazione nelle operazioni similari
a quelle che riporti lo zero si valuta sempre con riferimento ad una tolleranza
(e valore assoluto de risultato).
Non mi sembra una delle sette fatiche di Ercole!
Pure quando fai il prodotto vettoriale tra due versori (vettori a norma unitaria) devi comunque normalizzare il vettore risultante nonostante il valore dovrebbe essere un versore.
Come in molti esempi in c++ dell’sdk, sono certo che tutto il codice di rhino sia tappezzato di qst controlli. Conosci il problema e lo previeni …
Al piĂą puoi definirti delle funzioni.
Ciao