Calcolo baricentro insieme elementi

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?

grazie per le indicazioni in anticipo

Vorresti un metodo per calcolare contemporaneamente il centroide di più oggetti e non uno complessivo?

Vi = volume iesimo elemento
psi =peso specifico iesimo elemento
Xi,Yi,Zi = coordinate baricentro iesimo elemento

Xg = Sommatoria (Vi * psi * Xi) / Sommatoria (Vi * psi)
Yg = Sommatoria (Vi * psi * Yi) / Sommatoria (Vi * psi)
Zg = Sommatoria (Vi * psi * Zi) / Sommatoria (Vi * psi)

1 Mi Piace

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

2 Mi Piace

ok, corretto.
ma se dovessi avere un assieme di elementi con pesi specifici differenti come si potrebbe fare?

Vettori?

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

2 Mi Piace

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.

Tò, belli e pronti.
CM.gh (2,7 KB)

2 Mi Piace

grazie! appena posso lo proverò, grazie ancora!

Come si assegna ad ogni solido generico il rispettivo peso specifico?

non serve, basta la densità.

Allora ripeto la domanda: come assegni la densità ad ogni oggetto?
Densità e peso specifico si differenziano per un fattore 0.980665 …

  1. si creano due liste, una di solidi con stessa densità e una di densità (vedi immagine sopra);
  2. si ripete il punto uno per solidi di differente densità;

i CM in output dal primo componente diventano input del secondo.

interessante :stuck_out_tongue_winking_eye:
c’è il fattore g di mezzo, ma si semplifica nel calcolo del cm.

… in entrambi i casi …
Io non uso GH. Con la tua definizione se ho per esempio:

1 cubo densità 1
1 toro densità 7.85
1 sfera densità 0.45

che devo fare con la tua definizione?

Se non vuoi usare le mie definizioni (oppure quelle di Luca) potresti
procedere nel modo seguente:

    • per ogni solido determini il baricentro (punto - cmd _volumecentroid);
    • scali ogni solido rispetto al baricentro (il punto ricavato al punto 1) di
      un fattore radice cubica del peso specifico.
    • seleziona tutti i solidi scalati ed esegui il comando standard
      di rhino (_volumecentroid)

Dovrebbe essere cosi … penso.

Nulla di complesso, per calcolare i fattori di scala
riporto alcuni esempi (formule excel o da calcolatrice scientifica):

1 elemento in acciaio (7.85 kg/dm3) “=7.85^(1/3)” = 1.987421
1 elemento in legno (0.45 kg/dm3) “=0.45^(1/3)” = 0.766309
1 elemento il calcestruzzo (2.4 kg/dm3) “=2.4^(1/3)” = 1.33887

ciao

Sergio

2 Mi Piace

Quello che ho scritto

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?

1 Mi Piace

ZERO :joy: :joy: :rofl:

2 Mi Piace

2 Mi Piace