# Dividere parte di una curva

**URL:** <https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384>\
**Category:** Scripting e Programmazione\
**Created:** [13 Aprile 2019, 10:24am UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384 "2019-04-13T10:24:12Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [13 Aprile 2019, 10:24am UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/1 "2019-04-13T10:24:12Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![lucio\_zadra](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/lucio_zadra/32/16361_2.png) [@lucio\_zadra](https://it.discourse.mcneel.com/u/lucio_zadra)\
**Post date:** [13 Aprile 2019, 11:50am UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/2 "2019-04-13T11:50:45Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [13 Aprile 2019, 12:13pm UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/3 "2019-04-13T12:13:19Z")

</div>

ciao Lucio

non è tanto il fatti di come dividere la curva

> [@0904](#):
>
> vorrei realizzare uno script dove  
> cliccando sulla retta mi faccia cambiare il n di sezioni

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)

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [13 Aprile 2019, 5:11pm UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/4 "2019-04-13T17:11:23Z")

</div>

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…

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [14 Aprile 2019, 12:37am UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/5 "2019-04-14T00:37:00Z")

</div>

ciao Emilio,

> [@emilio](#):
>
> Credo di capire che ti interessa disegnare i punti.

si ineffetti l’intento è proprio questo

> [@emilio](#):
>
> Selezioni la curva, poi lo script cerca tutti i punti visibili e sceglie quelli che giacciono sulla curva.

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

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

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [14 Aprile 2019, 9:16am UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/6 "2019-04-14T09:16:58Z")

</div>

Ciao Salvio

> [@0904](#):
>
> come potrei ottenere una cosa del genere? con quali comandi o metodi?

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

Ciao.

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [14 Aprile 2019, 2:51pm UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/7 "2019-04-14T14:51:15Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [14 Aprile 2019, 3:03pm UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/8 "2019-04-14T15:03:33Z")

</div>

> [@0904](#):
>
> credo che per i primi tre comandi si dovrebbe avere lo stesso risultato giusto?

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

> [@0904](#):
>
> ps EvaluateCurve e Distance per quale scopo usare questi due metodi?

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.

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [14 Aprile 2019, 3:23pm UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/9 "2019-04-14T15:23:35Z")

</div>

Emilio e che facciamo vogliamo automatizzare il processo e poi ci mettiamo a cliccare a mano 🙂

> [@emilio](#):
>
> GetPointCoordinates serve se clicchi i punti 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)

> [@emilio](#):
>
> servono per calcolare la distanza del punto dalla curva

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?

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [14 Aprile 2019, 3:35pm UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/10 "2019-04-14T15:35:40Z")

</div>

> [@0904](#):
>
> Rhino.GetPointCoordinates(, True) ho messo True come opzione  
> credo che funge da click su tutti i punti selezionati con Rhino.ObjectsByType(1, True)

Ah si’.  
Non avevo considerato il True.

> [@0904](#):
>
> quindi se il punto vicino alla curva è simile al punto selezionato il punto è sopra la curva giusto

Infatti. e Distance() serve per vedere se e’ vicino.

> [@0904](#):
>
> come mai convertivi i punti con EvaluateCurve?

Perche’ CurveClosestPoint() ti da’ il valore del parametro.  
Con EvaluateCurve() e il parametro, ottieni la posizione del punto …  
… Che serve quando usi Distance().

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [14 Aprile 2019, 4:10pm UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/11 "2019-04-14T16:10:27Z")

</div>

ok funziona 👍

TKS

---

<div class="post-metadata">

**Author:** ![giuseppe](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/giuseppe/32/16416_2.png) [@giuseppe](https://it.discourse.mcneel.com/u/giuseppe)\
**Post date:** [16 Aprile 2019, 7:58am UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/12 "2019-04-16T07:58:23Z")

</div>

> [@emilio](#):
>
> … 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.

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

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [16 Aprile 2019, 8:59am UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/13 "2019-04-16T08:59:11Z")

</div>

Ciao Giuspa

> [@giuseppe](#):
>
> …e il bello è che in GH c’è…

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

> [@giuseppe](#):
>
> siamo in due a non capire. Io su tutti i fronti

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

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [17 Aprile 2019, 1:54pm UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/14 "2019-04-17T13:54:50Z")

</div>

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 🤔🤔

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

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [18 Aprile 2019, 5:42am UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/15 "2019-04-18T05:42:05Z")

</div>

> [@0904](#):
>
> 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.

---

<div class="post-metadata">

**Author:** ![Sergio\_Alessi](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/sergio_alessi/32/22676_2.png) [@Sergio\_Alessi](https://it.discourse.mcneel.com/u/Sergio_Alessi)\
**Post date:** [18 Aprile 2019, 6:23am UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/16 "2019-04-18T06:23:55Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [18 Aprile 2019, 5:28pm UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/17 "2019-04-18T17:28:36Z")

</div>

> [@emilio](#):
>
> Quelli esatti l’eccezione.

quindi quando mi ritorna 0 non è stato preciso

> [@Sergio\_Alessi](#):
>
> Prova ad eseguire questo script …

eeee è proprio quello che succede

ma non si risolve settando qualche impostazione di tolleranza etc?

---

<div class="post-metadata">

**Author:** ![Sergio\_Alessi](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/sergio_alessi/32/22676_2.png) [@Sergio\_Alessi](https://it.discourse.mcneel.com/u/Sergio_Alessi)\
**Post date:** [18 Aprile 2019, 7:41pm UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/18 "2019-04-18T19:41:47Z")

</div>

… 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

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [18 Aprile 2019, 8:33pm UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/19 "2019-04-18T20:33:34Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Sergio\_Alessi](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/sergio_alessi/32/22676_2.png) [@Sergio\_Alessi](https://it.discourse.mcneel.com/u/Sergio_Alessi)\
**Post date:** [18 Aprile 2019, 10:25pm UTC](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384/20 "2019-04-18T22:25:53Z")

</div>

Condividi il codice o parte …

[Pagina seguente](https://it.discourse.mcneel.com/t/dividere-parte-di-una-curva/2384.md?page=2)
