Tangenze su curva

e che dire, dopo la quadratura e la perpendicolare, non poteva non mancare la tangenza :man_facepalming:

fiore

sono alcuni giorni che ci sto provando, sia in Gh come anche tramite script
le tangenze del fiore le ho ottenute col comando “Linea Tangenza 2Curve”

ps strano dividendo la curva in punti e recuperando lo stesso valore di T
il risultato del vettore non’é preciso. per lo meno con la mia definizione

Ri-ciao, salvio.
Ho dei dejavu a leggere i tuoi post… :upside_down_face:

Per evitare che capiti similmente con i miei, di post, anziché usare il solito poccio delle derivate stavolta userò un custom goal di kangaroo!

L’idea è abbastanza semplice: presa una linea circa nella zona giusta, 1 goal per il pull-to-curve, e un custom goal per dire alla linea di muoversi lateralmente.
strafeleft goal
Come vedi in automatico trova la posizione di equilibrio, che quindi sarà una linea tangente alla curva in entrambe le estremità.
Lascialo andare finché non dice “converged”.
(la .gif converge esattamente nel frame finale :sweat_smile: dovevo temporizzarlo meglio)

perimetro tangente esterno curva.gh (16,9 KB)
(se il custom goal c# non va, serve ri-aggiungere la libreria di kangaroo. Fai tasto dx sul c#, “manage assemblies”, “add” e seleziona il file KangarooSolver.dll che di solito si trova in C:\Program Files\Rhino 7\Plug-ins\Grasshopper\Components )

Si può usare il zombie solver, trova la soluzione praticamente istantaneamente, ma diversamente dal “Soft & Hard Solver”, a causa delle forze costrantanti, la linea si troverà staccata dalla curva.

Basta proiettare (curve closest point) le due estremità e il risultato dovrebbe essere preciso lo stesso.

2 Mi Piace

ciao Riccardo, non avrei mai pensato che bisognasse mettere in campo Kangaroo. . . .

hai perfettamente ragione, infatti con le altre soluzioni che avevi postato credevo di poter trovare la
soluzione da solo per questo quesito ma da ciò che vedo ero proprio fuori strada e di parecchio.

mi chiedo come mai anche nella seconda foto hai dovuto usare Kangaroo dopo CullPattern?
le curve che vengono riportate dal perimetro non sono tangenti?

… non è che “bisogna”, ma è una possibile strada… tanto per cambiare :laughing:

Ah, io ho estratto il bordo esterno della mesh generata con delaunay, ma in realtà si poteva ottenere la stessa cosa don “Convex Hull”:
2022-01-24 16_55_14-Window
Pesa meno, più pulito, più diretto…

Nota, estrarre da una curva n punti e poi generare una polilinea creerà molti segmenti che avranno i vertici sulla curva, ma i segmenti stessi potrebbero stare completamente dentro la curva, completamente fuori, o un po e un po… ma in pratica non saranno MAI tangenti alla curva, se non casi fortunati o in zone della curva dove è sostanzialmente lineare.

Quello che ho fatto è stato semplicemente “selezionare” i segmenti il cui punto medio cade fuori dalla curva.
Usando la polilinea dell’immagine qua sopra ^ , per ogni “conca” avrei avuto più segmenti “esterni”, da poi unire in un unica polilinea e quindi poi prendere solo le estremità… mi sono semplificato lo step usando il convex hull che quindi mi restituisce direttamente un singolo segmento per ogni zona di “conca”.


Nota che anche con pochissimi punti si riescono a trovare i 4 segmenti da dare in pasto a kangaroo, che arriva alla stessa soluzione… ma per sicurezza è meglio dare un 100 o 200 punti…

1 Mi Piace

ok appunto stavo per citare proprio convexhull che a come pare fa il lavoro che hai postato inizialmente
quindi in entrambi i casi crea una polilinea coi punti messi sulla curva “credevo funzionamento più articolato”
(per questo lo si trova nei componenti mesh, mi mancava la parte che crea i bordi delle mesh)

ma in pratica che funzione ha Kangaroo, dopo aver recuperato i segmenti della polilinea?
e anche a quel punto si potrebbe creare un piano per ogni segmento, per realizzare un BBox
e recuperare intersezione con la curva, o anche intersezione direttamente con un piano?

Guarda meglio la gif che ho postato. Quello è il compito di kangaroo: spostare la linea fino al punto di “equilibrio”, ovvero la tangenza corretta.

Le linee trovate con convex hull sono sostanzialmente sbagliate. Vicine alla posizione finale, un “buon suggerimento” per iniziare a lavorare, ma non sono tangenti.
Fare un BBox orientato come le linee non è di alcun aiuto, a mio avviso. Le intersezioni sarebbero comunque “casuali” e non avrebbero a che fare con le tangenze che tu cerchi.
Potresti usare le line per orientare la curva, trovare i punti di quadrante vicino, e tirare una nuova linea… e iterare così fino a raggiungere un equilibrio… ma ti servirebbe anemone o scriptare per iterare… a quel punto tanto vale fare con kangaroo.

inizio con un ps, ma usi un programma specifico per creare la gif,
oppure lo riesci a fare con applicazioni di default in windows?

quindi con Kangaroo si riesce a fare un lavoro simile a ciò che Giuseppe mi indicò con Galapagos:
dove avevo una retta fissa nel punto iniziale e la si inclinava fino ad ottenere la tangenza su una curva :+1:

2 Mi Piace

Riccardo scusa se passo da Gh a script, ma come per gli altri due casi esiste un metodo in C# ?

Quali “altri due casi” … ? :sweat_smile:

il primo era la tua soluzione in C# appunto col metodo ExtremeParameters
il secondo invece era la soluzione di Emilio, dove se non erro rispecchiava il grafico delle derivate
di cui hai anche citato all’inizio nella tua risposta, postando l’alternativa con Kangaroo.
(quindi presumo che oltre alla possibilità dello script anche con le derivate del grafico è fattibile?)

edit:
ma a proposito di tangenza, nello script proprio della quadratura,
double a = Rhino.Geometry.Vector3d.VectorAngle(C.TangentAt(d), V)
stavo pensando l’uso di TangentAt, sarebbe utile anche per questo quesito?

1 2

non comprendo perché con questi due miei tentativi non riesco a trovare i punti giusti per la tangenza:

col primo avevo pensato di estrarre coppie di tangenze uguali, filtrando la coppia che combaciano,
in pratica estendendo la parte finale della prima retta deve corrispodere con l’inizio della seconda curva.

mentre nel secondo caso creare molteplici cerchi e confrontarli ogni singolo cerchio con gli altri restanti,
trovando le due tangenze e filtrando quella che poi dovrebbe essere la tangenza della curva stessa.

un buco nell’acqua in entrambi i casi :man_facepalming: :man_facepalming: :sweat_smile:

ps ma è capitato anche a voi che oggi, non si riusciva ad accedere al sito?