2017-07-25 4 views
2

J'essaie d'écrire un programme qui place les données USB entrantes sur un graphique linéaire. La façon dont j'ai fait cela est en dessinant sur la toile un tas de lignes droites reliant tous les points de données. Le problème est que la ligne résultante est pas lisse, comme vous pouvez le voir ci-dessous:Comment dessiner une courbe composée de plusieurs segments de ligne d'une manière non dentelée

Jagged Line

J'ai essayé en utilisant la méthode lineTo(x, y) de contexte graphique mais juste fait qu'empirer les choses. J'ai également essayé de changer les paramètres Line Cap et Line Join mais cela n'a pas beaucoup aidé.

Existe-t-il une meilleure façon de jouer à "Connecter les points" avec JavaFX Graphics Context? Peut-être avec des courbes bezier? S'il y a, alors s'il vous plaît faites le moi savoir.

+0

Avez-vous envisagé d'utiliser le LineChart intégré? https://docs.oracle.com/javafx/2/api/javafx/scene/chart/LineChart.html – Eric

+0

Je ne pense pas que Canvas inclut un support natif pour les lignes anti-crénelage (voir la question en double). L'anti-crénelage est pris en charge si vous dessinez les lignes sur un graphe de scène au lieu d'un canevas, alors vous pouvez peut-être essayer cela. – jewelsea

+0

Hmm, cette [question similaire] (https://stackoverflow.com/questions/34148521/how-to-apply-antialiasing-to-javafx-methods-like-graphicscontext-fillarc) indique en fait que l'antialiasing se produit lors de la mise en forme primitives telles que des lignes à une toile. – jewelsea

Répondre

1

Je fini par aller avec la solution la plus simple au problème, qui est juste d'utiliser un effet de BoxBlur:

BoxBlur blur = new BoxBlur(); 
blur.setWidth(2); 
blur.setHeight(2); 
blur.setIterations(1); 

gc.setEffect(blur); 

... 

//Don't forget to remove the effect before clearing 
gc.setEffect(null); 
gc.clearRect(0, 0, width, height); 

Ce n'est pas une solution exacte, mais il fonctionne très bien pour mes besoins.