- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试自定义来自 Paperjs ( http://paperjs.org/examples/meta-balls/ ) 的 metaballs 示例。问题是,即使复制粘贴它也行不通。它不绘制/显示球之间的“桥梁”。
这是一个 jsFiddle:http://jsfiddle.net/AK47p/
代码如下:
$(document).ready(function () {
// Get a reference to the canvas object
var canvas = document.getElementById('canvas');
// Create an empty project and a view for the canvas:
paper.setup(canvas);
// Create a simple drawing tool:
var tool = new paper.Tool();
// Ported from original Metaball script by SATO Hiroyuki
// http://park12.wakwak.com/~shp/lc/et/en_aics_script.html
paper.project.currentStyle = {
fillColor: 'black'
};
var ballPositions = [[255, 129], [610, 73], [486, 163],
[117, 259], [484, 326], [843, 306], [789, 215], [949, 82],
[292, 128], [917, 233], [352, 86], [92, 98]];
var handle_len_rate = 2.4;
var circlePaths = [];
var radius = 50;
for (var i = 0, l = ballPositions.length; i < l; i++) {
var circlePath = new paper.Path.Circle({
center: ballPositions[i],
radius: 50
});
circlePaths.push(circlePath);
}
var largeCircle = new paper.Path.Circle({
center: paper.view.center,
radius: 100,
fillColor: 'green'
});
circlePaths.push(largeCircle);
tool.onMouseMove = function(event) {
largeCircle.position = event.point;
generateConnections(circlePaths);
}
var connections = new paper.Group(); var thePath;
function generateConnections(paths) {
// Remove the last connection paths:
connections.children = [];
for (var i = 0, l = paths.length; i < l; i++) {
for (var j = i - 1; j >= 0; j--) {
var path = metaball(paths[i], paths[j], 0.5, handle_len_rate, 300);thePath = path;
if (path) {
connections.appendTop(path);
path.removeOnMove();
}
}
}
}
generateConnections(circlePaths);
// ---------------------------------------------
function metaball(ball1, ball2, v, handle_len_rate, maxDistance) {
var center1 = ball1.position;
var center2 = ball2.position;
var radius1 = ball1.bounds.width / 2;
var radius2 = ball2.bounds.width / 2;
var pi2 = Math.PI / 2;
var d = center1.getDistance(center2);
var u1, u2;
if (radius1 == 0 || radius2 == 0)
return;
if (d > maxDistance || d <= Math.abs(radius1 - radius2)) {
return;
} else if (d < radius1 + radius2) { // case circles are overlapping
u1 = Math.acos((radius1 * radius1 + d * d - radius2 * radius2) /
(2 * radius1 * d));
u2 = Math.acos((radius2 * radius2 + d * d - radius1 * radius1) /
(2 * radius2 * d));
} else {
u1 = 0;
u2 = 0;
}
var angle1 = center2.subtract(center1).getAngleInRadians();
var angle2 = Math.acos((radius1 - radius2) / d);
var angle1a = angle1 + u1 + (angle2 - u1) * v;
var angle1b = angle1 - u1 - (angle2 - u1) * v;
var angle2a = angle1 + Math.PI - u2 - (Math.PI - u2 - angle2) * v;
var angle2b = angle1 - Math.PI + u2 + (Math.PI - u2 - angle2) * v;
var p1a = center1 + getVector(angle1a, radius1);
var p1b = center1 + getVector(angle1b, radius1);
var p2a = center2 + getVector(angle2a, radius2);
var p2b = center2 + getVector(angle2b, radius2);
// define handle length by the distance between
// both ends of the curve to draw
var totalRadius = (radius1 + radius2);
var d2 = Math.min(v * handle_len_rate, (p1a - p2a).length / totalRadius);
// case circles are overlapping:
d2 *= Math.min(1, d * 2 / (radius1 + radius2));
radius1 *= d2;
radius2 *= d2;
var path = new paper.Path({
segments: [p1a, p2a, p2b, p1b],
style: ball1.style,
closed: true
});
var segments = path.segments;
segments[0].handleOut = getVector(angle1a - pi2, radius1);
segments[1].handleIn = getVector(angle2a + pi2, radius2);
segments[2].handleOut = getVector(angle2b - pi2, radius2);
segments[3].handleIn = getVector(angle1b + pi2, radius1);
return path;
}
// ------------------------------------------------
function getVector(radians, length) {
return new paper.Point({
// Convert radians to degrees:
angle: radians * 180 / Math.PI,
length: length
});
}
});
如您所见,我将代码封装在一个 domReady 函数中,因为这将成为幻灯片的一部分。我按照此处的说明 (http://paperjs.org/tutorials/getting-started/using-javascript-directly/) 执行此操作。知道有什么问题吗?我检查了一遍又一遍,我一定是遗漏了什么……
谢谢
最佳答案
找出丢失的东西。它在 Paperjs 上没有很好的文档记录,无论如何,如果您像常规 javascript 一样使用它,请确保对纸张对象(Point、Path 等)的所有操作都表示为方法,而不是运算符。
错误
var d2 = Math.min(v * handle_len_rate, (point1a - point2a).length / totalRadius);
右
var d2 = Math.min(v * handle_len_rate, point1a.subtract(point2a).length / totalRadius);
关于javascript - Paperjs metaballs 不工作/显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21140255/
我一直试图弄清楚如何在 paperjs 中使用 onMouseDrag 和 onMouseDown 进行平移/缩放。 我看到的唯一引用是在 coffescript 中,并且不使用 paperjs 工具
我在一个 paperJS 项目上有多个图表。我想展示一个适合盒子的较小版本。说 500px X 350px。现在我怎样才能放大或缩小以最好的方式适合图表。 最佳答案 您可以缩放项目组以使其适合给定的框
如何使用 PaperJS 淡入/淡出光栅(图像)?目前我正在使用以下笨拙的函数来处理 1 个栅格(代码已简化): var img = new Raster('test.jpg'); img.opaci
我在一个 paperJS 项目上有多个图表。我想展示一个适合盒子的较小版本。说 500px X 350px。现在我怎样才能放大或缩小以最好的方式适合图表。 最佳答案 您可以缩放项目组以使其适合给定的框
如何处理大写或选项的 shift + 键? a可以是任何键,如 1或 !/或 ? 或 h或 shift + h 得到大写的 H。 我正在尝试使用 Paper.js 构建 WYSIWYG。 当我双击文本
使用Paperjs: 尝试在 myapp.js 中创建一个类: class Petal { constructor(index, x, y, diameter, round) { th
抱歉,这个问题考虑不周。我的意思是:我有 2 个点组成一个线段。然后我想将一个线段放置在与第一个线段成 x 度的 Angular 处。我该如何计算第三个点的位置? 基本上就是这个图: Diagram
我正在使用 paperjs,当用户绘制一条线时,我希望它在穿过之前绘制的线时停止。这是我当前的测试代码: tool.minDistance = 1; var path; var drawing = f
在使用 Paperjs 时,有一些奇怪的行为,我试图分别用 7 个点来弯曲一条线 - 一次效果很好,但是当尝试使链接超调并返回到 3 个不同的点时(以创建反弹效果) ) 好像不打球。在第二个 if 语
我已经使用 paperJS 创建了一个圆圈,现在我将为创建的圆圈应用撤消选项。那么如何将 Point {x: 537, y: 157}(这是 paperjs 中的 event.point)保存到数组中
如何对使用 onMouseDrag 绘制的圆应用拖放操作。 Look at the fiddle 最佳答案 Here is a fiddle带有拖放的粗略演示。通常,鼠标工具有两种模式;绘图和拖动。
我们已将 mouseMove/mouseEnter/mouseLeave 事件附加到形状/线条等,但我们正在寻找一种方法允许 paperjs 在鼠标靠近项目时触发这些事件(不一定要在它们之上触发)事件
here 中显示的示例显示如何在 Paperjs 中沿路径移动对象,但如何沿路径正确旋转对象? 在上面链接中显示的示例中,人们建议使用圆圈作为示例。但是一旦变成矩形 new Path.Rectangl
Paper.js 出现很多问题。在 Udemy 上参加 Colt Steele 的 Web 开发人员训练营。我在第 19 节。目前正在尝试制作 Patatap 克隆。
在 paperjs 中可以使用鼠标事件灵活地创建和操作复杂的形状。我正在从事的项目在台式机/笔记本电脑上看起来不错。但是,我也想通过捏合和缩放等触摸事件来进行形状操作。在 paperjs 中是否可以使
我已经成功实现了基于 this example 的缩放功能 zoom: function(delta, point){ if (!delta) return; var
我试图在 paperjs 中从另一个多边形中排除 1 个多边形,但似乎不知道如何做到这一点。 var base_points = [[50,50],[100,50],[125,10]]; var cl
在 http://paperjs.org/examples/chain/在源代码第 16 行你可以看到: var start = view.center / [10, 1]; 我假设这是某种二维向量除
我正在制作一个 paperjs 应用程序,其中有圆圈,每个圆圈都可以自由移动。一些圆通过线相互连接,这会导致圆彼此更靠近——即,线模拟圆之间的松紧带。然而,圆圈不允许重叠,所以我想进行某种碰撞排斥。目
我编写了这个脚本,当我移动 slider 时,方 block 应该立即调整大小。他们不知道。这需要几秒钟。有什么想法吗? 这是我的代码的链接:code on github gist 。 。为什么会延迟
我是一名优秀的程序员,十分优秀!