¿Qué quiero hacer?Calcular nuevas posiciones de degradado después de que el polígono rellena cambia las dimensiones
actualizaciones a esta pregunta: 7/10/2012 - "gradientTransform no del todo" Inspirado por Duopixel 7/11/2012 - "Código SVG del ejemplo" 7/16/2012 - "@dignifiedquire asumir esta problema "
Estoy tratando de crear una herramienta que permita al usuario cambiar el tamaño de polígonos de forma dinámica. La mayoría de los polígonos están rellenos con gradientes fill="url(#top_surface_1_gradient)"
. A mi modo de hacerlo es un simple script de JavaScript que:
- busca a mousemove & eventos de clic sobre un determinado polígono
- mide la cantidad de movimiento
- cambios de la mitad de las coordenadas del polígono (en para tener el efecto de estiramiento) el uso de este algoritmo para definir nuevas coordenadas:
x = x_movement
,y = x_movement * Math.tan(31 * (Math.PI/180))
- polígonos que están llenos de un solo color están bien
- polígonos que están llenos con un gradiente son n OT, déjame demostrar:
visualmente
Así que este es el primer paso, sin estiramiento que se ha hecho por parte del usuario.
Aquí es donde ocurre el problema. Como no sé cómo debo cambiar las coordenadas x1, y1
y x2, y2
para el degradado, simplemente permanece colgado en su posición anterior mientras el polígono se ha estirado. El resultado es una forma que no puede mantener la ilusión de profundidad.
El resultado final estoy buscando. Y sin olvidar que el gradiente podría tener un ángulo completamente aleatorio desde el principio. En este resultado final, que estoy buscando, se han cambiado las coordenadas x1, y1
y x2, y2
del degradado. ¿Qué algoritmo se debe usar para calcular estas posiciones? Estoy buscando una solución que sea completamente ciega al ángulo del gradiente.
a continuación es el SVG con todas las coordenadas apropiadas que se utilizó para generar estos ejemplos:
Uso de código SVG
Paso 1:
<!-- Step 1 -->
<linearGradient id="top_surface_1_gradient" gradientUnits="userSpaceOnUse" x1="165.3425" y1="39.7002" x2="-49.991" y2="43.0337">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.6687" style="stop-color:#CCCCCC"/>
<stop offset="1" style="stop-color:#FFFFFF"/>
</linearGradient>
<polygon id="top_surface_1" fill="url(#top_surface_1_gradient)" points="137.145,41.204 68.572,0 0,41.204 68.572,82.396"/>
Paso 2
<!-- Step 2 -->
<linearGradient id="top_surface_2_gradient" gradientUnits="userSpaceOnUse" x1="250.0491" y1="233.8115" x2="23.7637" y2="237.3146">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.6687" style="stop-color:#CCCCCC"/>
<stop offset="1" style="stop-color:#FFFFFF"/>
</linearGradient>
<polygon id="top_surface_2" fill="url(#top_surface_2_gradient)" points="205.788,215.557 137.215,174.354 0.078,256.629 68.649,297.823"/>
Paso 3
<!-- Step 3 -->
<linearGradient id="top_surface_3_gradient" gradientUnits="userSpaceOnUse" x1="248.4543" y1="454.5225" x2="-75.535" y2="459.5381">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.6687" style="stop-color:#CCCCCC"/>
<stop offset="1" style="stop-color:#FFFFFF"/>
</linearGradient>
<polygon id="top_surface_3" fill="url(#top_surface_3_gradient)" points="205.788,415.557 137.215,374.354 0.078,456.629 68.649,497.823"/>
He pasado innumerables horas desarrollando soluciones para este problema y simplemente no podía entenderlo. Cualquier ayuda sería muy apreciada.
Actualización: gradientTransform no del todo
Usando el atributo gradientTransform y sin x1, y1; Las coordenadas x2, y2 para el gradiente, logramos resultados que llenan el polígono de una manera casi igual a la necesaria (esta solución se puede encontrar aquí: http://jsfiddle.net/hqXx2/). El único lugar donde se rompe la solución es cuando el polígono se llena con un degradado que comienza fuera del polígono y/o termina en algún lugar fuera/dentro. Déjenme ilustrar:
Esto es lo que se logra con la solución que Duopixel sugiere.
Este es el caso de uso que es imposible de lograr con la solución mencionada anteriormente. Cambié el color para amplificar visiblemente el ángulo y el gradiente.
Código SVG del ejemplo
Aquí está el código para el grupo más grande, correctamente ampliada de polígonos:
<g>
<linearGradient id="surface_center_inside_bottom_1_" gradientUnits="userSpaceOnUse" x1="167.7629" y1="634.5986" x2="-72.9039" y2="599.2647">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.8528" style="stop-color:#CCCCCC"/>
<stop offset="0.9954" style="stop-color:#CCCCCC"/>
</linearGradient>
<polygon id="surface_center_inside_bottom_9_" fill="url(#surface_center_inside_bottom_1_)" points="137.145,620.04 68.572,578.837 0,620.04 68.572,661.233"/>
<linearGradient id="surface_right_inside_side_1_" gradientUnits="userSpaceOnUse" x1="178.8889" y1="600.1787" x2="33.103" y2="517.9229">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.9816" style="stop-color:#A3A5A8"/>
</linearGradient>
<polygon id="surface_right_inside_side_3_" fill="url(#surface_right_inside_side_1_)" points="136.526,620.374 68.359,578.501 68.572,493.837 137.358,535.37"/>
<linearGradient id="surface_right_inside_side_2_" gradientUnits="userSpaceOnUse" x1="126.2664" y1="563.249" x2="-28.4" y2="621.916">
<stop offset="0" style="stop-color:#FF0000"/>
<stop offset="0.6698" style="stop-color:#00FFFF"/>
<stop offset="1" style="stop-color:#FF0000"/>
</linearGradient>
<polygon id="surface_right_inside_side_5_" fill="url(#surface_right_inside_side_2_)" points="68.573,661.239 0,620.036 0,535.036 68.573,576.231"/>
<linearGradient id="surface_center_outside_top_1_" gradientUnits="userSpaceOnUse" x1="167.3728" y1="533.5059" x2="-47.9608" y2="536.8394">
<stop offset="0.0016" style="stop-color:#FF0000"/>
<stop offset="0.6735" style="stop-color:#00FFFF"/>
<stop offset="1" style="stop-color:#FF0000"/>
</linearGradient>
<polygon id="surface_center_outside_top_3_" fill="url(#surface_center_outside_top_1_)" points="137.145,535.041 68.572,493.837 0,535.041 68.572,576.233"/>
</g>
Y aquí está el código SVG para el más pequeño, lo que necesito para expandir:
<g>
<linearGradient id="surface_right_inside_side_4_" gradientUnits="userSpaceOnUse" x1="273.4377" y1="319.251" x2="78.0696" y2="209.0197">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.9816" style="stop-color:#A3A5A8"/>
</linearGradient>
<polygon id="surface_right_inside_side_9_" fill="url(#surface_right_inside_side_4_)" points="205.112,366.797 136.945,324.924 137.157,156.261 205.731,197.464"/>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="247.2952" y1="408.1992" x2="-103.1108" y2="356.7538">
<stop offset="0" style="stop-color:#FFFFFF"/>
<stop offset="0.8528" style="stop-color:#CCCCCC"/>
<stop offset="0.9954" style="stop-color:#CCCCCC"/>
</linearGradient>
<polygon fill="url(#SVGID_1_)" points="205.731,366.465 137.157,325.262 0.021,407.536 68.592,448.729"/>
<linearGradient id="surface_right_inside_side_7_" gradientUnits="userSpaceOnUse" x1="160.3313" y1="296.623" x2="-52.0119" y2="377.1676">
<stop offset="0" style="stop-color:#FF0000"/>
<stop offset="0.6698" style="stop-color:#00FFFF"/>
<stop offset="1" style="stop-color:#FF0000"/>
</linearGradient>
<polygon id="surface_right_inside_side_6_" fill="url(#surface_right_inside_side_7_)" points="68.532,448.767 0,407.497 0.021,238.536 68.592,279.729"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="248.4749" y1="215.7417" x2="-75.5139" y2="220.7572">
<stop offset="0.0016" style="stop-color:#FF0000"/>
<stop offset="0.6735" style="stop-color:#00FFFF"/>
<stop offset="1" style="stop-color:#FF0000"/>
</linearGradient>
<polygon fill="url(#SVGID_2_)" points="205.731,197.464 137.157,156.261 68.592,197.333 0.021,238.536 68.592,279.729"/>
</g>
@dignifiedquire asumir este problema
he implementado @dignifiedquire sugirió algo en un sitio de prueba: Here's the test link. Hice la conversión absoluta a relativa por mi cuenta y solo muestra el mismo resultado que normalmente tendría al agregar los mismos valores de cambio xey del polígono al gradiente xey. Ese es el problema principal: ¿cómo traducir esos valores en tal valor, que transforman el gradiente como en mis ejemplos anteriores?
Se necesita más ayuda.
Parece un problema espinoso. Sin embargo, tengo curiosidad por saber cómo entra PHP en la mezcla, ya que no veo ningún código PHP en absoluto, y solo algunas breves menciones de javascript. ¿Podrías ampliar esto? – GordonM
Seguramente es complicado. Bueno, estoy codificando una solución dinámica (JS) y una de servidor (PHP). Como conozco y uso PHP para ese trabajo, lo elegí para esta pregunta. El mismo algoritmo se puede calcular utilizando JS y PHP. Así que imagina que almacenaré una cierta configuración en un DB, digamos 'new_width' = 'x + 100'. Necesitaré PHP para volver a dibujar el polígono utilizando el mismo algo una vez que el usuario vuelva a cargar la página o envíe un enlace a alguien. Espero que aclare un poco las cosas. –
Un poco fuera de tema, pero si usa dos idiomas y uno de ellos admite hablar con un servidor y el otro admite ejecutarlo en un servidor, entonces tal vez pueda reducir la cantidad de trabajo que necesita realizar implementando solo el algoritmo en el lado del servidor y obtener resultados desde el lado del cliente con AJAX? – GordonM