2016-03-18 12 views
6

Sto lavorando a un'applicazione per modellare alcune geometrie 2D specifiche del problema. E naturalmente mi piacerebbe disegnare quella geometria sullo schermo affinché l'utente la possa effettivamente vedere.Come estendere la classe Shape JavaFX per implementare forme personalizzate

JavaFX ha alcune forme 2D come rettangoli, ellissi, ecc. Ha anche curve cubiche e quartiche, implementate come curve di Bezier. La ricerca di forme personalizzate non è stata d'aiuto, poiché tutto ciò che ho trovato sono esempi di come prendere alcuni elementi di forma come percorsi e metterli insieme per disegnare una forma personalizzata, come un cuore o un diamante. La ricerca di informazioni su come implementare una nuova forma estendendo la classe Shape era ancora meno utile.

Quello che voglio disegnare sono curve B-Spline di ordine e lunghezza arbitrari. So come calcolare e implementare le Spline, ma non so come implementarle come una nuova forma o un wrapper di forme.

Ho esaminato il codice sorgente di JavaFX e del documentario. Sembra che quelle forme siano una sorta di classi wrapper stesse. Per esempio. la classe Ellipse contiene un'ellisse come membro, che fa parte del pacchetto geometry. Questa ricorsione va piuttosto lontano.

Ora deve esserci un tipo di metodo utilizzato da JavaFX per disegnare effettivamente la curva, ma non ho potuto trovarlo.

Quindi, come estendere una forma JavaFX per creare, ad es. una classe Spline? Quali metodi/classi sono la chiave per disegnarla da Java?

Spero che qualcuno possa aiutarmi.

Cordiali saluti Thorsten

+0

Puoi spiegare in maggior dettaglio perché [Percorso] (http://docs.oracle.com/javase/8/javafx/api/javafx/scene/shape/Path.html) (che estende Shape) non è sufficiente ? – VGR

+1

Non penso che sarà possibile estendere direttamente Shape e ottenere il rendering della forma estesa senza fare affidamento sulle API contrassegnate come segue: "@deprecated Questa è un'API interna che non è stata progettata per l'uso e verrà rimossa nella prossima versione". – jewelsea

+0

@VGR Con Path vorrei semplicemente combinare diverse forme in una. Questo mi limita alle classi di forma standard. Pertanto, ad esempio, ho potuto disegnare solo le curve fino al quarto grado. Per tutto ciò che non ha una classe di pre-costruzione, dovrei creare quella curva con le classi di forma di pre-costruzione e mettere insieme curve e segmenti di linea per creare e approssimazione. –

risposta

0

mi piacerebbe prendere un'occhiata a come JSilhoutte ha implementato le loro forme.

Cross per esempio, non si estende Shape, ma genera un Shape rappresenta una croce creando due rettangoli e combinarli usando Shape.union. Qui è il metodo in questione:

@Override 
protected void calculateShape() { 
     double cx = getCenterX(); 
     double cy = getCenterY(); 
     double r = getRadius(); 
     double n = validateRoundness(getRoundness()); 
     double w = validateWidth(getWidth(), r); 

     double arcWH = w * n; 
     Rectangle beam1 = new Rectangle(cx - r, cy - (w/2), r * 2, w); 
     Rectangle beam2 = new Rectangle(cx - (w/2), cy - r, w, r * 2); 
     beam1.setArcWidth(arcWH); 
     beam1.setArcHeight(arcWH); 
     beam2.setArcWidth(arcWH); 
     beam2.setArcHeight(arcWH); 
     Shape shape = Shape.union(beam1, beam2); 

     shape.getStyleClass().addAll("silhouette", "silhoutte-cross"); 

     setShape(shape); 
} 

Così si potrebbe utilizzare Shape.union di combinare insieme diversi CubicCurve/QuadCurve forme per creare le curve B-spline di ordine arbitrario e lunghezza.

Problemi correlati