2012-04-24 6 views
10

Tengo un problema genial. Estoy tratando de resaltar exactamente el 50% de la masa de este pavo. En la práctica, no será del 50%, pero si puedo obtener el 50%, puedo descifrar el resto.¿Cómo esculpir la mitad de un Día de Acción de Gracias de Turquía?

Mi idea actual es esta: Escanee cada píxel para conocer la masa del pavo, en píxeles. Luego, cuando quiera el 50% del pavo, resalte los píxeles de izquierda a derecha hasta que haya resaltado el 50% de los píxeles.

¿Alguien tiene alguna idea mejor? Esta es la idea de fuerza bruta más lenta que requiere pasar por encima de cada píxel para contar los píxeles y nuevamente para resaltar el 50% de ellos.

Tenga en cuenta que dividir la imagen verticalmente no dejaría el 50% del pavo, ya que el cuerpo del pavo es mucho más carnoso que su cuello.

This is a Turkey

+1

Quien haya votado para cerrar esto ... Este es un problema grave. Intento hacer una infografía que coloree un pavo en función de algunos porcentajes. – DanRedux

+2

@DanRedux: Pero en su estado actual, no es un problema de programación. Solo preguntas sobre métodos; * cómo * harías por hacer esto. Es más sobre el tema para los programadores. – animuson

+0

¿Estás seguro de que deseas resaltar el 50% de los píxeles en lugar del 50% de alguna medida lineal? No creo que las personas sean buenas juzgando volumen o área mirando formas complejas. –

Respuesta

3

Usted dice que el porcentaje va a cambiar, pero voy a ir a un miembro aquí y asumir el pavo en sí no lo hará.

Por lo tanto, no es necesario realizar un bucle dos veces. Solo necesita hacerlo una vez, mapee los datos en alguna estructura a la que pueda hacer referencia, y luego solo refiérase a ella cada vez que necesite resaltar para saber qué tan lejos necesita ir.

Por ejemplo, crea un array asociativo de <percentage of mass (integer out of a hundred) => vertical column number (int)>

De esta manera, cuando se necesita sombra x ciento, sólo se necesita un bucle sobre cached_data [percent_to_highlight] columnas de píxeles, el sombreado a todos ellos, y luego romper del ciclo completamente una vez que lo alcanzas.


Para obtener aún más rendimiento, tenga dos imágenes, una totalmente sombreada y la más normal. La matriz asociativa debe mapear percentage => byte_offset

Para cada imagen que desee generar, simplemente memcpy o el equivalente de PHP de una copia rápida, a distancia de 0 -> byte_offset de la imagen sombreada sobre la no sombreada y guardar. No más bucle. No puedes ir más rápido que esto.

+0

En realidad, esto es lo que ya estoy haciendo ...Debería haber especificado, pero sí, si estuviera haciendo mi método, lo convertiría en una secuencia de píxeles y transmitiría un cierto porcentaje de ellos. – DanRedux

+0

Si está haciendo exactamente lo que publique ... ¿cómo puede obtener un mejor rendimiento que O (N/x) donde x es el inverso de la cantidad que necesita sombreada? –

+0

Posiblemente usando algún tipo de árbol/matriz de píxeles que puedo resaltar ... Como, si pido un 10%, seguramente podría tomar algunos atajos en lugar de recorrer el 10% de los píxeles y dibujarlos ... I Estoy pensando en cualquier otro formato que lo haría menos que O (n/x) .. – DanRedux

0

El problema no parece tener un algoritmo inteligente por encima de mi cabeza para hacerlo. Pero tampoco soy un experto en CG, así que podría estar equivocado al respecto.

Y tratar de buscar tal solución puede muy bien aumentar la complejidad del tiempo (que O (n)) si termina utilizando ciclos anidados en n, donde n es el número total de píxeles utilizados por el pavo.

En cambio, hacer las dos pasadas es muy fácil de implementar (muy poco tiempo/esfuerzo de implementar) y también será O (n) descuidando la constante 2, que no es una mala solución. Dependiendo de para qué propósito, hardware, espacio restringido, etc. está escribiendo esta solución para; ir por el camino de dos vías podría ser más gratificante.

Cuestiones relacionadas