SVG에서 자유형 그림 그리기

10518 단어 자바스크립트SVG
svg로 그림 그려 샘플을 만들어 보았습니다.
선을 매끄럽게 하고 싶었기 때문에 여러가지 사고 착오해 보았습니다.

하고 싶은 일


  • svg에서 드래그하면 path를 추가하고 싶습니다
  • path를 베지어하여 부드럽게하고 싶습니다


  • 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
  • 좋은 웹페이지 즐겨찾기