SVG에서 자유형 그림 그리기
선을 매끄럽게 하고 싶었기 때문에 여러가지 사고 착오해 보았습니다.
하고 싶은 일
svg에서 드래그하면 path를 추가하고 싶습니다.
이것은 단순히 마우스 이벤트와 플래그 관리로 드래그 할 때 svg 요소에 path 요소를 추가해 갔습니다.
path를 베지어하고 부드럽게하고 싶습니다.
이것이 꽤 힘들었습니다.
통과점만으로 곡선을 그리는 것은 catmull 곡선이 있지만, 아직 path 요소에는 구현되지 않은 것 같습니다.
여기 에 따르면 다음과 같습니다.
R,r1 Catmull-Rom 스플라인 곡선을 그립니다.
SVG2의 새로운 기능. 상세 사양은 개발 중이며 작동 환경은 아직 없습니다.
따라서 베지어 곡선을 사용하게 되지만 통과점 외에 제어점이 필요합니다.
이라레에서 자주 보이는 앵커 포인트입니다.
svg에서 베지어 곡선 샘플
통과점에서 제어점을 구하는 함수를 올리고 있다 사람이 있었기 때문에 이것을 빌렸습니다.
소스 코드만 발췌
catmullRom2bezier
function catmullRom2bezier(pts){
var cubics = [];
for ( var i = 0, iLen = pts.length; i < iLen ; i++ ){
var p = [
pts[i - 1],
pts[i],
pts[i + 1],
pts[i + 2]
];
if( i === 0 ){
p[0] = {
x: pts[ 0 ].x,
y: pts[ 0 ].y
}
}
if( i === iLen - 2 ){
p[3] = {
x: pts[iLen - 2].x,
y: pts[iLen - 2].y
};
}
if ( i === iLen - 1 ) {
p[2] = {
x: pts[iLen - 1].x,
y: pts[iLen - 1].y
};
p[3] = {
x: pts[iLen - 1].x,
y: pts[iLen - 1].y
};
}
const val = 6;
cubics.push([
(-p[0].x + val * p[1].x + p[2].x) / val,
(-p[0].y + val * p[1].y + p[2].y) / val,
(p[1].x + val * p[2].x - p[3].x) / val,
(p[1].y + val * p[2].y - p[3].y) / val,
p[2].x,
p[2].y
]);
}
return cubics;
}
인수에 통과점의 좌표 배열을 넣으면, 제어점을 포함한 베지어 곡선용의 좌표 배열을 돌려줍니다.
그 밖에도 npm에서 공개하는 사람 있었습니다.
실제로 사용할 때는 이것을 설치해도 좋을 것 같습니다.
정점을 솎아 부드럽게하고 싶다.
처음에는 단순히 거리가 너무 가깝다는 점을 날카롭게 했지만 그다지 잘 작동하지 않았습니다.
그래서 폴리곤의 선을 단순화해 주는 Simplify.js 를 사용하기로 했습니다.
(CDN에서 공개된 것을 찾지 못했기 때문에 아티팩트는 코드를 복사하여 사용하고 있습니다.)
아티팩트
ht tp // 코데펜. 이오 / kwst / 펜 / vggq
위가 부드럽게 한 선, 아래가 프리 핸드로 그린 선
깨끗하고 부드러워졌을까 생각합니다.
단순한 그림 그리지만, 선을 부드럽게하는 것만으로도 상당히 뼈가 부러졌습니다.
Github에 공개해 보았습니다.
SVGCatmullRomSpline
Reference
이 문제에 관하여(SVG에서 자유형 그림 그리기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kwst/items/16e4877890a19826ba7f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)