Da Grafico curvatura a curva

Buongiorno a tutti.
Sono un perfetto autodidatta e scusatemi se sto per dire delle castronerie…
La mia esperienza mi porta ad affermare che un buon lavoro di superfici lo si svolge partendo da un ottimo set di curve.
Un ottimo set di curve non può prescindere dalla valutazione dei relativi grafici di curvatura.
Nella modellazione free-form, sarebbe utilissimo avere un qualcosa che forzi la curvatura. Ad esempio impedendo che quest’ultima cambi di segno sia nella fase di costruzione delle curve che nella fase di editing. Una volta che la curvatura comincia a risultare soddisfacente, sarebbe utilissimo disporre di qualche comando che partendo da un profilo di curvatura assegnato (disegnato a parte), in una fissata scala, ne generi la curva corrispondente.
Esiste un metodo?

Saluti

Rino

non vorrei dire stupidaggini ma credo che gli udt di rhino fanno quello che chiedi.
Ma se vai a modificare la tua curvatura soddisfacente con un profilo di curvatura assegnato non cambi completamente la tua curva?
Forse non capisco bene cosa chiedi.

Allora sicuramente non ho compreso come si fa a disegnare una spline per punti di controllo o per interpolazione di punti ed imporre che la curvatura non cambi di mai segno, oppure quando si ricostruisce una curva, semplificandola e variandone il grado, essere sicuri che non risultino zone con variazioni di segno, nonostante la curva di partenza non presenti variazioni di segno.

Per la seconda domanda, io verifico che a micro spostamenti dei punti di controllo di una curva, corrispondono macrovariazioni della curvatura. Nel freeform le microvariazioni dei punti di controllo spesso risultano non significative, mentre una variazione del segno della curvatura cambia totalmente le cose soprattutto nella fase di shading.

Saluti

Ecco un amico!!!

Bravo -anzi- bravissimo!!!
I concetti che esprimi sono assolutamente condivisibili e spesso sottovalutati. Buone curve sono la base di tutta la baracca.
Detto questo non mi è chiaro come dovrebbe funzionare lo strumento…
Se ho capito si sarebbe un metodo ma non è detto che in base alla forma non ci siano flessi: dati due riferimenti costruire connettendo con curve di blend. Con questo sistema avendo il movimento dei punti di controllo solo in direzioni che non compromettano la continuità.

Da grafico di curvatura a curva la vedo dura…assai…
Intanto dovresti azzeccare quale fattore di scala ha generato quel grafico e già qui mi arrendo…
ma poi nel caso di curve deg3 a più span hai un punto angoloso a ogni span del grafico… quindi non una curva singola ma un join di curve…

Comunque bravo: ottime problematiche.

Non capisco, a me non succede questo, se sposto un punto di controllo ho variazioni in proporzione al movimento del punto

Anche qui a me non succede questo, se faccio una microvariazione del punto di controllo non va a cambiare il segno della curvatura. Per cambiare il segno della curvatura devo fare un macrovariazione,a meno che non stiamo parlando di una curva quasi retta, ma anche in questo caso è logico che cambi segno se porto il punto di controllo dalla parte opposta della curva.

curvatura diagrammi.3dm (25,8 KB)

Ciao Giuseppe

Ho caricato un piccolo file di esempio. 2 curve (rossa e ciano) che presentano una deviazione di soli 0,26mm. I relativi diagrammi delle curvature sono significativamente diversi. Una presenta curvatura sempre positiva, l’altra molti flessi…

La scala del diagramma va tenuta a 125.

Quando ho generato la curva, un comando che avrebbe impedito alla curvatura di cambiare segno sarebbe stato molto utile.

Ho disegnato anche una curva (grigia) che rappresenta più o meno il diagramma nella stessa scala della curva rossa… L’obiettivo, al meno nel caso di curve piane, sarebbe quello di generare la curva rossa a partire dalla grigia( diagramma curvatura della curva ricercata). Ad ampie variazioni del diagramma della curvatura, corrisponderebbero comunque piccole variazioni della curva ricercata e questa è una grande cosa… da poter utilizzare a proprio vantaggio,

In molte applicazioni è sufficiente che la curvatura non cambi segno.

Saluti

Rino

Nella applicazioni con curve freeform, sono tantissimi i casi in cui le curve sembrano essere quasi rette… e non ci si può permettere variazioni del segno della curvatura. Molto spesso ad esempio nelle applicazioni di Reverse

Saluti

Rino

Il free-form non e’ il mio campo, pero’ …
L’idea di Rino la trovo molto interessante :slight_smile:

… se non altro per giocarci un po’ :slight_smile:

Ho buttato giu’ un mezzo script che, dato il poco tempo, tanto per provare si limita a prendere l’elenco dei raggi di curvatura da una lista inserita nello script stesso ( sorry … :blush: )

Gli si da’ la lunghezza degli archi approssimanti ( con L=~50 si capisce qualcosa … ) e lui disegna la sequenza di archi.
E’ solo una prova … volendo si puo’ poi provare ad usare gli archi o i loro punti medi per costruire una curva con metodi vari.
… Curva che credo alla fine avra’ comunque parecchi CV … ahi ahi ahi … ma questo problema lo lascio a voi esperti. :smile:

A me da’ l’idea che la cosa sarebbe adatta a GH ( o viceversa, va beh … ), No ? :slight_smile:

Certo, come dici giustamente, disegnare direttamente la curva pare arduo.
Pero’ forse per imbastire delle curve-test o curve-guida potrebbe essere utile … mah.

Qui c’e’ lo script

import math
import rhinoscriptsyntax as rs
import Rhino

def planefromxz( pnt, xax, zax ):
  yax = rs.VectorRotate( xax, 90, zax )
  return rs.PlaneFromFrame( pnt, xax, yax )

def planefromyz( pnt, yax, zax ):
  xax = rs.VectorRotate( zax, 90, yax )
  return rs.PlaneFromFrame( pnt, xax, yax )

def dracrvax( cur, leng ):
  pt = rs.CurveMidPoint( cur )
  uu = rs.CurveClosestPoint( cur, pt )
  mip = rs.EvaluateCurve( cur, uu )
  tan = rs.CurveTangent( cur, uu )
  vec = rs.VectorRotate( tan, 90, [ 0, 0, 1 ] )
  p0 = mip - ( vec * ( leng / 2.0 ) )
  p1 = mip + ( vec * ( leng / 2.0 ) )
  gid = rs.AddLine( p0, p1 )

def draarc( pnt, tan, rad, leng ):
  sik = cmp( rad, 0 )
  rad = abs( rad )
  rads = leng / rad
  degs = math.degrees( rads )
  tan2 = rs.VectorRotate( tan, degs, [ 0, 0, 1 ] )
  len2 = rad * math.tan( rads / 2.0 )
  pnt2 = pnt + ( tan * len2 )
  pnt3 = pnt2 + ( tan2 * len2 )
  toc = rs.VectorRotate( tan, -90 * sik, [ 0, 0, 1 ] )
  cen = pnt + ( toc * rad )
  pla = planefromyz( cen, tan, [ 0, 0, -1 * sik ] )
  gid = rs.AddArc( pla, rad, degs )
  return gid

def dranexarc( arc, rad, leng ):
  u0, u1 = rs.CurveDomain( arc )
  p1 = rs.CurveEndPoint( arc )
  t1 = rs.CurveTangent( arc, u1 )
  return draarc( p1, t1, rad, leng )

def draprearc( arc, rad, leng ):
  u0, u1 = rs.CurveDomain( arc )
  p0 = rs.CurveStartPoint( arc )
  t0 = rs.CurveTangent( arc, u0 )
  return draarc( p0, -t0, -rad, leng )

def dranexarcbak( arc, rad, leng ):
  u0, u1 = rs.CurveDomain( arc )
  p1 = rs.CurveEndPoint( arc )
  t1 = rs.CurveTangent( arc, u1 )
  return draarc( p1, -t1, rad, leng )

def draprearcbak( arc, rad, leng ):
  u0, u1 = rs.CurveDomain( arc )
  p0 = rs.CurveStartPoint( arc )
  t0 = rs.CurveTangent( arc, u0 )
  return draarc( p0, t0, -rad, leng )

def main():
  col = [ [ 31, 31, 255 ], [ 31, 255, 31 ] ]
  le = rs.GetReal( 'Length ?' )
  ras = [ 100, 90, 80, 75, 80, 90, 100 ]
  arc = draarc( Rhino.Geometry.Point3d.Origin,
      Rhino.Geometry.Vector3d( 0, -1, 0 ),
      -ras[ 0 ], le / 2.0 )
  noarc = arc
  cnt = 0
  arc = dranexarcbak( arc, ras[ 0 ], le )
  rs.ObjectColor( arc, col[ cnt % 2 ] )
  rs.AddPoint( rs.CurveMidPoint( arc ) )
  dracrvax( arc, le / 2.0 )
  for ra in ras[ 1 : ]:
    cnt += 1
    arc = dranexarc( arc, ra, le )
    rs.ObjectColor( arc, col[ cnt % 2 ] )
    rs.AddPoint( rs.CurveMidPoint( arc ) )
  dracrvax( arc, le / 2.0 )
  rs.DeleteObject( noarc )

main()

Ciao ragazzi !

Bravo!
È già qualcosa.

Saluti
Rino

Beh … non sono sicuro, ma forse se il control polygon non cambia ‘curvatura’, non lo fa neanche la curva.
Viglio dire, se il control polygon non va a zig zag ma curva sempre dalla stessa parte, questo potrebbe riflettersi anche sulla cuvra.

Mi sembra che la proprieta’ 7 in questa pagina
http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-curve-prop.html
dica questo.

Ma, come dicevo, non ne sono sicuro.
Giuseppe, puoi avvallare o stroncare questa ‘congettura’ ? :grinning:

scusate se semplifico:
In Rhino abbiamo già il comando Curvature che segnala minimi massimi e flessi. Si tratterebbe di renderlo dinamico mentre si disegna o mi dimentico qualcosa?

Per me basterebbe aggiungere al comando SoftEditCurve il grafico della curvatura dinamico.
Vittorio

Mi sembrano due buone proposte

Saluti

Rino

Ma qualcuno di voi condivide la necessità della mia richiesta?

Saluti
Rino

Sinceramente no
Vittorio

Sinceramente nemmeno io ma questo non vuol dire.
Ci sono diversi modi di disegnare curve e di controllarle. Per quanto mi riguarda non ho mai l’esigenza che sia perfetta appena metto giù i punti. Anzi a seconda dei casi li butto giù rapidamente e poi elimino quelli che non servono e con il grafico di curvatura sempre attivo modifico. Ma questo è il mio sistema.