Trovare punti perpendicolari da un punto su curva chiusa

lo so, dico sempre che dopo una certa ora non dovrei postare domande (si fanno molti errori)

in Py è possibile trovare i 4 punti inferiori perpendicolari al punto superiore della stessa curva chiusa?

Ciao Salvio

Mah … per ora nessuna idea particolare … salvo la solita la forza bruta. :wink:
Cioe’ fare un loop e cercare i punti in cui l’angolo tra retta e curva sia 90 gradi …

1 Mi Piace

ciao Emilio, quindi in Py metodi/soluzioni apposite non c’è ne sono. e usando Rhino.Common?

Non so, a me non viene in mente niente.
Forse qualcun altro ha un’idea migliore. :grinning:

Se serve, ho provato a buttar giu’ uno script molto rozzo, che controlla l’angolo in 1000 punti,
poi interpola una curva che interseca con l’asse X per trovare i parametri dei tuoi punti.

Per maggiore precisione, aumenta il numero dei punti.

import rhinoscriptsyntax as rs

def main():
  cu = rs.GetObject( 'Curve ?' )
  pt = rs.GetPoint( 'point ?' )
  us = rs.DivideCurve( cu, 999, False, False )
  pts = []
  for u in us:
    p = rs.EvaluateCurve( cu, u )
    t = rs.CurveTangent( cu, u )
    v = rs.VectorUnitize( pt - p )
    cos = t * v
    pts.append( ( u, cos, 0 ) )
  ic = rs.AddInterpCurve( pts )
  ax = rs.AddLine( ( 0, 0, 0 ), ( us[ -1 ], 0, 0 ) )
  ts = rs.CurveCurveIntersection( ic, ax )
  for t in ts:
    u = t[ 1 ].X
    rs.AddPoint( t[ 1 ] )
    pc = rs.AddPoint( rs.EvaluateCurve( cu, u ) )
    rs.AddLine( pt, pc )

main()

Ciao Emilio, ho provato lo script ma mi dà questo errore:

ciao Fabio, anche a me dava un errore, ma io ho usato il codice direttamente in Gh
e quindi dovevo prima settare l’input x e y come curva e punto cliccando col tasto Dx

poi ho dovuto aggiungere una lista (quelli indicati col trattino rosso)
per riportarmi il risultato in uscita con a (ora non so se sia anche il tuo caso se usi editor di python)

ps ho provato anche ad aggiungere una lista per “rs.AddPoint( t[1] )” ma non mi torna nulla :thinking:
(la riga dove ho messo i 3 puntini rossi)

edit: come risultato linea/curva mi ritorna anche il vettore del punto originario

Ciao Fabio

Dall’immagine non vedo intersezioni della curva disegnata dallo script …
EDIT: intendevo intersezioni con l’asse X … sorry / EDIT
Sembra che non trovi soluzioni. :confused:

Puoi postare curva e punto ? Grazie. :slight_smile:

Se ti serve in GH, forse e’ piu’ semplice usare i componenti …
Visto che avevi postato sotto Scripting pensavo volessi uno script per Rhino. :slight_smile:

Scusa Emilio, ho sbagliato io.
Compaiono anche delle curve “in più” (le ho segnate in rosso), però trova quello che deve trovare.

Si’, lo script per trovare i punti cercati da Salvio fa una specie di grafico:
prima genera una serie di punti sulla curva
poi disegna un grafico con ascissa il valore del parametro e ordinata l’angolo tra la curva e la direzione verso il punto
EDIT: pardon … il coseno dell’angolo / EDIT
infine interseca questa specie di funzione con l’asse X per trovare gli zeri, cioe’ i parametri dei punti cercati.

Lo script e’ solo una bozza, da rifinire.
Oltre a non cancellare quelle curve, non controlla nemmeno che il punto sulla curva non coincida con quello di riferimento (potrebbe capitare nel caso postato da Salvio, cioe’ se il punto di riferimento e’ sulla curva)
E, come hai visto, non controlla anche diverse altre cosette … :wink:

Ma tutte queste cose le lascio fare a lui … :grinning_face_with_smiling_eyes:

Se ci fai vedere cosa hai scritto, ci ragioniamo … :slight_smile:

va benissimo come codice Emilio perché comunque lo uso insieme agli altri script e non i componenti :+1:

ci provo :sweat_smile:

ps quando avevi detto di calcolare angolo retta e vettore mi stavo adoperando “letteralmente” in tal senso,
mentre col tuo codice mi sfuggiva il funzionamento, hai usato il grafico che si interseca con asse X :+1:

edit: ma questo metodo del grafico che si interseca a differenza di calcolare vet e tan è più preciso?

Piu’ punti calcoli sulla curva, piu’ dovrebbe essere preciso.
Per semplicita’ lo script usa sempre (circa) 1000 punti,
se vuoi puoi ricavare il numero di punti in altri modi …

ma se una curva è più lunga di un’altra, ricavare sempre 1000 punti può diventare poco preciso
si potrebbe usare dividi per lunghezza in modo che si abbia sempre una proporzione uguale

tipo?

:grinning:

1 Mi Piace
import rhinoscriptsyntax as rs

# x = curva - y = punto partenza - z = punti finali

a = z

for e, i in enumerate(a):
    p = (rs.EvaluateCurve( x, i ))
    t = (rs.CurveTangent( x, i ))
    v = rs.VectorAngle(t, rs.VectorCreate(y, p))
    if abs( v - rs.UnitAbsoluteTolerance() ) < 90:
        print e, "Angolo:", v

nel frattempo che metabolizzo meglio il metodo grafico, ho cercato di mettere in pratica il metodo postato,
pare che funziona, unica pecca: e che “if” nell’ultima riga cambiando il segno “- con +” oppure “< con >”
ho notato che solo combinando tra di loro i quattro operatori, mi ritornano tutte le combinazioni possibili.

lo avevo ipotizzato che potesse succedere, a meno di qualche mio errore, come si potrebbe risolvere?

edit:
z = punti finali, sono punti recuperati con lo script di Emilio
quindi i punti in z sono tutti perpendicolari al punto iniziale,
solo che col mio script mi trova un punto in meno, ma
cambiando gli operatori trova solo il punto mancante.

ps comunque c’é qualcosa che non va, ho divisa la curva in n punti, ma il risultato finale riporta tutti i valori

Secondo me il problema e’ che l’angolo teoricamente diventa 90 gradi solo in singoli punti, ma dividendo la curva non e’ detto che si capiti esattamente sul punto teorico.
Possiamo usare una tolleranza, ma anche cosi’ temo si rischi di non trovare niente o di trovare piu’ punti al posto di uno solo.

Nello script ho usato il grafico dell’angolo (veramente del coseno dell’angolo), e cercato i punti in cui il grafico interseca il valore 0.
Ma anche cosi’ non credo che funzioni in tutti i casi … :confused:

2 Mi Piace

addirittura. . . . non credevo che per certe cose non ci fossero soluzioni.

mi sa che è per questo, che alcuni comandi/metodi non vengono realizzati

la McNeel non può creare un qualcosa che dia più problemi che soluzioni

ps però in Rhino, con lo snap “perp” attivo in quel caso funziona :thinking: :thinking:

Decidere se ci sia o meno una soluzione ad un certo problema puo’ dipendere da diverse cose …

Comunque non ho affatto detto questo riguardo al nostro problema.
Dico solo che questo semplice script non e’ certo al livello di un comando vero e proprio.
Quando funziona e’ merito di RhinoCommon … e della fortuna. :grinning_face_with_smiling_eyes:

immaginavo che con Common si avrebbe un qualcosa di più preciso

per la fortuna, e che dire. . . . quella serve sempre ahahahah