Punti in quadrature su curve

QUAD

in Rh attivando lo snap Quad con un curva come quella della foto, si possono inserire i suddetti punti

in Gh si potrebbe avere lo stesso risultato? in rete ci sono alcuni 3d ma sembrano senza soluzione :thinking:

sto comparando i vettori della suddivisione dei punti della curva alla direzione del piano
forse è la giusta strada. . . .

La classe Curve ha il seguente metodo: Curve.ExtremeParameters Method

Che in pratica restituisce tutti i parametri laddove la tangente locale sulla curva è perpendicolare al vettore fornito.
Come specificato dal metodo, nel caso di curve non periodiche il metodo restituirà sempre anche gli endpoints (anche se il discorso della perpendicolarità non sia presente)…

Da qui due soluzioni:


c# quad points.gh (8,1 KB)

Il primo, banale monoriga:

private void RunScript(Curve C, Vector3d V, ref object t)
  {
    t = C.ExtremeParameters(V);
  }

Il secondo, esclude i casi dove manca la perpendicolarità tra tangente e vettore fornito:

  private void RunScript(Curve C, Vector3d V, ref object t)
  {
    double[] T = C.ExtremeParameters(V);
    List<double> T2 = new List<double>();
    foreach(double d in T){
      double a = Rhino.Geometry.Vector3d.VectorAngle(C.TangentAt(d), V);
      if(Math.Abs(a - Math.PI / 2) < this.RhinoDocument.ModelAbsoluteTolerance){
        T2.Add(d);
      }
    }
    t = T2;
  }
3 Mi Piace

ciao Riccardo, grazie per la definizione :+1:
(sei sempre sul pezzo centrando l’obiettivo)

io invece anche se “forse” la teoria è giusta, nella pratica la mia def non va:

in questa prova, ho messo i punti sulla curva col quad attivo e il listitem seleziona tutti e 3 punti

con quest’altra def dove cerco di trovare i punti giusti anche aumentando i decimali non trova nulla

tornando alla tua def, non si potrebbe replicarla anche in Py?

ps mi meraviglio, come mai non c’é un componente in Gh che dia le due soluzioni che hai postato.
(si c’é Extremes ma ritorna solo i due estremi)

Il test che stai facendo con “Member Index” non può andare bene nel tuo caso.
Il vettore X che stai usando è purissimo, ( 1,0,0 secco )… mentre i vettori ricavati dalle tangenti non saranno mai esattamente uguali, mai così puliti.
“Member Index” è come se facesse un test A==B, e nel tuo caso risulta sempre false…

Casomai dovresti fare un confronto, misurando l’angolo tra le tangenti T e il tuo vettore X… quando sotto una certa soglia allora usi un dispatch o cull.
Ma anche con questo metodo sarebbe difficile da gestire, avresti più risultati in un singolo punto di quad, dipende dalle divisioni che fai. Con 1000 divisioni come hai fatto, facilmente avrai anche decine di punti che rispettano la tolleranza messa.
tangent angle cull.gh (8,8 KB)
angle

Suppongo di si, ma io di python non so quasi nulla… ogni volta che lo prendo in mano sembra di leggere cinese. Cinese criptato SHA265.
Con c# mi trovo troppo bene… difficile rompere un abitudine…

Se nelle librerie di rhino non ci fosse il metodo, io sarei ricorso ad una costruzione fisica della derivata, intersezione con un piano, e quindi ottenuto i punti che mi servono:

tangent derivative.gh (9,8 KB)

Vedi anche qua:

2 Mi Piace

Ciao ragazzi.

Forse cosi’ …

3 Mi Piace

eqt

si in effetti è stata la mia ultima scelta il MemberIndex, avevo prima usato il componente Equality ma riscontrando che non dava risultati avevo inteso che ci volesse una tolleranza, e avevo anche provato anche Equality Tolerance ma anche in questo caso nulla. andando a verificare questo componente fa una cosa che non sapevo, per i vettori somma tutti e 3 valori quindi ritornava sempre 1 in tutti i casi.

bella la seconda soluzione coi componenti Gh come anche gli esempi da te postati nel link :+1:
forse mi potrebbe tornare utile anche in un’altra occasione lasciata in sospeso, potrebbe essere la chiave giusta e spero che riesco ad adattarlo. (in Gh alcuni componenti mi fanno andare al manicomio e uno di questi è proprio “Angle” :triumph: che mi serviva calcolare un determinato angolo mentre oltre 180° si riazzera)

per fortuna abbiamo Emilio che traduce/converte tutto il Python :wink: thanks :+1:

ps Riccardo alla fine lo script in C# l’ho hai già fatto, manca solo il componente nella futura versione :clap:

Ho provato con questa definizione tanto per vedere se era possibile ottenere un risultato senza l’utilizzo dello script che, credo, resta comunque la soluzione più semplice e più affidabile.
Ovviamente vale solo per curve abbastanza “lineari”.
Il risultato differisce dalla definizione di Riccardo, per qualche decimale, nelle ascisse.
quad points b.gh (19,3 KB)
Un caso in cui non tutti i punti non vengono rilevati.
quad points d.gh (4,0 KB)

ciao Leopoldo, non ho ancora avuto modo di verificare quanto dici,
però, credo che questo dipenda dalla differenza gestionale dei decimali tra i componenti e codici/script
ne parlammo tempo fa in un’altro 3d, dove riscontravo proprio questo problema, la differenza tra decimali.

è un bug del metodo .ExtremeParameters()… come hai fatto a trovarlo?
Ho provato varie altre curve ma mi funziona sempre tutto…

Ho provato con una curva costruita con punti di controllo “simmetrici”.
img1

2 Mi Piace

scusa Leopoldo, non ho capito una cosa: quale def dici che non funziona?

ho ricopiato sia la def piccola con solo lo script che quella con tutti i componenti Gh

ed applicando le 2 curve riportate nei singoli file.gh, la prima ci sono tutti i punti. la curva con maggiori variazioni, sia con la def dello script che quella con tanti componenti, non riportano i due punti selezionati.

La curva della definizione “quad points d” è un caso particolare.
Vedi i messaggi precedenti.
Ho un po’ modificato la definizione “quad points b”.(vedi allegato “f”)
Come puoi vedere rileva anche i punti che ExtremeParameters() non riconosce.
Tieni presente che è sempre una definizione non basata su calcoli matematici, quindi, in casi molto particolari potrebbe anche non rilevare qualche punto.
Nel caso si potrebbe anche introdurre un controllo “manuale”.
quad points f.gh (21,7 KB)

ragazzi sono riuscito a ritrovare dal pc il link menzionato a inizio 3d,
dove proprio Rutten nel 2016 rispondendo al quesito, diceva che non era un problema semplice.
(nel vecchio sito Gh dal cellulare non capisco perché non riesco a vedere l’intera risposta di Rutten):

la soluzione è simile a quella già postata da Riccardo nelle prime risposte,

con la differenza che facendo una prova con la curva di Leopoldo, sembra che funziona bene.

(dalla traduzione, Rutten precisa che non ha una soluzione analitica, ma raggira il problema quasi al 100%)

considerazioni: forse per questo che non esiste un componente predisposto a tale problema, se dal 2016 è stato esposto il quesito. mi sa che il codice che fa funzionare un componente, sia più complesso dei risultati che si possono estrarre dall’assemblamento di vari componenti.

forse il metodo: .ExtremeParameters() è stato un primo tentativo “parziale”?
comunque credo che dovrebbe essere segnalato come Bug non credete?

ps posto il link del vecchio sito di Gh, e anche quello del forum dove se ne parla recentemente:

nonQuad2

NonQuad3.gh (6,3 KB)

in allegato il file Gh, con entrambi i metodi script completo e con solo: t = C.ExtremeParameters(V)
con lo script mi torna in basso a destra un punto quad che invece in Rhino non aggancia. . . .

:triumph: :triumph:

La soluzione analitica non è complessa … anche nel caso di curve razionali.
E’ sufficiente trovare i punti in cui si annulla la derivata della curva.

1 Mi Piace

ciao Sergio,

heee mi fa piacere che la soluzione non’é complessa, ma come saprai per me invece si. . . .

it.wikipedia.org/wiki/Derivata
www.youtube.com/watch?v=xBzO_tFkvkc
www.youtube.com/watch?v=8lhG_clLZes

dai videi che ho postato qualcosina l’ho capita, le formule su wiki quelle per me sono una lingua aliena

sperlo fare. . . .

scusa Sergio, non so la complessità a scrivere il codice che faccia ciò che hai menzionato,
nel caso, anche recuperare la parte che serve di un’altro codice anche in RhinoScript
poi nel caso vedrò di adattarla in Python per aggiungerlo alla parte già postata?

Ciao Sergio

… E si riesce a trovare questi punti per via analitica automaticamente ? :confused: :slight_smile: