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.
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?
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
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
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
grazie Emilio il codice con aggiunta di round adesso “funziona”
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 . . . .
se lo sapevo . . . . la funzione ABS avevo capito che servisse ad altro
e grazie anche a Sergio per il codice postato funziona alla grande
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