Dividere parte di una curva

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?

Mi estrapolo parte della curva (tramite crv closest point) e sulla parte ottenuta applico il divide crv.

ciao Lucio

non è tanto il fatti di come dividere la curva

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)

Vuoi splittare la curva in N curve o vuoi disegnare N+1 punti ?

EDIT

Credo di capire che ti interessa disegnare i punti.

In questo caso per cambiare N potresti usare uno script e selezionare curva e punti.
Nello script conti i punti e setti il nuovo N di conseguenza.

Se non vuoi selezionare i punti …
Selezioni la curva, poi lo script cerca tutti i punti visibili e sceglie quelli che giacciono sulla curva.

… Ammesso che non ci siano “altri” punti che non c’entrano disegnati sulla curva…

ciao Emilio,

si ineffetti l’intento è proprio questo

come potrei ottenere una cosa del genere? con quali comandi o metodi?

ps sulla curva i punti esistenti sono solo quelli che mi interessano

Ciao Salvio

Io proverei con questi:

rs.NormalObjects()
rs.IsPoint()
rs.PointCoordinates()
rs.CurveClosestPoint()
rs.EvaluateCurve()
rs.Distance()

… 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 … :confused:
… Cerco di utilizzare quel poco che credo di capire.

Ciao.

ciao Emilio grazie per i suggerimenti

ovviamente anch’io non sono stato a girarmi i pollici

Dim pts
pts = Rhino.ObjectsByType(1, True)

Dim pnt
For Each pnt In Rhino.GetPointCoordinates(, True)
	Rhino.Print Rhino.Pt2Str(pnt)
Next

credo che per i primi tre comandi si dovrebbe avere lo stesso risultato giusto?

ps EvaluateCurve e Distance per quale scopo usare questi due metodi?

Credo che ObjectsByType faccia da solo quello per cui io avevo pensato ai primi due metodi.
Bene ! :slight_smile:

GetPointCoordinates serve se clicchi i punti a mano …:confused:
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 :slight_smile:

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 :+1:

adesso provo
ps una cosa soltanto come mai convertivi i punti con EvaluateCurve?

Ah si’.
Non avevo considerato il True.

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().

ok funziona :+1:

TKS

…e il bello è che in GH c’è…
non ti preoccupare siamo in due a non capire. Io su tutti i fronti. :grin:

Ciao Giuspa

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. :slight_smile:

Mi sa che siamo piu’ di due … e purtroppo non solo in ambito CAD. :wink:

com’è possibile?

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 :thinking::thinking:

ps come ci sono i misteri della fede, ci sono anche i misteri di rhino :smiley:

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.

Ciao

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).

Prova ad eseguire questo script …

dim a,b
a=1.2354*3
b=1.2354/(1/3)
msgbox a-b

Sergio

quindi quando mi ritorna 0 non è stato preciso

eeee è proprio quello che succede

ma non si risolve settando qualche impostazione di tolleranza etc?

… Salvio …

If abs (…) < tol then

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

caio Sergio, ho provato come mi hai suggerito ma il risultato è sempre lo stesso

1.98602732259782E-15
1.8310267194089E-15
1.77635683940025E-15

ho provato molte volte ma i valori non sono negativi

Condividi il codice o parte …