2012-03-19 21 views
5

Estoy creando algunas formas para aprender y todo parece borroso, como un anti-aliasing, y no estoy usando ningún efecto (todavía no recibo estas lecciones, jajaja).Gráficos JavaFX "borrosos" o antialias? (No se usan efectos)

Por ejemplo, dibujo una línea blanca con un fondo negro con 1 píxel de ancho, pero se pone gris. Si cambio el ancho a 2 píxeles, se pone blanco, pero aún no está realmente definido.

Cuando estaba "googleando" todo lo que encontré fue un método setSmooth(false) en las formas, pero no hace ninguna diferencia. ¿Hay algo que deba cambiar o desactivar en el escenario o la escena que no conozco?

Cualquier ayuda es apreciada. Gracias en consejo ...

Lo siento por mi inglés todavía necesito mejoras también lol ... pero no es mi lenguaje natural.

Respuesta

3

Consulte la documentación Shape:

mayoría de los nodos tienden a tener sólo traducciones enteros aplican a ellos y muy a menudo se definen mediante coordenadas enteras también. Para este caso común, los rellenos de formas con bordes de línea recta tienden a ser nítidos ya que se alinean con las grietas entre los píxeles que caen en las coordenadas del dispositivo entero y por lo tanto tienden a cubrir naturalmente píxeles.

Por otro lado, acariciando esas mismas formas a menudo puede conducir a la difusa contornos debido a que el defecto acariciar atributos especifican tanto que la anchura del trazo por defecto es de 1,0 coordenadas que a menudo se asigna a exactamente 1 pixel del dispositivo y también que el derrame cerebral debe colocarse a horcajadas en el borde de la forma, cayendo la mitad a cada lado del borde. Dado que los bordes en muchas formas comunes tienden a caer directamente en las coordenadas enteras y esas coordenadas enteras a menudo se asignan exactamente a ubicaciones enteras del dispositivo, los bordes tienden a dar como resultado una cobertura del 0% sobre las filas y columnas de píxeles a cada lado del borde de la forma en lugar de una cobertura del 100% en una u otra. Por lo tanto, los rellenos pueden ser típicamente crujientes, pero los trazos a menudo son borrosos.

Dos soluciones comunes para evitar estos contornos borrosos son para un uso más amplio trazos que cubren más píxeles completamente - típicamente una anchura de trazo de 2,0 logrará este si no hay escala transforma en efecto - o para especificar el StrokeType .INSIDE o StrokeType.OUTSIDE estilos de trazo: lo que sesgará la trama de unidad única predeterminada en una de las filas o columnas de píxeles completos dentro o fuera del borde de la forma.

Y véase también la documentación de Node:

a nivel de píxel dispositivo, coordenadas enteras mapa en las esquinas y grietas entre los píxeles y los centros de los píxeles aparecer en los puntos medios entre ubicaciones de píxeles enteros.Dado que todos los valores de coordenadas se especifican con números de coma flotante, las coordenadas pueden indicar precisamente en estas esquinas (cuando los valores de coma flotante tienen valores enteros exactos) o en cualquier ubicación en el píxel. Por ejemplo, una coordenada de (0.5, 0.5) apuntaría al centro de la parte superior izquierda píxel en el escenario. Del mismo modo, un rectángulo en (0, 0) con dimensiones de 10 por 10 abarcaría desde la esquina superior izquierda píxeles superior izquierda en el escenario hasta la esquina inferior derecha del décimo píxel en la 10ª línea de exploración . El centro de píxeles del último píxel dentro de ese rectángulo estaría en las coordenadas (9.5, 9.5).

Así que sus opciones de líneas limpias cuando tiene una anchura de trazo impares son:

  1. Utilice un estilo de trazo StrokeType.INSIDE o StrokeType.OUTSIDE.
  2. Compensa las coordenadas de las formas en 0.5 de un píxel de modo que los trazos se alineen en las líneas en lugar de las grietas entre las líneas.
  3. Simplemente use el siguiente número par como el ancho de trazo, p. 1 => 2, 3 => 4, etc.

cuanto a por qué setSmooth(false) no funciona, no lo sé exactamente, mi conjetura es que el antialiasing se refiere a es independiente de los estilos de antialiasing cabo cuando los trazos se centran en las grietas entre los píxeles, pero no sabría por qué sería eso.

+0

Leo todo lo que pegas, (y ahora estoy un poco avergonzado por googlear pero nunca me acuerdo de mirar javafoc = \), ¡y probé todas las soluciones que propones! 1 - En una línea con 1px de ancho, si configuro INSIDE, ¡la línea desaparece! Con un EXTERIOR, toma un total de 2px de ancho. No es realmente funcional para mis necesidades ... 2 - esto tuvo los resultados perfectos ... Voy con thas ... 3 - esto también funciona, esa fue la solución que encontré antes, pero solo funciona para números pares ... De todos modos, realmente gracias por su respuesta, ha resuelto mi problema en absoluto. Y enséñame una lección: antes de preguntar, ¡lee el javadoc! lol ... –

+0

No se preocupe, es una pregunta razonable y el comportamiento, especialmente en relación con 'setSmooth', es un poco sutil y no particularmente intuitivo. – jewelsea

+0

Edito mi comentario porque presiono Enter para tratar de romper la línea y confirmó la primera parte ... ¡Gracias otra vez! –

Cuestiones relacionadas