Przede wszystkim polecam używanie dobrej biblioteki graficznej, takiej jak Rafael. Uprości to proces korzystania z javascript do wykonania rysunku.
Bardzo prostą metodą wygładzania jest przekształcenie wszystkich poleceń lineto za pomocą równoważnych komend curveto i obliczenie niektórych punktów kontrolnych na podstawie kątów każdego segmentu linii. Na przykład,
<svg width="1000" height="1000" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<path d="
M250 150
L150 350
L350 350
L250 150
" />
</svg>
staje
<svg width="1000" height="1000" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<path d="
M250 150
C250 150 150 350 150 350
C150 350 350 350 350 350
C350 350 250 150 250 150
" />
</svg>
Obie te powinny wyciągnąć trójkąt równoboczny
Następnym krokiem byłoby obliczyć położenie punktów kontrolnych. Ogólnie rzecz biorąc, będziesz chciał, aby punkty kontrolne po obu stronach gładkiego rogu padały na wyimaginowaną linię przechodzącą przez wierzchołek. W przypadku wierzchołka trójkąta równobocznego byłaby to linia pozioma. Po pewnym manipulacji, można uzyskać coś takiego:
<svg width="1000" height="1000" version="1.1"
xmlns="http://www.w3.org/2000/svg">
<path d="
M250 150
C230 150 140 333 150 350
C160 367 340 367 350 350
C360 333 270 150 250 150
" />
</svg>
Najtrudniejsze jest obliczenie punktów kontrolnych, ale to nie zmienia się znacznie więcej niż prostego problemu wyzwalania. Jak już wcześniej wspomniałem, celem jest umieszczenie dwóch punktów kontrolnych na linii dzielącej wierzchołki narożników na pół. Na przykład, załóżmy, że mamy dwa liniowe segmenty:
A. (0,0) to (3,2)
B. (0,0) to (1,-4)
the absolute angle of A is arctan(2/3) = 33.69 deg
the absolute angle of B is arctan(-4/1) = -75.96 deg
the bisection angle of AB is (33.69 + -75.96)/2 = -21.135
the tangent angle is AB is (-21.135 + 90) = 68.865
znając kąt stycznej, możemy obliczyć punkt kontrolny pozycjonuje
smoothness = radius = r
tangent angle = T
Vertex X = Xv
Vertex Y = Yv
Control Point 1:
Xcp1 = cos(T)*r
Ycp1 = sin(T)*r
Control Point 2:
Xcp2 = cos(T)*(-r)
Ycp2 = sin(T)*(-r)
Ostatnim problemem jest to, gdzie umieścić każdy punkt kontrolny w rzeczywistej curveTo command:
CX1 Y1 X2 Y2 X3 Y3
X3 i Y3 określają położenie wierzchołków. X1 Y1 i X2 Y2 definiują punkty kontrolne. Możesz myśleć o X1 Y1 jako definiującym wektor jak wejść do wierzchołka i X2 Y2 jako definiując wektor jak wyjść. Teraz, że masz dwa punkty kontrolne należy zdecydować się na
CXcp1 Ycp1 Xcp2 Ycp2 0 0
lub
CXcp2 Ycp2 Xcp1 Ycp1 0 0
to ważna decyzja. Jeśli dostaniesz je do tyłu, kształt będzie wyglądać jak pętla. W tym momencie powinieneś być w stanie określić, jak należy podjąć decyzję ...
To jest bardzo proste rozwiązanie, ale wygląda dobrze na ręcznie rysowane ścieżki. Lepsze rozwiązanie może pójść o krok dalej i przesunąć punkt przecięcia do wewnątrz w kierunku wklęsłej części każdego przecięcia segmentu linii. To jest trochę trudniejsze.
Spróbuj użyć krzywych http://www.w3.org/TR/SVG/paths.html#PathDataCurveCommands – Gerben