Juria를 사용하여 부드러운 곡선 SVG 내보내기
개요
BasicBSpline
패키지 출력을 사용하면 Bnozier 곡선과 비슷하게 나와서 좋아요!]add Plots
add StaticArrays
add BasicBSpline
add https://github.com/hyrodium/BasicBSplineExporter.jl
Plots.jl 출력
Plots.소프트웨어 패키지를 사용하여 차트를 출력합니다.
using Plots
plot(sin,-8,8) # 正弦波を-8から8までプロット
savefig("sin_Plots.svg") # SVGで保存
savefig("sin_Plots.png") # PNGで保存
SVG 이미지를 최대값 근처에서 확대합니다.
너 되게 멋있구나.[1]
커브가 폴리라인과 비슷하기 때문입니다.다음 이미지는 SVG 이미지를 확인하기 위해 Inkscape를 여는 곳입니다.
어떻게 해야만 매끄러운 도표를 얻을 수 있습니까?
SVG에서는 Bnozier 곡선에 대응하기 때문에 파일 형식으로는 가능할 것 같은데...
→BasicBSpline으로 포장하세요!
BasicBSplineExporter.jl 출력
using BasicBSpline
using BasicBSplineExporter
using StaticArrays
f(t) = SVector(t,sin(t)) # 正弦波のパラメータ表示
t0,t1 = -8,8 # 左端と右端
p = 3 # 多項式次数。SVGでは3次までのBézier曲線が使える。
k = KnotVector(t0:t1)+p*KnotVector(t0,t1) # ノット列
P = BSplineSpace{p}(k) # B-spline空間の定義
a = fittingcontrolpoints(f,(P,)) # B-spline曲線の制御点の計算
M = CustomBSplineManifold(a,(P,)) # B-spline曲線の定義
save_svg("sin_BasicBSpline.svg", M, xlims=(-10,10), ylims=(-2,2)) # B-spline曲線をSVGで保存
save_png("sin_BasicBSpline.png", M, xlims=(-10,10), ylims=(-2,2)) # B-spline曲線をPNGで保存![](https://storage.googleapis.com/zenn-user-upload/731678b5e5e8-20211229.png)
Inkscape로 확인하면 다음과 같이 Bnozier 곡선으로 매끄럽게 곡선이 표현되는 것을 알 수 있습니다.
위에서 정의한 B-spline 곡선은 노트의 위치에 연결되어 전체적으로 C^2 레벨의 매끄러움을 줍니다.각 구간은 다항식이기 때문에 곡선은 다항식을 구분하는 것으로 표시된다.
매끄럽지 않을 때(Plats.jl)
f(x)=||sin(x)|의 도표를 그려보세요.
Plots.jl에서 다음과 같이 그림을 출력할 수 있습니다.
plot(abs∘sin,-8,8)
savefig("abssin_Plots.svg")
savefig("abssin_Plots.png")
접선이 비슷하기 때문에 도함수의 불연속점이라도 특징을 잡는 도표로 볼 수 있다.
그러나 첨단을 확대해 보면 도표가 y축에 맞지 않아 특이점 근처에서 비뚤어져 보인다.
매끄럽지 않을 때(BasicBSpline.jl)
이전과 같이 다음 동작을 실행하면 도표를 출력할 수 있습니다.
f(t) = SVector(t,abs(sin(t)))
t0,t1 = -8,8
p = 3
k = KnotVector(range(t0,t1,length=50))+p*KnotVector(t0,t1)
P = BSplineSpace{p}(k)
a = fittingcontrolpoints(f,(P,))
M = CustomBSplineManifold(a,(P,))
save_svg("abssin_BasicBSpline![](https://storage.googleapis.com/zenn-user-upload/555b66bd3bac-20211229.png).svg", M, xlims=(-10,10), ylims=(-2,2))
save_png("abssin_BasicBSpline.png", M, xlims=(-10,10), ylims=(-2,2))
출력된 이미지↓도함수 불연속점의 증폭↓
비록 not의 수량(다항식 분할수 구분)이 증가하더라도'매끄러운 연결'의 제약이 있기 때문에 근사 정밀도는 좋아지지 않는다.
B-spline에서는 not의 중복 감소 함수의 매끄러움[2]에 따라 in의 뿌리 부분에 여러 개의 not를 배치하면 된다.
k = KnotVector(range(t0,t1,length=12))+p*KnotVector(t0,t1)
k += p*KnotVector(-2π:π:2π) # 滑らかさを減らしたい点でのノットを増やす
P = BSplineSpace{p}(k)
a = fittingcontrolpoints(f,(P,))
M = CustomBSplineManifold(a,(P,))
save_svg("abssin_BasicBSpline_modified.svg", M, xlims=(-10,10), ylims=(-2,2))
save_png("abssin_BasicBSpline_modified.png", M, xlims=(-10,10), ylims=(-2,2))
출력된 이미지↓확대해도 예뻐요!↓
총결산
이번에는 GR 백엔드를 사용하여 검증을 진행하고 있습니다.다른 백엔드라면 바뀔 수도 있어요.↩︎
정확히 말하면 n점의 not가 중복되면 이 점에서 C^{p-n}급의 매끄러움에 도달할 수 있다.↩︎
Reference
이 문제에 관하여(Juria를 사용하여 부드러운 곡선 SVG 내보내기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/hyrodium/articles/9e7ce1b67afc57텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)