Estoy tratando de trazar las rutas en los gráficos centrales. ¿Alguien ha hecho esto por formas arbitrarias y, de ser así, están dispuestos a compartir el código?Biselando una ruta/forma en Core Graphics
He incluido mi implementación a continuación. Utilizo tres variables para determinar el bisel: CGFloat bevelSize
, UIColor highlightColor
, UIColor shadow
. Tenga en cuenta que el ángulo de la fuente de luz siempre es de 135 grados. No he terminado de implementar esto todavía, pero aquí está esencialmente lo que estoy tratando de hacer, dividido en dos partes. Parte uno, generar puntos focales:
- Encuentro las bisectrices para los ángulos entre cada líneas adyacentes en la ruta.
- Para los arcos, la bisectriz es la línea perpendicular a la línea creada por los dos extremos del arco, que se origina en el punto medio. Esto debería ocuparse de la mayoría de las situaciones en las que se usa un arco. No tomo la bisectriz de un arco y una línea. La bisectriz de arco debería funcionar bien en esos casos.
- Luego calculo puntos focales basados en la intersección de cada bisectriz adyacente.
- Si un punto focal tiene la forma que se usa, de lo contrario, se descarta.
El propósito de generar los puntos focales es 'encoger' la forma proporcionalmente.
La segunda parte es un poco más complicada. Es esencial crear cada lado/segmento de la forma biselada. Hago esto dibujando 'in' (por el bevelSize
) cada punto de la forma original a lo largo del radio de la línea que se extiende desde el punto focal más cercano al punto en cuestión. Cuando tengo dos 'bevelPoints' consecutivos, creo un UIBezierPath que se extiende desde los bevelpoints hasta los puntos originales y de vuelta a los bevelpoints (nota, esto incluye arcos). Esto crea un 'lado/segmento' que puedo usar para llenar. En los lados rectos, simplemente relleno con la sombra o el color de resaltado, dependiendo del ángulo del lado. Para los arcos, determino el 'arco' de radianes. Si ese arco contiene un ángulo de transición (M_PI_4 o M_PI + M_PI_4) lo llené con un degradado (de sombra a resaltar o resaltar a sombrear, lo que sea apropiado). De lo contrario, lo llené con un color sólido.
actualización
he dividido mi respuesta (véase más adelante) en un post aparte. Ya no uso los detalles de implementación que ves arriba, pero los guardo para referencia. Espero que esto ayude a cualquier otra persona que quiera utilizar Core Graphics.
La pregunta es larga e incluye muchos detalles. ¿Puedes simplificarlo? –
tipo de. La primera parte de la pregunta es la pregunta principal: ¿Alguien sabe cómo biselar una forma arbitraria en core-graphics? El resto solo detalla cómo implementé el biselado (que ya he terminado). Funciona bien en bastantes formas (pero no en todas). Dejaré la pregunta abierta en caso de que alguien tenga un método. –
Consideré publicar mi solución, pero eso son solo unas 400 líneas de código ... parece mucho para publicar. –