首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Javascript创建带有漫画风格/手抖动的SVG /画布草图

使用Javascript创建带有漫画风格/手抖动的SVG /画布草图
EN

Stack Overflow用户
提问于 2014-12-05 17:12:45
回答 1查看 1.1K关注 0票数 0

如何使用Javascript创建带有漫画风格/手抖动的SVG /画布草图

我知道xkcd风格的JS绘图仪和文章。请注意,我要求的不是情节,而是任何形式的素描,线条,形状,文字等等。

还有哪些使用JS的方法/技术?

编辑:在思考和阅读了一段时间之后,我决定实现自己的JS库,为SVG和HTML5画布提供卡通风格的绘图。它被称为comic.js,可以找到这里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-05 19:06:59

我会使用画布库来做这件事,只是为了简单的处理形状。

我要找的是Paper.jsFabric.js。但是,我将重点关注Paper.js,因为它是我工作过的那个。

  • 您可以通过画贝齐尔或线创建形状。如果你想的话,你甚至可以进口SVG。您甚至可以有预定义的形状,如圆/方等。

,所以你有了形状,现在是什么?

  • 您可以对它们进行压扁 (将它们细分为分段,为它们的几何学添加更多的顶点)。您可以增加细分间隔,这将导致每个路径的顶点/节点数较高。细分区间是maxDistance函数的参数flatten
  • 然后,您可以沿着每条路径/形状的顶点走,并在一定程度上(例如,1-2像素向随机方向移动),使用position.xposition.y

如果这就是你的意思:

,下面是代码

代码语言:javascript
复制
//STEP 1 -- create shapes, a circle and rectangle in this example

var myCircle = new Path.Circle(new Point(100, 70), 50);
myCircle.strokeColor = 'white';
myCircle.strokeWidth = 2;

var mySquare =  new Rectangle(new Point(350, 250), new Point(190, 100));
var square = new Path.Rectangle(mySquare);
square.strokeColor = 'white';
square.strokeWidth = 2;

//STEP 2 -- Subdivide the shapes into segments. Parameter here is the max distance we walk along-the-path before adding a new vertex

myCircle.flatten(5);
square.flatten(4);


//STEP 3 -- Loop through the segment points of the path and move each to a random value between 1 and 4

for (var i = 0; i < myCircle.segments.length; i++) { //loop for circle
   myCircle.segments[i].point.x += getRandomInt(1,3);
   myCircle.segments[i].point.y += getRandomInt(1,3);
};

for (var i = 0; i < square.segments.length; i++){ //loop for square
   square.segments[i].point.x += getRandomInt(1,3);
   square.segments[i].point.y += getRandomInt(1,3);
};


//draw the paper view
view.draw();


//Utility function that returns a random integer within a range
function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

,这是itjsFiddle

这个场景的问题是,画布上的每个“点”都是一个对象,而高数量的点/节点/顶点对于浏览器来说有点重。因此,如果您的设计很复杂,或者您希望用户与您的绘图进行交互,这可能是一个障碍(交互可能会被证明是缓慢的)。

或者,您可以使用普通的画布来完成此操作,而不需要任何库,但我不会这样做,因为我嗅到算法需要手动绘制形状,然后在这些算法中引入抖动。就计算时间而言,这可能要快得多,但实现起来会更困难,因为画布是一种低级的东西--它只记得绘制的像素,你需要滚动你自己的数据结构来记住形状,它们的位置等等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27321215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档