Rozszerz i usuwaj kształty SVG za pomocą Javascript

EDYTOWAĆ:

W końcu znalazłem sposób na erodowanie i rozszerzanie wielokątów (przesunięcie), dzięki czemu nowa geometria jest tworzona przy użyciu biblioteki Clipper:https://sourceforge.net/projects/jsclipper/

Demo JavaScript Clipper na żywo:http://jsclipper.sourceforge.net/5.0.2.1/main_demo.html

Clipper może obsługiwać tylko wielokąty lub wieloboki (np. Wielokąty z otworami), więc aby działał z innymi obiektami graficznymi w formacie SVG, muszą zostać przekonwertowane na linie proste. Co najmniej ścieżki są dość łatwe do przekonwertowania na liniepath.getTotalLength() ipath.getPointAtLength() (http://whaticode.com/2012/02/01/converting-svg-paths-to-polygons/).

Inną możliwością jest użycie podobnej techniki (która nie tworzy nowej geometrii):https://stackoverflow.com/a/12723835/1691517

Czy jest jakiś sposób na erodowanie i rozszerzanie kształtów w SVG za pomocą Javascript?

Mam następujący przykład SVG:http://jsfiddle.net/timo2012/2S4Kt/1/

Istnieją trzy kształty: niebieski jest oryginalny, zielony jest zerodowany (rozcieńczony), a czerwony jest rozszerzony (pogrubiony). Są tworzone w Illustratorze.

Przetestowałem erodowanie i rozszerzanie filtrów, ale efekt nie jest tak dobry:https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/examples/feMorphology.svg

Po kilku godzinach przeszukiwania Internetu znalazłem tylko przykłady erozji i rozszerzania obrazu bitmapowego, ale nic o kształtach wektorowych.

Udało mi się rozszerzyć i zniszczyć wielokąty SVG za pomocą Shapely (http://toblerity.github.com/shapely/manual.html ) w Pythonie wysyłając punkty ścieżki za pomocą wywołania Ajax do skryptu PHP, który wywołuje system () do skryptu Pythona, ale ta metoda jest powolna i wymaga serwera do wykonania pracy, którą można wykonać po stronie klienta.

To jest mój kod do rozszerzania i erodowania w Pythonie (jak widzisz, jest on dość krótki):

#!/usr/bin/python26

from shapely.geometry import Polygon
from shapely.geometry import MultiPolygon

import sys

if len(sys.argv)>2:
  inset=eval(sys.argv[1])
  coords=eval(sys.argv[2])
else:
  sys.exit()

bowtie = Polygon(coords)
clean = bowtie.buffer(inset)
clean = clean.simplify(1, preserve_topology=False)
if clean.length>0:
  if clean.geom_type=="MultiPolygon":
    for n in range(0, len(clean)):
      print list(clean[n].exterior.coords)
      #print "\n"
  elif clean.geom_type=="Polygon":
    print list(clean.exterior.coords)

Znajdź także ten dokument, który próbuje zdefiniować rozszerzanie i erodowanie w kategoriach matematycznych:http://en.wikipedia.org/wiki/Mathematical_morphology

Jest zdanie „Podstawową ideą morfologii binarnej jest próbkowanie obrazu o prostym, wstępnie zdefiniowanym kształcie, wyciąganie wniosków na temat tego, jak ten kształt pasuje lub pomija kształty na obrazie. Ta prosta„ sonda ”nazywa się elementem strukturyzującym, i sam jest obrazem binarnym (tj. podzbiorem przestrzeni lub siatki). ”

Zakładam, że ta metoda może być użyta w morfingu kształtów wektorowych, ale jak ...

EDYCJA: Jeden komentarz w odpowiedzi spowodował możliwość użycia filtrów zamiast tworzenia nowej geometrii: jeśli ktoś chce dodać uchwyty przeciągania do punktów wielokąta, wtedy uchwyty przeciągania mogą wydawać się być w niewłaściwym miejscu. Może to być akceptowalne, ponieważ wtedy wydaje się, że oryginalne dane ścieżki są nietknięte, co w rzeczywistości ma miejsce w przypadku filtrów, ale - po dalszych testach - udowodniło, że jakość jest większym problemem. Wedługto ito Filtr SVG wykorzystuje pikselową reprezentację obiektu grafiki wektorowej zamiast samych danych ścieżki, co prowadzi doniezbyt dobre wyniki.

EDIT2: MOŻLIWY DZIAŁANIE: Jedna z odpowiedzi na tej stronie skłoniła mnie do użycia obrysów i maski o zmiennej szerokości, aby uzyskać dobrze wyglądające obejście tego problemu. Zrobiłem kilka testów i zaimplementowałemefekt przesunięcia ścieżki podobny do Adobe Illustratora.

questionAnswers(2)

yourAnswerToTheQuestion