Linea vicino col punto

Ciao Salvio

Se capisco l’idea, stai usando seni e coseni sulle coordinate del punto.
Seni e coseni li puoi usare solo sugli angoli, non sulle lunghezze.

Per costruire la trasformazione della rotazione attorno a un punto a piacere si devono comporre 3 trasformazioni:
prima uno spostamento per portare il punto di rotazione sull’origine
poi la rotazione come gia’ la conosci
e infine inverti lo spostamento iniziale per riportare tutto al suo posto.

Per fare questo devi moltiplicare le matrici.
Certo se vuoi lo puoi fare a mano, ma e’ una cosa un po’ lunga:
per ogni elemento della matrice risultato occorre moltiplicare gli elementi di una riga della prima matrice per quelli di una colonna della seconda e poi sommare i prodotti.
Grasshopper mette a disposizione il componente Compound per moltiplicare le matrici.

1 Mi Piace

quindi anche “solo” per indicare un punto di inizio diverso bisogna fare tutto questo mmmm
speravo vivamente di poter evitare, e vabbè ho voluto la bici e adesso pedalo ahahahah

ok grazie Emilio proverò :+1:

osservando lo schema postato precedentemente

se la coordinata y è 0 moltiplicando con f diventa 0?

Direi di si’

Emilio dimmi se il ragionamento è questo:

se debbo spostare un oggetto partendo da una matrice, in sostanza mi basta sostituire la posizione della matrice “dhl” con le coordinate del nuovo punto “xyz” senza fare nessun’altra operazione giusto?

In che senso ?
Hai gia’ una trasformazione e vuoi aggiungere lo spostamento ?

come si vede nella foto in Py ho aggiunto i due valori 100 e la trasformazione mi sposta la linea
quindi per lo spostamento è come hai detto per la rotazione credo che il gioco è fatto
ora mi interessa poter ruotare gli oggetti indicando il fulcro con il componente punto p

import rhinoscriptsyntax as rs

w=[]
for i in range(4):
    for j in range(4):
        if j == i:
            w.append(1)
        else:
            w.append(0)

import math
if x is not None: v = x; k = [5,5,5,5]
if y is not None: v = y; k = [0,7,-2,5]
if z is not None: v = z; k = [0,0,0,0]

w[0+k[0]]=math.cos(math.radians(v))
w[1+k[1]]=math.sin(math.radians(-v))
w[4+k[2]]=math.sin(math.radians(v))
w[5+k[3]]=math.cos(math.radians(v))

#w[3] = 100 #rs.coerce3dpoint(p)[0]
#w[11] = 100 #rs.coerce3dpoint(p)[2]

u=0
for uu in range(4):
    for uuu in range(3):
        w[u]*=rs.coerce3dpoint(p)[uuu]
        print u, w[u]
        u+=1
    w[u]*= rs.coerce3dpoint(p)[uuu]
    print u, w[u]
    u+=1

#w[3]=w[2]+w[1]+w[0]
#w[7]=w[6]+w[5]+w[4]
#w[11]=w[10]+w[9]+w[8]
#w[15]=w[14]+w[13]+w[12]


r = w

il codice Py dovrebbe moltiplicare mi sembra tutti i valori dovuti, ma la somma finale non l’ho fatta eseguire essendo che mi sposta l’oggetto ma sicuramente c’è qualcosa che mi sfugge. . . .

Non capisco cosa faccia il doppio loop … :confused:

Se stai cercando di moltiplicare alcuni elementi della matrice per ottenere la tua trasformazione composta, non devo essermi spiegato.

Per ottenere una trasformazione composta (ad esempio da traslazioni e rotazioni) devi costruire una matrice di trasformazioni per ogni trasformazione elementare, quindi nel tuo caso una per la prima traslazione, una per la rotazione e una per l’ultima traslazione.
E poi devi moltiplicarle tra loro (e’ quello che fa Compound ).
Io farei una prova con i componenti di GH: costruisci la matrice che cerchi con i componenti di GH, e poi confronta il risultato con quello che ottieni dai tuoi calcoli.
Cosi’ vedi se vanno bene.
Puo’ darsi che la lista delle matrici da moltiplicare vada ribaltata, partendo dall’ultima trasformazione …
Non ho provato, ma mi sembra fosse quello che diceva Luca.

Emilio intendevi una definizione come questa?

è proprio quello che stavo facendo con il mio codice, modificare solo i due parametri richiesti
infatti con il mio codice come hai sottolineato esegue un doppio loop:
(il primo lo avevo scritto all’epoca quando si parlò su come far funzionare la rotazione coi seni e coseni, il secondo stavo facendo le prove invece su come indicare il punto per la rotazione)

ed in effetti la strada che avevo preso non era sbagliata quella di cambiare solo i due valori
e adesso che riesco a vedere il risultato questo mi da la conferma (vedi evidenziati in rosso)

quindi la seconda parte del codice il secondo loop che moltiplica i valori con xyz non serve

ma bisogna solo calcolare due valori:

  1. quello indicato nei rettangoli che hanno lo stesso valore ma con 2 decimali in meno
  2. quello indicato dalla freccia ma che non mi è ben chiaro quale sia l’operazione da fare

quindi analizzando, l’errore stava nel fatto che io con il coerce3dpoint inserivo i due valori ma fissi
invece anche quei due valori hanno bisogno di essere ricalcolati continuamente (c’ero vicino però)

certo che trovare esempi su come fare questi calcoli in modo pratico nell’uso della programmazione non’è proprio semplice infatti quello indicato dalla freccia mi sfugge del tutto. . . .

… mi son perso, poi la cavalletta non l’ho mai usata.

Partendo dall’alto verso il basso:
la prima matrice sposta in direzione Z di 100.
La seconda matrice ruota dell’angolo rispetto all’asse X dell’angolo.
La terza ruota dell’angolo e trasla.

Se devi ruotare e di seguito traslare è sufficiente una sola matrice.

il valore 8.6 è dato da 100 - 100*0.914

Attento che nel codice python che hai postato c’è un errore:
-sin(angolo) è diverso da sin(-angolo)

Ciao

1 Mi Piace

Scusa Sergio … non capisco …

w[1+k[1]]=- math.sin(math.radians(v))

1 Mi Piace

Non e’ uguale ? :confused:

grazie Sergio era il puzzle mancante :+1:

ciao Sergio infatti avevo questo dubbio, successivamente avevo aggiustato ma non ero sicuro

ciao Emilio, se ricordo bene, con delle prove il risultato non era quello giusto.

Sì Emilio, sono uguali. Ma causa confusione.

1 Mi Piace

mi avevi convinto ahahahah

Ah, OK, grazie !

E’ vero ragazzi, voi due riuscite sempre a confondermi. :confused:
:smile: