2012-05-03 30 views
6

Necesito encontrar los límites xey visibles de un objeto que se ha recortado, de modo que pueda colocar otros objetos a su alrededor. Sin embargo, el spec indica que getBBox no tiene en cuenta las rutas de clip, por lo que no puedo usar el cuadro delimitador. ¿Alguna idea de cómo puedo encontrar los límites de visualización para un objeto recortado?Obtener un cuadro delimitador de "visualización" para un objeto recortado

Respuesta

7

Crea un elemento <use> oculto que hace referencia a la ruta en clipPath y obtiene el cuadro delimitador de eso. Entonces solo quieres la intersección del cuadro delimitador de tu objeto y el objeto de uso.

<defs> 
    <clipPath id="clipPath"> 
    <path id="path" ...> 
    </clipPath> 
</defs> 

<use id="clipPathBounds" visibility="hidden" xlink:href="#path"/> 
+0

Tenía la esperanza de encontrar algo más lateral que esto; calcular una intersección es, en general, difícil. Encontré un intercambio largo en la lista de SVG sobre esto hace un par de días, pero desafortunadamente no puedo encontrarlo en este momento. – EML

+0

Calcular la intersección de dos rectángulos es fácil. result.x = max (x, aRect.x); result.y = max (y, aRect.y); result.width = min (XMost(), aRect.XMost()) - result.x; result.height = min (YMost(), aRect.YMost()) - result.y; si (result.width <0 || result.height <0) { no se cortan en toda } Dónde XMost() = + rect.x rect.height etc –

+0

Es cierto, pero un camino clip se puede completamente general. Intenta calcular la intersección de un Bezier arbitrario con cualquier otra cosa. Incluso si solo quieres un resultado rectangular, como yo lo hago, entonces no es trivial. Tiene que ser hecho por el renderizador en general, para clasificar los detalles de nivel de píxel, pero SVG no parece definir ninguna forma de hacerlo. – EML

Cuestiones relacionadas