ciao a tutti,
a parte il comando volume centroide in Rhino esiste un modo per individuare il baricentro (NON GEOMETRICO) di un insieme di elementi selezionati che compongono una struttura sapendo che hanno lo stesso peso specifico?
Il volume centroide in Rhino È il baricentro.
(cosa intendi per “non geometrico”???)
Controlla se hai qualche solido/mesh aperto, altrimenti proprio nel caso di densità uniforme, basta che selezioni tutto e lanci il comando per avere il baricentro di tutti gli oggetti assieme… la media pesata già eseguita (come quella di Sergio).
Codice per settare il peso specifico di un solido chiuso
Sub setPS()
Dim obj: obj = rhino.GetObject("Seleziona l'oggetto")
If isnull(obj) Then
rhino.Print "Comando annullato"
Exit Sub
End If
If Not rhino.IsObjectSolid(obj) Then
rhino.Print "L'oggetto selezionato non è un solido chiuso"
rhino.Print "Comando annullato"
Exit Sub
End If
Dim ps: ps = rhino.GetUserText(obj, "ps")
If isnull(ps) Then
ps = rhino.GetReal("Setta il peso specifico dell'oggetto",, 0.00000001)
Else
ps = rhino.GetReal("Modifica il peso specifico dell'oggetto", replace(ps, ",", "."), 0.00000001)
End If
If isnull(ps) Then
rhino.Print "Comando annullato"
Exit Sub
End If
rhino.SetUserText obj, "ps", ps
End Sub
codice per calcolare il baricentro dei solidi chiusi selezionati con
peso specifico valido (settato). Restituisce il punto che individua il
baricentro e seleziona i solidi validi (chiusi e con peso specifico
settato).
Sub Baricentro()
Dim objs: objs = rhino.GetObjects("Seleziona gli oggetti solidi")
If Not isarray(objs) Then
rhino.Print "Comando annullato"
Exit Sub
End If
Dim n: n = ubound(objs)
Dim SumV:SumV = 0
Dim SumVx:SumVx = 0
Dim SumVy:SumVy = 0
Dim SumVz:SumVz = 0
Dim i, V, bar, ps, ic
rhino.UnselectAllObjects()
ic = 0
For i=0 To n
if rhino.IsObjectSolid(objs(i)) then
ps = rhino.GetUserText(objs(i), "ps")
If Not isnull(ps) Then
rhino.SelectObject objs(i)
If rhino.IsMesh(objs(i)) Then
V = rhino.MeshVolume(objs(i))
bar = rhino.MeshVolumeCentroid(objs(i))
SumV = SumV + V(1) * ps
SumVx = SumVx + V(1) * bar(0) * ps
SumVy = SumVy + V(1) * bar(1) * ps
SumVz = SumVz + V(1) * bar(2) * ps
Else
V = rhino.SurfaceVolume(objs(i))
bar = rhino.SurfaceVolumeCentroid(objs(i))
SumV = SumV + V(0) * ps
SumVx = SumVx + V(0) * bar(0)(0) * ps
SumVy = SumVy + V(0) * bar(0)(1) * ps
SumVz = SumVz + V(0) * bar(0)(2) * ps
End If
ic = ic + 1
End If
End If
Next
If ic > 0 Then
rhino.AddPoint array(SumVx / SumV, SumVy / SumV, SumVz / SumV)
Else
rhino.Print "Nessun solido chiuso selezionato."
End If
End Sub
la media pesata dei centroidi è il centroide complessivo o baricentro.
Ogni centroide coincide col centro geometrico se la massa è uniformemente distribuita (ovvero il peso specifico è costante punto per punto nel volume considerato).
Densità ro = Massa M / Volume V
Centro di massa (Punto) = (punto1* ro1 * V1+punto2* ro2 * V2+…+puntoN* roN * VN) / MassaTotale
oppure
Baricentro (Punto) = (punto* massa1+punto2* massa2+…+puntoN* massaN) / MassaTotale
Nel mio plugin esiste il componente per fare questo.
Scusatemi, ma io sinceramente non capisco… guardando gli slider dell’immagine non trovo dove vai a definire la densità dei vari oggetti selezionati?
Io vedo un unico slider per tutti gli oggetti… o forse non ho capito la definizione…
Non uso GH ma mi aspetterei di avere una lista di oggetti per ogni tipo di materiale e su questi andrei a fare i calcoli, o sbaglio?
In ogni caso non riesco a cogliere la distinzione tra il centroide calcolato in Rhino e quello calcolato in GH, che differenza c’è?
Io, in presenza di oggetti dello stesso materiale, ho sempre pensato la stessa cosa detta da Riccardo:
Poi un’altra cosa che non comprendo: fare distinzione tra densità e peso specifico, nel calcolo del baricentro, porta ad una differenza di quale ordine di grandezza?