Lunghezza curva

di sicuro sarà una sciocchezza . . . .

su una curva dopo averla selezionata clicco su due punti intermedi della stessa,
poi usando il metodo CurveLength per tre volte mi vado a calcolare la lunghezza prima:

da inizio della curva al primo punto cliccato
poi i due punti intermedi cliccati sulla curva
infine dal secondo punto alla fine della curva

come mai se verifico con il CurveLength l’intera lunghezza non corrisponde alla somma fatta prima?

ovviamente stiamo parlando di decimali talmente infinintesimali che non mi fanno la differenza
e forse quasi di sicuro si tratta di arrotondamenti di rhino anche se in sostanza non capisco come mai questa differenza essendo che sia tra le tre somme, che con la lunghezza totale la ricavo tramite script usando lo stesso metodo “CurveLength” quindi in teoria, mi dovrei trovare con la lunghezza identica?

edit: una cosa strana avevo notato già dall’inizio: in pratica avevo diviso la curva per lunghezza a 10mm
ma usando CurveLength da inizio curva al punto ricavato da dividi curva gli ultimi decimali non sono zeri?

Salvio, se non posti i numeri o non dici almeno quant’e’ l’errore, non si capisce niente …
… Almeno … io non ci capisco niente … :smile:

1 Mi Piace

Allego il file con esempio:
stessa curva in diverse proporzioni.
lunghezzacurva.3dm (67,9 KB)
Ovvio ci sia approssimazione.
Non vorrei delirare in questi ultimi giorni di ferie fatte a pezzi e bocconi…ma…
Hai diverse strade:

  • approssimare usando una spezzata fittissima
  • Convertire in archi e misurarli
  • Passare per il calcolo “da manuale” per curve regolari e quindi rettificabili che vuole un integrale una norma e successivamente l’introduzione di funzioni trigonometriche, le quali, nel computer sono a loro volta svolte con l’uso di serie di Taylor. Quindi semplficazione.
    Stante che come da esempio: al crescere della misura cresce l’errore… mi verrebbe da pensare (parolone per le mie possibilità) alla soluzione 1 o 2.
    Approssimazione che - per le attività umane - stimo accettabile.

In generale la lunghezza di una curva si deve calcolare come ha indicato @giuseppe o con metodi numerici, ad esempio con Gauss Legendre, scomponendo la nurbs in curve bezier e procedendo con l’integrazione numerica.

Ciao

grazie a tutti per le risposte


i due punti selezionati sono ricavati da dividi x lunghezza
in entrambe le direzioni con una distanza di 10 mm
queste sono le lunghezze di cui vi parlavo:

10,0000000288812 lunghezza primo tratto
315,8246910642100 lunghezza tratto intermedio
10,0000000288838 lunghezza tratto finale

335,8246911219750 somma delle tre lunghezze

335,8246910205870 lunghezza della curva

Giuseppe per il file se ti posso chiedere la cortesia di rimandarlo nella versione 5 te ne sarei grato

ho fatto una prova come suggerito convertendo la curva in archi e queste sono le lunghezze ricavate

10,0000000000506 lunghezza primo tratto
315,8251571602440 lunghezza tratto intermedio
10,0000000000508 lunghezza tratto finale

335,8251571603450 questa volta la somma tra le tre lunghezze e la lunghezza totale combaciano

unico tasto dolente, avevo messo un IF nel caso la Somma differisse dalla Lunghezza
ed anche in questo caso mi ritorna il messaggio che non combaciano anche se i numeri dicono altro
c’è ancora qualche approsimazione che viene trascurata?

grazie ancora a tutti!

Confrontare numeri floating point e’ una cosa da fare … con le molle. :wink:
Spesso i calcoli con i floating point generano errori di arrotondamento … o altre cose che sanno i matematici. :slight_smile:
Se vuoi confrontare due floating point, e’ meglio verificare che la differenza tra i numeri (in valore assoluto) sia minore di un certo limite.

… Salvo errori od omissioni …

ciao Emilio
non so se era la tua idea di valore assoluto, io ho confrontato tramite la funzione Abs
ma IF mi ritorna sempre con il messaggio che non combaciano

mi consigli di accontentarmi quindi :slight_smile:

ritorno ad una considerazione fatta ieri mensionando i titolari di azienda
una mattina viene il capo è ti chiede una cosa che lui ritiene semplice:
“trovami la lunghezza precisa di una curva” mmmm non sei capace
LICENZIATO ahahahah :rofl::rofl:

Devi confrontare il valore assoluto della differenza con una tolleranza.

Ad esempio, se le due lunghezze sono lung0 e lung1 e consideri una tolleranza di 0.001:

if abs( lung0 - lung1 ) < 0.001 then

Gli rispondi: "Definisci ‘precisa’ "

quindi non arrotondi con un tot di decimali, ma è la differenza che non deve superare un tot di decimali :+1:

OTTIMO :slight_smile:

ps ma mi sa che si infurierebbe come una belva essendo che lo metteresti molto in difficoltà ahahahah

Beh, se usi i comandi Rhino, che a sua volta usa i floating point e i suoi algoritmi per la lunghezza … direi di si’. :slight_smile:

Tieni conti che la precisione di un numero floating point e’ di circa 15 cifre.

Non so se Rhino consideri la tolleranza del file 3dm per questi calcoli.
Comunque nel primo caso combaciano le prime 9 cifre.
Nel secondo addirittura 16. :grinning:
… Peccato che convertendo in archi conservi solo 5 cifre … :wink:
Forse si puo’ provare a diminuire la tolleranza per la conversione …

Se non basta, credo di debba usare altro.
Ne hanno parlato Giuseppe e Sergio.
Forse con programmi come Mathlab o simili. … non saprei.

figurati Emilio assolutissimamente non ho la necessità di tutta questa precisione
per fortuna non dovrò usare il robot “Da Vinci”

è solo che lavorando con gli script non mi aspettavo una differenza di misure
ero convinto che all’arrotondamento a decimali era una prerogativa nell’interfaccia di Rhino

si ho letto ciò che hanno scritto Giuseppe e Sergio e li ringrazio
ma con la precisione ottenuta convertendo la curva in archi mi posso ritenere già più che soddisfatto
impiegare altri programmi oppure eseguire procedure complicate credo che non ne valga la pena
poi se si trattasse di aggiustare la formula o cose simili allora a quel punto ne sarei contento :+1:

giusto una curiosità:

anche in questo caso una volta recuperato un solo punto usando dividi per lunghezza
e poi si usa il comando converti non solo ripristina tutti i punti della divisione
ma questa volta rimangono anche visibile i punti del comando converti
cosa che invece non succede se sulla curva non esistono punti