Dividere parte di una curva

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

questo è tutto il codice. ho aggiunto ABS come suggeritomi
creo una retta e la divido per un tot. l’intento sarebbe selezionare solo i punti sopra la retta
dove quindi la Distanza è uguale a 0 ma se il risultato è come gli esempi mostrati non va bene.

Dichiari la variabile pnt senza essere settata ed esegui un ciclo sulla medesima …

sarebbe???
vuoi dire che essendo pnt viene richiamata in vari contesti deve essere settata di volta in volta?

edit:
ABS(pnt) ?

Mi son spiegato male. Usi pnt come variabile che deve essere settata in riferimento a Rhino.ObjectsByType(1) … Cosa contiene Rhino.ObjectsByType(1)?
In cosa sarà settato pnt?

in “punti” tutti i punti sia quelli sulla retta che quelli esterno ad essa

quindi con evaluate e closestpoint sulla retta mi dovrebbe calcolare la distanza

Dim crv: crv = rhino.GetObject(“select curve”, 4)
If isnull(crv) Then Exit Sub
Dim pts: pts = rhino.GetObjects(“select points …”, 1)
If Not isarray(pts) Then Exit Sub
Dim pt
For Each pt In pts

Next

Parti da questo e riprova …

Ciao

Dim crv: crv = rhino.GetObject("Select curve", 4)
If isnull(crv) Then Exit Sub

Dim pts: pts = rhino.GetObjects("Select points", 1)
If Not isarray(pts) Then Exit Sub

Dim pnt
For Each pnt In pts

	Rhino.Print Rhino.Distance(Rhino.PointCoordinates(pnt), Rhino.EvaluateCurve(crv, Rhino.CurveClosestPoint(crv, Rhino.PointCoordinates(pnt))))

Next

risultati:
0
1.77635683940025E-15
0
9.8488578017961
9.1706052144883

Sergio grazie lo stesso per i suggerimenti, ciao.

Purtroppo non scrivo da molto in vbs e non uso rhinoscript. Adesso ho visto che cosa fa il metodo ObjectByType … di seguito il codice che cerchi. I punti che si trovano sulla curva vengono settati di colore rosso.

Ti consiglio di scrivere il calcolo in più passaggi a favore di una più chiara lettura del codice
e per testare passo passo, ad esempio con dei messaggi temporanei, i valori calcolati.

Ciao
Sergio

Call Main() 
Sub Main()

Dim crv: crv = rhino.GetObject("select curve", 4)
If isnull(crv) Then Exit Sub
Dim pts: pts = rhino.GetObjects("select points ...", 1)
If Not isarray(pts) Then Exit Sub
Dim pt
Dim tol: tol = rhino.UnitAbsoluteTolerance()
tol = tol * tol
Dim Spts()
Dim count: count = 0
For Each pt In pts
	Dim coord: coord = rhino.PointCoordinates(pt)
	Dim t:t = rhino.CurveClosestPoint(crv, coord)
	Dim tpt:tpt = Rhino.EvaluateCurve(crv, t)
	Dim L:L = (coord(0) - tpt(0)) ^ 2 + (coord(1) - tpt(1)) ^ 2 + (coord(2) - tpt(2)) ^ 2
	if abs(L) < tol then
		count = count + 1
		ReDim Preserve Spts(count)
		Spts(count) = pt
	End If	
Next

Dim i
For i=1 To count
	Call rhino.ObjectColor(spts(i), 255)
Next
End Sub

:smile::smile::smile:

Giusto ! :slight_smile:

Se vuoi ottenere 0, prova ad usare round(), con un ‘conveniente’ numero di decimali … :wink:

EDIT

… Parlavo di Python.
Ma credo che anche per il VBS ci sia una cosa simile.

grazie Emilio il codice con aggiunta di round adesso “funziona” :+1:
questo è il risultato senza round:

0
1.25607396694702E-15
6.2803698347351E-16

scusate la domanda elementare:
ma i riferimenti E-15 o E-16 non stanno ad indicare che i decimali effettivi superano quelli visibili?
io da quello che vedo come risultato sono numeri maggiori di 0 con decine di decimali
come può round che arrotonta i decimali trasformare il risultato sopra tutti in “0”?
io mi aspetterei al massimo un numero unitario impostando round a 0 . . . .

:frowning: se lo sapevo . . . . la funzione ABS avevo capito che servisse ad altro

e grazie anche a Sergio per il codice postato funziona alla grande :+1:
come si è capito di matematica e algebra sono a digiuno quindi Sergio
ti assicuro che mi potevi dare tutte le spiegazioni e l’impegno possibile
ma di sicuro a questa soluzione matematica non ci sarei mai arrivato

grazie ancora a tutti :+1:

Ciao Salvio

No

significa 1.25607396694702 moltiplicato per 10 elevato a -15
cioe’
0.00000000000000125607396694702 … se non ho sbagliato a contare gli zeri …

altri esempi:

0.0005 = 5.0E-4

0.2 = 2.0E-1

3000 = 3.0E3

4 = 4.0E0

eccetera …

Il fatto che ci siano o meno altri decimali non visibili e’ un problema diverso e indipendente.
Non c’entra con la notazione scientifica.

1 Mi Piace