2011-11-11 16 views
6

Sto cercando di capire se un punto si trova in un percorso SVG utilizzando Python.
L'algoritmo che utilizzerò è raycasting algorithm.Converti percorso in poligono

Ma per questo algoritmo ho bisogno di avere i lati del poligono, ma tutto quello che ho è il la pathdata per il percorso SVG:

<path 
    d="m 362.26878,978.51017 c 20.15947,-20.15479 23.0826,-25.35876 
     20.51836,-36.58367 -5.62899,-24.66928 -8.85902,-84.94939 
     -4.6845,-87.51832 2.29504,-1.43086 25.27371,2.13445 51.0669,7.87678 
     39.48315,8.80707 50.0611,13.213 66.91495,27.88988 11.39966,9.91685 
     25.01402,17.41113 31.62525,17.41113 12.91547,0 24.69288,-11.04544 
     19.95645,-18.71919 -1.68587,-2.73893 4.50508,-38.63785 13.76077,-79.78795 
     12.41964,-55.21781 16.82552,-85.81829 16.82552,-116.84379 0,-23.12039 … z" /> 

che corrisponde a questa immagine:

SVG Path example

Quindi, c'è un modo per ottenere i lati di un percorso?

risposta

4

È possibile convertire un tracciato in un poligono come mostrato nel mio esempio qui:
http://phrogz.net/svg/convert_path_to_polygon.xhtml

Il semplice algoritmo da quella pagina (in JavaScript) è:

function polygonSampledFromPath(path,samples){ 
    var doc = path.ownerDocument; 
    var poly = doc.createElementNS('http://www.w3.org/2000/svg','polygon'); 

    var points = []; 
    var len = path.getTotalLength(); 
    var step = step=len/samples; 
    for (var i=0;i<=len;i+=step){ 
    var p = path.getPointAtLength(i); 
    points.push(p.x+','+p.y); 
    } 
    poly.setAttribute('points',points.join(' ')); 
    return poly; 
} 

Invece di campionamento basato su un certo numero di punti, potresti semplicemente campionare ad una distanza particolare.

Ciò presuppone che il binding Python abbia accesso all'intero SVGPathElement DOM Interface.

+0

sfortunatamente il mio binding Python non ha accesso a SVGPathElement. Aspetterò altre risposte e nel frattempo vedrò se riesco a reimplementare la funzione di cui ho bisogno in python. – patrick

+0

L'ho fatto in javascript, eccolo http://patrick.arminio.info/blog/resources/map/map.svg :) Grazie ancora Phrogz – patrick

+0

@patrick il link è rotto – Georges