2012-04-02 28 views
6

Si alguien puede ayudar con el cálculo del área de una ruta SVG estaría muy agradecido.Cómo calcular el área de una ruta SVG C#

Tengo una función para obtener la longitud total que funciona muy bien.

he visto un método de Javascript que convierte el camino a un polígono:

http://phrogz.net/SVG/convert_path_to_polygon.xhtml

Convirtiendo esto a C# sería una buena ruta ya que tengo una función que obtiene el área de un polígono con una precisión suficiente.

Saludos

Si hay alguna duda en cuanto a lo que se le preguntó aquí ......

Si usted sabe algo sobre el formato de archivo SVG, sabrá que las formas de trazado de SVG se definen por un grupo de coordenadas de esta manera:

d="M195.303,64.357 c6.57-6.684,11.9-15.514,10.057-25.154 c-3.689-19.298-27.854-13.204-27.309-0.549 c-0.545-12.655-23.619-18.749-27.309,0.549    c-1.844,9.651,3.502,18.401,10.082,25.087 c1.697-4.813,5.713-8.03,11.482-9.451 c-2.797,1.531-3.809,4.396-3.809,7.812 c0,4.983,4.58,8.4,9.553,8.4s9.553-3.417,9.553-8.4c0-3.416-1.012-6.28-3.807-7.812C189.584,56.263,193.613,59.52,195.303,64.357 z" 

C y C definen las curvas de Bézier

(hubiera publicado la imagen)

Lo que estoy preguntando es cómo calcular el área para tal forma usando las coordenadas/puntos de la curva.

La solución que utiliza IronPython y la función Inkscape funciona muy bien.

+0

Si ya tiene una rutina de polígono, entonces, presumiblemente, todo lo que necesita es un lector XML para tomar los datos del punto y luego alimentar los puntos en su función. ¿Has comenzado con una rutina así? – halfer

+0

Puedo leer todos los puntos sin problema, los puntos para las rutas en realidad no se traducen directamente en el mismo formato que los polígonos, las rutas pueden tener varios tipos de curvas, etc. – user1296173

+0

Ah, perdón, acabo de ver "polígonos" "¡y se perdió el bit de los" caminos "! Correcto, como lo fue ':)' – halfer

Respuesta

0

No pude resolver las matemáticas yo mismo, así que al final usé IronPython para ejecutar un módulo de Python de Inkscape que mide cualquier tipo de ruta con la precisión suficiente para lo que estoy usando.

Voy a publicar detalles Si alguien está buscando lo mismo, pero es bastante sencillo y no requiere mucha edición de los archivos de Python. Necesita usar .net framework v4.0.

+2

Me encantaría ver detalles de cómo se hace esto. – user568458

+0

cuando tenga algo de tiempo lo agregaré. – user1296173

+2

Esperando los detalles, sería genial usar el mismo método que usaste :) –

7

Vamos a considerar llamar el punto del polígono cerrado (x0, y0) ... (xn, yn), se puede calcular el área por simple bucle a través del punto con la fórmula

area += yi+y(i+1) * (x(i+1)-xi)/2 

Sólo para aclarar con x (i + 1) y y (i + 1) me refiero al siguiente punto en la secuencia. El ciclo debe comenzar desde 0 y detenerse en el vértice n-1 (para que el siguiente punto sea siempre válido) y cuando se alcance el último punto considere ptn-pt0 el área debe tomarse como abs, de lo contrario, puede usar el signo para verificar el polígono es en sentido horario o antihorario. Acabo de agregar un dibujo para explicar cómo funciona, por lo que puede ampliar para manejar diferentes tipos de curvas. Vamos a considerar este dibujo: enter image description here

La idea es calcular el área del polígono verde por suma algebraica del área de cada trapecio individualizado por un borde de un polígono y el eje x, en este caso hay trapecio son:

x0,y0 x1,y1 x1,0 x0,0 
x1,y1 x2,y2 x2,0 x1,0 
(-)x2,y2 x3,y3 x3,0 x2,0 
(-)x3,y3 x4,y4 x4,0 x3,0 
(-)x4,y4 x0,y0 x0,0 x4,0 

primero dos son positivos, los últimos tres son negativos y como puede ver la diferencia es la parte verde, que es el área necesaria. No soy tan bueno dibujando, pero trato de descubrir que el resultado resultante del trapecio superpuesto que funciona de manera aditiva y subtractiva. Incluso si en el dibujo mostré un polígono convexo, el algo funciona también para polígonos cóncavos. En el caso de que un borde no sea un segmento como primera solución, lo que debe hacer es convertirlo en una lista de segmentos utilizando la ecuación paramétrica en la curva y muestreándolo, obtendrá una aproximación decente. Una mejor solución es considerar la función paramétrica del segmento no lineal e integrarlo respecto del eje X (calcular el área entre la curva y el eje X) y sumarlo al sumar el área de los segmentos lineales . Esto implica algunas matemáticas, pero puede encontrar el help you need here. Solo necesitas usar la ecuación de segmento correcta.

+0

Hola Felice, tengo un método muy similar a eso (que obtuve de este sitio, creo ...) Para un área de polígono, son los Caminos que realmente me preocupan. Si puedo convertir una ruta a un polígono, espero poder utilizar el mismo método. – user1296173

+0

@ user1296173 un camino es solo una colección de puntos, exactamente como un polígono. ¿Cuál es el problema con el uso de esos puntos en la función? – Slugart

+0

@ user1296173 puede usar la colección de puntos como dijo Slugart. Si una parte de la ruta son arcos ... puedes aproximarlos con segmentos múltiples, pero hay una mejor manera que tengo que recordar :) –

Cuestiones relacionadas