Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript paper.js-通过闭合路径实现更平滑的边缘_Javascript_Html_Canvas_Paperjs - Fatal编程技术网

Javascript paper.js-通过闭合路径实现更平滑的边缘

Javascript paper.js-通过闭合路径实现更平滑的边缘,javascript,html,canvas,paperjs,Javascript,Html,Canvas,Paperjs,这是我生成的一个不规则形状的长方体: 这就是我想要达到的最终效果(注意平滑的边缘): 以下是我的夏普版本的代码: var path1 = new Path({ segments: [[123, 6], [290, 6], [304, 142], [112, 142]], strokeColor: 'white', closed: true, strokeWidth: 3, strokeJoin: 'round' }); 问题是,我已经在使用笔划连接:

这是我生成的一个不规则形状的长方体:

这就是我想要达到的最终效果(注意平滑的边缘):

以下是我的夏普版本的代码:

var path1 = new Path({
    segments: [[123, 6], [290, 6], [304, 142], [112, 142]],
    strokeColor: 'white',
    closed: true,
    strokeWidth: 3,
    strokeJoin: 'round'
});
问题是,我已经在使用笔划连接:“round”选项,笔划宽度为3px时,差异几乎不明显。这是一件小事,但可能会成为游戏的破坏者,因为会有多个像这样的对象,差异是巨大的


使用paper.js有没有办法做到这一点而不过分

如markE所述,
strokeJoin
仅更改路径笔划的画布样式。Paper.js没有圆角功能,您必须自己制作

这里有一个快速函数,您可以使用它作为起点。它将使多边形的点负偏移给定的距离,并添加相应的控制柄

function roundPath(path,radius) {
    var segments = path.segments.slice(0);
    path.segments = [];
    for(var i = 0, l = segments.length; i < l; i++) {
        var curPoint = segments[i].point;
        var nextPoint = segments[i + 1 == l ? 0 : i + 1].point;
        var prevPoint = segments[i - 1 < 0 ? segments.length - 1 : i - 1].point;
        var nextDelta = curPoint - nextPoint;
        var prevDelta = curPoint - prevPoint;
        nextDelta.length = radius;
        prevDelta.length = radius;
        path.add({
            point:curPoint - prevDelta,
            handleOut: prevDelta/2
        });
        path.add({
            point:curPoint - nextDelta,
            handleIn: nextDelta/2
        });
    }
    path.closed = true;
    return path;
}
函数圆路径(路径、半径){
var segments=path.segments.slice(0);
path.segments=[];
对于(变量i=0,l=segments.length;i

我正在寻找一个精确的实现,如下所述:

我的实施工作如下:

  • curPoint是角点、上一点和下一点,如上所述
  • nextNorm和prevNorm是点的规范化版本
  • 角度是角的角度,由点积导出
  • delta是从角点到需要插入控制点的位置的距离,该距离由控制点、curPoint和角弧中心形成的直角三角形导出。角是半个角,与该角相对的一侧是半径
  • prevDelta和nextDelta是边的新端点,在这两个端点之间插入圆弧
  • “通过”是弧的一半,通过得到上述三角形的斜边并减去半径找到

    var segments = path.segments.slice(0);
    path.segments = [];
    for(var i = 0, l = segments.length; i < l; i++) {
        var curPoint = segments[i].point;
        var nextPoint = segments[i + 1 == l ? 0 : i + 1].point;
        var prevPoint = segments[i - 1 < 0 ? segments.length - 1 : i - 1].point;
    
        var nextNorm = (curPoint - nextPoint).normalize();
        var prevNorm = (curPoint - prevPoint).normalize();
    
        var angle = Math.acos(nextNorm.dot(prevNorm));
    
        var delta = radius/Math.tan(angle/2);
        var prevDelta = prevNorm.normalize(delta);
        var nextDelta = nextNorm.normalize(delta);
    
        var through = curPoint - (prevNorm + nextNorm).normalize(Math.sqrt(delta*delta + radius*radius) - radius);
    
        path.add(curPoint - prevDelta);
        path.arcTo(through, curPoint - nextDelta);
    }
    
    var segments=path.segments.slice(0);
    path.segments=[];
    对于(变量i=0,l=segments.length;i

strokeJoin
仅确定如何显示两条线的交点。因为它是一个点,所以不会产生曲线。所以你需要同时使用直线和曲线(或圆弧)来环绕你的梯形。效果非常好,完全符合我的要求。谢谢,太棒了。我希望我能投两次票。我已经在这里将其转换为纯JavaScript版本: