- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我即将用 d3.js 完成我的第一个项目。它计算滑雪者可用的势能,如果所有这些能量都转换为动能,我想计算滑雪者的预期速度。我想要的最后一件事是在滑雪者掉落时为他添加过渡。我希望滑雪者始终过渡到右侧的黑色圆圈 (p2)。过渡的持续时间现在并不重要。有没有简单的方法来完成这项任务?
const height = 500;
const width = 800;
const skierIconSvg = 'https://image.flaticon.com/icons/svg/94/94150.svg';
const gate =
'https://docs.google.com/drawings/d/1k-mtzjW05U6KZKNt0kAI2pWqKsXFobptsa9kz6grYzA/edit?usp=sharing';
const [p1, p2, p3] = [
[80, 130],
[600, 170],
[750, 190],
];
const svg = d3.select('svg');
// Store a reference to the span we're going to update
const skierHeight = d3.select('#skier-height');
const vek = document.querySelector('#vekt');
console.log(vek.value);
const line = svg.append('line').attr('stroke', 'black');
const connection = svg.append('line').attr('stroke', 'green');
const projection = svg
.append('circle')
.attr('r', 5)
.attr('stroke', 'red')
.attr('fill', 'none');
const g = svg
.append('g')
.attr('cursor', 'move')
.attr('pointer-events', 'all')
.attr('stroke', 'transparent')
.attr('stroke-width', 30);
const point = g
.selectAll('image')
.data([p1, p2])
.enter()
.append('circle')
.attr('r', 10)
.call(
d3
.drag()
.subject(([x, y]) => ({
x,
y,
}))
.on('drag', dragged)
);
const skier = g
.append('image')
.attr('id', 'skier')
.datum(p3)
.attr('href', skierIconSvg)
.attr('width', 100)
.attr('height', 100)
.attr('transform', 'translate(-50, -40)')
.call(
d3
.drag()
.subject(([x, y]) => ({
x,
y,
}))
.on('drag', dragged)
);
update();
function dragged(d) {
d[0] = d3.event.x;
d[1] = d3.event.y;
update();
potensiellEnergi();
}
function update() {
const t = (width + height) / distance(p1, p2);
const l1 = interpolate(p1, p2, t);
const l2 = interpolate(p2, p1, t);
const p = interpolate(p1, p2, project(p1, p2, p3));
connection.attr('x1', p3[0]).attr('y1', p3[1]);
connection.attr('x2', p[0]).attr('y2', p[1]);
projection.attr('cx', p[0]).attr('cy', p[1]);
line.attr('x1', l1[0]).attr('y1', l1[1]);
line.attr('x2', l2[0]).attr('y2', l2[1]);
point.attr('cx', (d) => d[0]).attr('cy', (d) => d[1]);
skier.attr('x', (d) => d[0]).attr('y', (d) => d[1]);
skierHeight.text(`${getHeight(p, p1, p2).toFixed(2)} meter`);
}
function distance([x1, y1], [x2, y2]) {
return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);
}
function interpolate([x1, y1], [x2, y2], t) {
return [x1 + (x2 - x1) * t, y1 + (y2 - y1) * t];
}
function project([x1, y1], [x2, y2], [x3, y3]) {
const x21 = x2 - x1,
y21 = y2 - y1;
const x31 = x3 - x1,
y31 = y3 - y1;
return (x31 * x21 + y31 * y21) / (x21 * x21 + y21 * y21);
}
function getHeight([xp, yp], [x1, y1], [x2, y2]) {
// Note that y is counted from top to bottom, so higher y means
// a point is actually lower.
// First, the total height is 100 metres.
const pxPerMeter = (y2 - y1) / 100;
// Calculate the height diff in pixels
const heightDiffPx = y2 - yp;
// Now transform it to meters
return heightDiffPx / pxPerMeter;
}
function vektVelger() {
const vektVerdi = document.querySelector('#vekt');
const vektDisplay = document.querySelector('#skier-vekt');
vektDisplay.innerHTML = vektVerdi.value;
}
function potensiellEnergi() {
const vektVerdi = parseInt(document.querySelector('#skier-vekt').textContent);
const skierHeight = parseInt(
document.querySelector('#skier-height').textContent
);
const potEDisplay = document.querySelector('#skier-potentialenergi');
const potEnergi = `${vektVerdi * skierHeight * 9.8}`;
return (potEDisplay.innerHTML = `${potEnergi}`);
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="https://d3js.org/d3.v5.js"></script>
<script src="https://d3js.org/d3-path.v1.min.js"></script>
<script src="https://d3js.org/d3-shape.v1.min.js"></script>
<script src="https://d3js.org/d3-scale.v3.min.js"></script>
<script src="https://d3js.org/d3-axis.v1.min.js"></script>
<script src="https://d3js.org/d3-dispatch.v1.min.js"></script>
<script src="https://d3js.org/d3-selection.v1.min.js"></script>
<link href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@300&display=swap" rel="stylesheet" />
<link href="https://fonts.googleapis.com/css2?family=Amatic+SC:wght@700&display=swap" rel="stylesheet" />
</head>
<body>
<h1>Forsøk på å lage en tutorial i JavaScript og D3.js</h1>
<h2>Høydeforskjell: <span id="skier-height"></span></h2>
<h2>Vekt: <span id="skier-vekt">70</span> kg</h2>
<h2>
Gravitasjonskraft (fg): <span id="skier-gravitasjon">9.8</span> m/sek/sek
</h2>
<h2>Potential Energy: <span id="skier-potentialenergi">0</span> KJOULE</h2>
<svg width="800" height="300"></svg>
<form>
Velg utøverens vekt:
<input type="number" id="vekt" placeholder="Velg utøverens vekt" />
</form>
<input type="button" value="velg" onclick="vektVelger()" />
<script src="skier.js"></script>
</body>
</html>
最佳答案
我在下面添加了过渡。滑雪者首先下降到地面,当过渡完成后,他们滑到最后。你甚至可以使用 one of these过渡缓动方法,使它们在此过程中获得速度!
我在处理您的包裹时遇到了一些问题。我不明白为什么你的 HTML 中有所有这些行,但它们破坏了 d3.transition:
<script src="https://d3js.org/d3-path.v1.min.js"></script>
<script src="https://d3js.org/d3-shape.v1.min.js"></script>
<script src="https://d3js.org/d3-scale.v3.min.js"></script>
<script src="https://d3js.org/d3-axis.v1.min.js"></script>
<script src="https://d3js.org/d3-dispatch.v1.min.js"></script>
<script src="https://d3js.org/d3-selection.v1.min.js"></script>
删除所有这些,只留下
<script src="https://d3js.org/d3.v5.js"></script>
完全没问题。
const height = 500;
const width = 800;
const skierIconSvg = 'https://image.flaticon.com/icons/svg/94/94150.svg';
const gate =
'https://docs.google.com/drawings/d/1k-mtzjW05U6KZKNt0kAI2pWqKsXFobptsa9kz6grYzA/edit?usp=sharing';
const [p1, p2, p3] = [
[80, 130],
[600, 170],
[750, 190],
];
const svg = d3.select('svg');
// Store a reference to the span we're going to update
const skierHeight = d3.select('#skier-height');
const vek = document.querySelector('#vekt');
console.log(vek.value);
const line = svg.append('line').attr('stroke', 'black');
const connection = svg.append('line').attr('stroke', 'green');
const projection = svg
.append('circle')
.attr('r', 5)
.attr('stroke', 'red')
.attr('fill', 'none');
const g = svg
.append('g')
.attr('cursor', 'move')
.attr('pointer-events', 'all')
.attr('stroke', 'transparent')
.attr('stroke-width', 30);
const point = g
.selectAll('image')
.data([p1, p2])
.enter()
.append('circle')
.attr('r', 10)
.call(
d3
.drag()
.subject(([x, y]) => ({
x,
y,
}))
.on('start', () => {
// Interrupt all transitions
skier.interrupt();
connection.interrupt();
// Update the value of p3 to wherever the skier happened to be
// This will stop him dead in his tracks instead of snapping him back to the old position
p3[0] = Number(skier.attr('x'));
p3[1] = Number(skier.attr('y'));
})
.on('drag', dragged)
);
const skier = g
.append('image')
.attr('id', 'skier')
.datum(p3)
.attr('href', skierIconSvg)
.attr('width', 100)
.attr('height', 100)
.attr('transform', 'translate(-50, -40)')
.call(
d3
.drag()
.subject(() => ({
// Use where the skier is, not where he's supposed to be
x: Number(skier.attr('x')),
y: Number(skier.attr('y')),
}))
.on('start', () => {
// Interrupt all transitions
skier.interrupt();
connection.interrupt();
})
.on('drag', dragged)
.on('end', dropSkier)
);
update();
function dragged(d) {
d[0] = d3.event.x;
d[1] = d3.event.y;
update();
potensiellEnergi();
}
function update() {
const t = (width + height) / distance(p1, p2);
const l1 = interpolate(p1, p2, t);
const l2 = interpolate(p2, p1, t);
const p = interpolate(p1, p2, project(p1, p2, p3));
connection.attr('x1', p3[0]).attr('y1', p3[1]);
connection.attr('x2', p[0]).attr('y2', p[1]);
projection.attr('cx', p[0]).attr('cy', p[1]);
line.attr('x1', l1[0]).attr('y1', l1[1]);
line.attr('x2', l2[0]).attr('y2', l2[1]);
point.attr('cx', (d) => d[0]).attr('cy', (d) => d[1]);
skier.attr('x', (d) => d[0]).attr('y', (d) => d[1]);
skierHeight.text(`${getHeight(p, p1, p2).toFixed(2)} meter`);
}
function distance([x1, y1], [x2, y2]) {
return Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2);
}
function interpolate([x1, y1], [x2, y2], t) {
return [x1 + (x2 - x1) * t, y1 + (y2 - y1) * t];
}
function project([x1, y1], [x2, y2], [x3, y3]) {
const x21 = x2 - x1,
y21 = y2 - y1;
const x31 = x3 - x1,
y31 = y3 - y1;
return (x31 * x21 + y31 * y21) / (x21 * x21 + y21 * y21);
}
function getHeight([xp, yp], [x1, y1], [x2, y2]) {
// Note that y is counted from top to bottom, so higher y means
// a point is actually lower.
// First, the total height is 100 metres.
const pxPerMeter = (y2 - y1) / 100;
// Calculate the height diff in pixels
const heightDiffPx = y2 - yp;
// Now transform it to meters
return heightDiffPx / pxPerMeter;
}
function vektVelger() {
const vektVerdi = document.querySelector('#vekt');
const vektDisplay = document.querySelector('#skier-vekt');
vektDisplay.innerHTML = vektVerdi.value;
}
function potensiellEnergi() {
const vektVerdi = parseInt(document.querySelector('#skier-vekt').textContent);
const skierHeight = parseInt(
document.querySelector('#skier-height').textContent
);
const potEDisplay = document.querySelector('#skier-potentialenergi');
const potEnergi = `${vektVerdi * skierHeight * 9.8}`;
return (potEDisplay.innerHTML = `${potEnergi}`);
}
function dropSkier(d) {
const projection = interpolate(p1, p2, project(p1, p2, p3));
skier
.transition()
.duration(500)
// First down to the ground
.attr('x', projection[0])
.attr('y', projection[1])
.on("end", () => {
skier
.transition()
.duration(2500)
// First down to the ground
.attr('x', p2[0])
.attr('y', p2[1]);
});
// Remove the line together with the skier
connection
.transition()
.duration(500)
// First down to the ground
.attr('x1', projection[0])
.attr('y1', projection[1]);
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="https://d3js.org/d3.v5.js"></script>
<link
href="https://fonts.googleapis.com/css2?family=Inconsolata:wght@300&display=swap"
rel="stylesheet"
/>
<link
href="https://fonts.googleapis.com/css2?family=Amatic+SC:wght@700&display=swap"
rel="stylesheet"
/>
</head>
<body>
<h1>Forsøk på å lage en tutorial i JavaScript og D3.js</h1>
<h2>Høydeforskjell: <span id="skier-height"></span></h2>
<h2>Vekt: <span id="skier-vekt">70</span> kg</h2>
<h2>
Gravitasjonskraft (fg): <span id="skier-gravitasjon">9.8</span> m/sek/sek
</h2>
<h2>Potential Energy: <span id="skier-potentialenergi">0</span> KJOULE</h2>
<svg width="800" height="300"></svg>
<form>
Velg utøverens vekt:
<input type="number" id="vekt" placeholder="Velg utøverens vekt" />
</form>
<input type="button" value="velg" onclick="vektVelger()" />
<script src="skier.js"></script>
</body>
</html>
关于javascript - 向 d3.drag() 行为添加过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63859153/
我正在尝试使Polymer Dart元素可拖动,并与列表中的另一个项目交换信息。我最近的尝试是使用元素。我正在使用由trackstart,track和trackend的此元素创建的事件。我可以触发它们
我正在使用 Windows 窗体在 C# 中构建桌面应用程序。我有一个自定义控件,我希望能够将它拖放到我的应用程序中(而不是外部)。现在我正在使用通常的 DoDragDrop/OnDragOver/O
我有一个#topleft红色标题栏,其中包含多个“选项卡”按钮,这些按钮应填充除#topright蓝色块之外的所有可用空间。 在#topleft的红色背景上单击并拖动,可以移动 Electron 主窗
我希望能够移动(在灰色背景上,通过拖放)Bootstrap 2 提供的模态表单。谁能告诉我实现此目的的最佳实践是什么? 最佳答案 默认情况下, Bootstrap 不附带任何拖放功能,但您可以添加一些
我只想在屏幕上拖动小部件,而不是拖放。 但是,每当我离开它并再次开始拖动时,它就会从开始的位置开始被拖动。就好像它被重置了。 我的猜测是构建被一次又一次地调用,所以它自动使用原始位置值。我该如何解决?
我只想在屏幕上拖动小部件,而不是拖放。 但是,每当我离开它并再次开始拖动时,它就会从开始的位置开始被拖动。就好像它被重置了。 我的猜测是构建被一次又一次地调用,所以它自动使用原始位置值。我该如何解决?
我试图在拖放过程中更改节点上的光标,但图像没有改变。我打电话 setCursor()在 DragDetectedEventHandler我的节点。我也试过调用 getParent().setCurso
这个问题已经有答案了: D3.js: Remove force.drag from a selection (3 个回答) 已关闭 7 年前。 我将以下内容附加到 svg 元素 var dragger
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
使用 jsTree 3.0.8 我想允许在树中拖放节点,但它应该只允许通过拖动特定按钮或“拖动 handle ”而不是默认的操作来启动该操作允许拖动行上任意位置的行为。 我通过 Html 填充我的树,
当元素开始被拖动时,我需要修改它。 “开始”回调有两个参数,只有第一个参数对我有用。交易是我正在使用 helper: 'clone' 这使得 event.originalTarget 仅指向“原始”元
我有一个可拖动的 img 元素。现在我想手动触发 drag() 事件,就像我们如何触发 'click' 事件一样 $(element).trigger('click')。谢谢。 这是我的函数定义 $(
这是我的 jsfiddle 代码: http://jsfiddle.net/SMqR9/16/ 您会注意到,在 IE7 中,当您向上拖动一个元素时,它在放置之前一直可见。但是,如果您向下拖动一个元素,
我是 knockout JavaScript 的新手。在我的元素中,我使用了 Knockout 拖放功能。最初我有两个部门,一个是可见的,另一个没有属性显示。当我执行拖动输入功能时,我需要隐藏第一个分
上下文:如下面jsp内输入框中的代码所示,要拖放“fruitTree”中的水果节点。 这在拖放时成功发生。每次我从fruitTree中拖放水果时,先前拖放的水果节点都会被新拖放的水果覆盖。 问题:现在
我想移动一定距离。但是,在我的系统中,存在惯性/拖动/负加速度。我正在使用这样的简单计算: v = oldV + ((targetV - oldV) * inertia) 将其应用于多个帧会使运动“上
我正在使用 Kendo Grid UI。下面是一个相同的例子。 Grid / Column resizing
我有这个页面,我只能在浏览器中访问。有一个HTML元素仅在拖放过程中存在,并且我想在Inspector / Firebug中获取/分析其HTML代码。但是一旦我停止拖动,该元素就会被删除。 有什么方法
这真杀了我。我不小心将文件拖到其他位置时遇到问题。与其他编辑器相比,在vscode中,我似乎更经常为此受害。是否有任何插件,设置或其他使我无法使用鼠标技能的东西? 最佳答案 我有同样的问题。当文件夹意
//The following game has been designed as an educational resource //for Key Stage 1 and 2 children.
我是一名优秀的程序员,十分优秀!