2011-08-29 22 views
7

Estoy dibujando una ruta en un CGContext siguiendo un conjunto de puntos recopilados por el usuario. Parece que hay una fluctuación de entrada aleatoria que hace que algunos de los bordes de línea se vean irregulares. Creo que una ligera pluma resolvería este problema. Si estuviera usando OpenGL ES, simplemente aplicaría una pluma al sprite con el que estoy acariciando el camino; Sin embargo, este proyecto requiere que me quede en Quartz/CoreGraphics y parece que no puedo encontrar una solución similar.iOS Quartz/Core Dibujo gráfico trazo emplumado

He intentado dibujar 5 líneas con cada línea un poco más grande y más transparente para aproximar una pluma. Esto produce un mal resultado y ralentiza notablemente el rendimiento.

Este es el código de dibujo de línea:

CGContextMoveToPoint(UIGraphicsGetCurrentContext(),((int)lastPostionDrawing1.x), (((int)lastPostionDrawing1.y))); 
CGContextAddCurveToPoint(UIGraphicsGetCurrentContext(), ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, lastPostionDrawing2.x, lastPostionDrawing2.y; 
[currentPath addCurveToPoint:CGPointMake(lastPostionDrawing2.x-((int)furthestLeft.x)+((int)penSize), lastPostionDrawing2.y controlPoint1:CGPointMake(ctrl1_x, ctrl1_y) controlPoint2:CGPointMake(ctrl2_x, ctrl2_y)]; 
+0

¿Has probado la función CGContextSetShouldAntialias? – Davyd

+0

Tuve problemas similares en el pasado usando curvas cuádruples o curvas con 2 puntos de control. Probablemente podría ayudar si me envía el .svg de lo que quiere dibujar o al menos más información de la pluma que está tratando de dibujar – GianPac

Respuesta

2

Voy a seguir adelante y asumir que su CGContext todavía tiene propiedades anti-aliasing activado, pero si no, entonces esa es la primera obvio pensar que probar , como sugiere el comentario de @Davyd: CGContextSetShouldAntialias es la función de interés.

Suponiendo que ese no es el problema, y ​​la línea está siendo suavizada por el contexto, pero todavía está queriendo algo 'más suave'. Puedo pensar en un par de formas de hacer esto que, con suerte, será más rápido que acariciarlo 5 veces.

En primer lugar, puede intentar obtener la ruta trazada (es decir, una ruta que describe el contorno del trazo de la ruta actual) usando CGContextReplacePathWithStrokedPath puede llenar esta ruta con un degradado (o cualquier otra técnica de relleno da los resultados deseados .) Esto funcionará bien para líneas rectas, pero no será sencillo para trayectorias curvas (ya que el gradiente está llenando el área de la ruta contorneada, y será lineal o radial.)

Otra opción quizás menos obvia , podría ser abusar del dibujo de sombras de CG para este propósito. La función que desea buscar es: CGContextSetShadowWithColor Aquí está el método:

  • Guardar la GSTATE: CGContextSaveGState
  • Obtener el cuadro delimitador de la ruta original
  • copiar la ruta, traduciéndola lejos de sí mismo en un 2,0 * bbox.width usando CGPathCreateCopyByTransformingPath (nota: utilizar la dirección X solamente, de esa manera usted no tiene que preocuparse por saltos en el contexto)
  • Clip el contexto de la Bbox original utilizando CGContextClipToRect
  • Establecer una sombra sobre la contexto wi th CGContextSetShadowWithColor:
    • Desenfoque mínimo (comience con 0.5 y avance desde allí. El parámetro desenfoque no es lineal, e IME es una especie de operación de adivinar y verificar)
    • Un desplazamiento igual a -2.0 * ancho de la caja, y 0.0 altura, escalado al espacio base. (Nota: estos desplazamientos están en el espacio base. Esto será enloquecedor de averiguar, pero suponiendo que no está agregando sus propias transformaciones de escala, el factor de escala será 1.0 o 2.0, por lo que, en términos prácticos, establecerá un offset.width de -2.0 * bbox.width o -4.0 * bbox.width)
    • Un color de su elección.
  • Recorre la ruta traducida.
  • estallar los GSTATE CGContextRestoreGState

Esto debe salir con "sólo" la sombra, que se puede ajustar es de esperar para lograr los resultados que desea.

Dicho todo esto, el rendimiento de dibujo en sombra de CG es, IME, menos que completamente impresionante, y menos que completamente determinista. Esperaría que fuera más rápido que acariciar el camino 5 veces con 5 golpes diferentes, pero no de manera abrumadora.

Todo dependerá de cuánto valga la pena lograr este efecto.

Cuestiones relacionadas