Help vector


#1

saluto tutti ps e spero che non siate ancora in vacanza :yum: no dai scherzo chi può fa benissimo :slight_smile:

ho rimandato un problemino da tempo con la speranza di capirci qualcosina in più mentre imparavo, ma ahimè non sono ancora in grado di venire a capo della soluzione da solo spero in un vostro aiuto.

in pratica in una linea retta dovrei aggiungere un punto dando una distanza specifica alla estremità
(tipo estendi curva ma solo ricavando le coordinate per aggiungere un punto tenendo conto della direzione)

io mi sono focalizzato sui vettori ho visto la guida e sul web ma senza riuscire a ricavare granché
a questo punto spero di non aver seguito una strada sbagliata? grazie anticipatamente . . . .


#2

Ciao Salvio

Anch’io userei i vettori.

Parlando di algoritmi … e ammesso di aver capito il problema …
Si potrebbe fare in questo modo:

  1. ricavi il vettore che va dall’inizio alla fine della linea (supponendo che il punto da trovare sia dalla parte della fine)
  2. lo trasformi in vettore unitario ( a scuola li chiamavano versori )
  3. moltiplichi il versore per la distanza desiderata ( da fine retta a punto cercato )
  4. sommi il vettore cosi’ ottenuto al punto di fine linea.

Se serve aiuto per tradurre il tutto in RhinoScript … fai un fischo. :slight_smile:


#3

Non vorrei sbagliarmi ma rhinoscript ti restituisce già il vettore tangente alla curva nel punto dato (mi pare anche il rhino.startpoint e rhino.endpoint).
Dopo verifico quando sono davanti al pc.

Ecco, i comandi sono:
CurveCurvature
CurveTangent


#4

Gia’ … e’ vero … ( Ma non c’e’ la faccina dello smemorato ? … Se la sono dimenticata ? :wink: )

Cosi’ semplifichiamo, meglio ancora !!! :smiley:


#5

ciao emilio ciao lucio
grazie per i suggerimenti, scusate il ritardo ma mi sono messo a lavoro ieri sera nel tardi.

ho seguito prima la procedura di emilio, mi stavo quasi arrendendo “sai stavo quasi per fischiare ahahahah” poi per fortuna ho la testa dura ed ho fatto un’altro paio di prove e ci sono riuscito :slight_smile: debbo dire anche se la strada era quella che avevo intrapreso (beh in pratica avevo spulciato tutti i metodi vector) ma senza la spiegazione di combinazione e sequenza non ci sarei mai arrivato very thanks :slight_smile:

poi stamattina mi sono messo a provare anche il suggerimento di lucio e in effetti con questi due metodi mi trovano subito il valore unitario. ma se ho capito bene dovrò usare CurveTangent per le linee rette e CurveCurvature per quelle curve. essendo che il primo su quelle curve non segue la curvatura mentre il secondo sulle rette non funziona, solo che per il secondo caso dovrò tenere presente anche la direzione della curva se no mi ritrovo il punto dalla parte inversa giusto?


#6

Secondo me puoi usare sempre CurveTangent (tanto a te non interessa la curvatura nel punto, quindi curve curvature tu restutuisce dei valori in più per nulla…).
Per la direzione… quello è un altro paio di maniche… non è che per caso ti stai facendo uno script per generare codice ISO da dare in pasto a un CNC, vero? :wink:


#7

grazie della sopravvalutazione lucio ma di codici iso non so nemmeno di cosa si tratti :slight_smile:

ritornando all’uso di CurveCurvature che in pratica imula il comando estendi con retta sia la cosa migliore da fare con una curva a prescindere (a meno che non si hanno esigenze specifiche) e ti dico che con questo metodo mi hai anticipato il secondo problema che volevo porre :slight_smile: PS una volta dicessi che ti capita di “azzeccare” ciò che gli altri intendono fare anche se nella loro spiegazione non sia tutto chiaro beh che dire questa volta ti sei superato lo hai fatto senza nemmeno che scrivessi il quesito ahahahah grande :slight_smile:


#8

ancora grazie ad entrambi ragazzi dell’aiuto e buon appetì :slight_smile:


#9

La classe non è acqua… ma prosecco! Hic! :clinking_glasses::champagne:


#10

ottimo per me quello dolce :slight_smile:

a proposito di vettori oltre a ciò detto fin’ora, per ottenere un punto in modo perpendicolare dalla linea, la rotazione vettore va bene o c’è un metodo specifico?


#11

Hai provato con Rhino.CurveFrame() ?


#12

mi sa che la rotazione del vettore non va bene per quello che mi serve fare oppure non ci sono riuscito io.
per fortuna mi è venuto in mente il metodo consigliato da lucio CurveCurvature che restituiva altre matrici e provando con la terza opzione mi restituiva il centro della curvatura che dovrebbe corrispondere sempre alla perpendicolare “credo” e da lì avendo il punto sulla curva con il centro perpendicolare eseguo la sequenza di emilio creando un vettore lo trasformo in unitario moltiplico e sommo e mi trovo il punto perpendicolare.

in mancanza di una formazione scolastica questi vettori per me sono un terreno ostico oltre che sconosciuto.
e non finisce qui: essendo che adesso mi ritrovo sempre col dover superare il problema di riuscire a trovare la perpendicolare ad una linea essendo che come già spiegato questo metodo sulle rette non funziona :confounded:

grazie per la risposta, in verità emilio è stata la scelta che avevo fatto all’inizio prima dei vettori solo che non sapevo come poi mi potesse tornare utile. beh ora che mi ci fai ripensare, forse con il comando vettore posso vedere se riesco a creare il vettore utilizzando gli angoli del frame mmmm (era questa la tua idea?)

PS però io avevo provato CurvePerpFrame tu invece CurveFrame vedo cosa esce fuori e vi aggiorno :slight_smile:


#13

Si’, il vettore da un punto sulla curva al centro di curvatura ti da’ la perpendicolare …
o almeno una perpendicolare.
In ogni punto la curva ha un piano perpendicolare, ogni vettore giacente sul piano e’ perpendicolare alla curva.
Poi certo bisogna vedere quale vettore perpendicolare ti serve.
Se e’ queloa che passa dal centro di curvatura … siamo a posto. :slight_smile:

E’ quello che stavamo dicendo.
Tu hai certamente un piano perpendicolare alla retta ( e naturalmente l’orientamento del piano e’ costante per ogni punto della retta )
Pero’ resta da decidere quale vettore, tra quelli giacenti sul piano, e’ quello che stai cercando … servono altre informazioni.

Credo che RhinoScript ti restituisca un punto e 3 vettori (gia’ pronti all’uso :slight_smile: ) … non credo ci siano angoli …
… Comunque e’ sempre meglio fare una prova … per sicurezza :slight_smile:

EDIT

Ti capisco.
All’inizio non sono semplici da … assimilare, ma una volta fattaci l’abitudine sono comodissimi ! :slight_smile:


#14

ciao emilio grazie dell’incoraggiamento ci vuole, ci vuole proprio :slight_smile:
mi sono fermato col frame ed avevo ripreso il lavoro sui vettori infatti nel frattempo ieri ho passato tutta la serata a lavorare sulla rotazione del vettore, per fare una battuta ci sto girando intorno ahahahah

Dim A: A = Rhino.GetPoint
Dim B: B = Rhino.GetPoint
Dim C: C = Rhino.VectorCreate(A, B)
Dim D: D = Rhino.VectorUnitize(C)
Dim E: E = Array(D(0) * 5, D(1) * 5, D(2) * 5)
Dim F: F = Rhino.VectorAdd(A, E)
Rhino.AddPoint F 'fin qui con qualsiasi direzione vettore il codice funziona

Rhino.AddPoint Rhino.VectorRotate(F, 90.0, Array(0, 0, 1))

il codice postato sopra funziona dandomi il risultato voluto solo se il punto “A” corrisponde a (0,0,0)
da questo punto in poi cambiando la direzione dei vettori ho fatto tutte le prove possibili su l’ultimo “Array” ma non trovo mai la soluzione giusta. “credo” che il gioco sia nell’ “1” dell’ultimo Array essendo che se il punto “A” è (0,0,0) e l’ultimo Array è (0,0,1) è funziona, presumo che se il punto “A” sia (x,y,z) l’ultimo Array dovrebbe essere (x,y,?). ho provato a cambiare anche gli assi del piano ma non sono molto pratico.

10

sopra ho postato un’immagine di quello che dovrebbe essere il risultato desiderato: in pratica ho una linea retta con i punti “A e B” che indicano inizio e fine direzione vettore, mentre il punto “F” è il punto tangente alla distanza desiderata fin qui OK. da qui in poi il codice mi dovrebbe ruotare il punto “F” di 90° o -90° (vedi i due punti selezionati) per rende “F” perpendicolare alla linea partendo dal punto iniziale quindi il punto “A”.

una cosa all’apparenza facile non credevo che per una rotazione mi servisse tutto questo lavoro. ho cercato anche sul web e stranamente mi sono reso conto che sui vettori non c’è molto su cui prendere spunto.

siete la mia unica ancora di salvataggio :slight_smile:


#15

Ciao Salvio

Due cose:

  1. per E puoi usare Rhino.VectorScale() … e’ piu’ corto da scrivere … :wink:

  2. non confondere punti e vettori.
    I punti li conosci bene … hanno una posizione … e basta :slight_smile:
    I vettori non hanno una posizione nello spazio
    Puoi considerarli come la differenza tra due posizioni
    ( Infatti puoi avere un vettore sottraendo un punto da un altro … E’ quello che fa VectorCreate )
    Per avere un punto devi sempre sommare un vettore ad un punto.
    Personalmente penso a un vettore come a uno spostamento, o tralsazione che dir si voglia …
    Puoi anche considerarli una direzione con lunghezza …
    Con il CAD non puoi disegnare un vettore puro e semplice.
    Per farlo, devi ‘applicare’ il vettore ad un punto, cioe’ dargli un punto di inizio (arbitrario)

Nel tuo script F e’ un punto, ottenuto sommando il punto A e il vettore E
Rhino.VectorRotate non ha senso applicato al punto F

Puoi invece ruotare il vettore E
e poi sommarlo al punto A, in modo da ottenere il punto cercato.

Lo script andrebbe bene se invece che un vettore usasse una linea:
costruisci la linea AF e la ruoti attorno al punto A
Cosi’ il punto finale della linea ti da’ il punto che cerchi

Se invece usi i vettori, bisogna ricordarsi di ragionare in modo diverso.
I vettori non sono linee.

Bene … confuso le idee a sufficienza per oggi ? :slight_smile:

P.S.
Probabilmente ho hai gia’ notato, comunque …
La documentazione di RhinoScript non serve per imparare i vettori,
anzi puo’ confondere le idee a chi e’ inesperto nel campo.
RhinoScript presume che chi usa i metodi sui vettori conosca la materia a sufficienza
da poter sceglier quale metodo usare e per quale scopo.
( Ad esempio in RhinoScript non c’e’ differenza tra un punto e un vettore )


#16

grazie mille emilio

funziona perfettamente (sarà un mio limite) ma il fatto di sommarlo al punto A per me è un mistero :yum:

che dire “Sì” adesso ho una confusione al quadrato ahahahah

beh mi consola quando hai detto che RScript può confondere le idee per chi non è pratico con i vettori :slight_smile:


#17

Hmmm …
Se vuoi, domani o quando preferisci, a mente fresca, potresti provare cosi’:

vec1

  1. disegna una linea A, a piacere
  2. fanne una copia A’, dove preferisci
  3. esegui questo script, che ti chiede di cliccare sui punti iniziale ( B ) e finale ( C ) di A
    e sul punto iniziale ( D ) di A’
b = rhino.GetPoint("Punto iniziale di A => B ?")
c = rhino.GetPoint("Punto finale di A => C ?")
d = rhino.GetPoint("Punto iniziale di A' => D ?")
v = rhino.VectorSubtract(c, b)
p = rhino.VectorAdd(d, v)
rhino.Print rhino.pt2str(p)

ho usato VectorSubtract perche’, pur facendo la stessa cosa che fa VectorCreate, secondo me almeno si capisce cosa sta calcolando.
( A mio parere VectorCreate serve solo a confondere le idee )

nello script b, c, d sono punti, ovviamente
v invece e’ un vettore ( il vettore che va da B a C )

p e’ di nuovo un punto, calcolato tramite VectorAdd, ma non farti ingannare dal nome,
il metodo funziona sia con punti che con vettori (e’ una semplice somma di coordinate)
Qui sommiamo il vettore v al punto d.

Lo script scrive la posizione di p.
Adesso prova a vedere dove si trova il punto p
… e a capire perche’ si trova li’. :slight_smile:

… Forse ti aiutera’ a capire cos’e’ un vettore e cosa significa sommare un punto e un vettore …
… Ma se non serve, non preoccuparti … e’ solo un tentativo … non sono un insegnante … :blush:


#18

diciamo che adesso leggendo e rileggendo già mi sembra un pò più familiare poi spiegato così mi ha aiutato a rivedere il primo codice, forse è stato proprio quel punto F che mi ha fatto deviare dal giusto ragionamento anche perchè pensandoci bene il primo codice l’ho scritto seguendo alla lettera le tue istruzioni ma poi analizzandolo meglio in effetti bisognava prima ruotare e poi sommare col punto A (appunto come sommo A-E)

grazie emilio dell’esempio che hai postato mi è servito a chiarire meglio come funzionano i vettori e grazie per le spiegazioni sia tue che di lucio mi sono state veramente utilissime. un saluto a tutti e alla prossima :slight_smile:


#19

PS in GH ci dovrebbe essere un componente Vector che se non erro in sostanza visualizza una freccia.

quindi indica il punto d’inizio e la direzione. potrebbe essere un buon modo per spiegare e comprendere no?


#20

Hai ragione ! … Mi dimentico sempre di GH … per queste cose e’ l’ideale ! :slight_smile:

Sperimentare su GH mi sembra un’ottima idea.
Ci sono diversi componenti con i quali puoi fare tutte le prove che vuoi :slight_smile:

Ho fatto una rapida prova … come forse ti ho gia’ detto, sono tutt’altro che un mago con GH … :smile:

… Se poi qualcosa non ti convince … fai il solito fischio … :wink: