- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在学习 html5 Canvas ,我正在制作一个程序,使用 .rotate() 函数围绕页面中心旋转一个正方形,但它留下了距离正方形原来位置 1px 的线即使我每次都在填充 Canvas ,并且代码中没有任何内容是 1px。有人可以解释一下为什么会发生这种情况以及如何阻止它发生
谢谢!
const canvas = document.getElementById("canvas")
const ctx = canvas.getContext("2d")
canvas.width = 300;
canvas.height = 300;
//debugger;
/*
canvas.addEventListener("mousedown", mouseDown, false)
canvas.addEventListener("mouseup", mouseUp, false)
canvas.addEventListener("mousemove", mouseMove, false)
*/
ctx.fillStyle = "#303030";
ctx.fillRect(0, 0, canvas.width, canvas.height)
ctx.translate(150, 150)
let turnSquare = setInterval(() =>{
ctx.fillStyle = "#303030"
ctx.fillRect(0, 0, canvas.width, canvas.height)
ctx.rotate(degree(10))
ctx.beginPath()
ctx.fillStyle = "lime"
ctx.fillRect(0, 0, 100, 100)
}, 1000 / 20)
function degree(input){
return 2 * Math.PI / 360 * input
}
<canvas id="canvas">
最佳答案
您得到 ~1px 行的原因是因为用于清除 Canvas 的 ctx.fillRect 是通过用于绘制框的相同转换进行转换的。
渲染形状时,其边缘为 anti-aliased ,一些边缘像素被绘制为半透明,这意味着在同一框上绘制将留下一些原始像素。
在清除 Canvas 之前将变换重置为默认值。 ctx.setTransform(1,0,0,1,0,0);
使用变量来保存盒子的总旋转(参见示例)
使用 setTransform
替换当前变换,而不是使用 ctx.translate
和 ctx.rotate
分阶段构建变换。
Transform basics同时帮助理解如何使用 setTransform
在 2D canvas API 中定位、缩放和旋转渲染对象。
requestAnimationFrame
而不是 setInterval
调用动画循环,以确保尽可能流畅的动画。box
保存了为框设置动画所需的所有相关数据。box.rotSpeed
设置为每秒旋转requestAnimationFrame(mainLoop);
const ctx = canvas.getContext("2d")
canvas.height = canvas.width = 300;
canvas.style.backgroundColor = "#303030"
const box = {
color: "lime",
cx: 0.25, // x rotation center as fraction of box size
cy: 0.25, // y rotation center as fraction of box size
x: 150,
y: 150,
size: (150 * 150 / 2) ** 0.5, // makes diagonal size of box 150
rot: 0,
rotSpeed: 0.5, // in rotations per second
};
function drawBox(box) {
box.rot += box.rotSpeed * Math.PI / 30; // 2*PI/60 is one rotation per second at 60FPS
ctx.fillStyle = box.color;
const xa = Math.cos(box.rot);
const ya = Math.sin(box.rot);
ctx.setTransform(xa, ya, -ya, xa, box.x, box.y);
ctx.fillRect(-box.cx * box.size, -box.cy * box.size, box.size, box.size);
}
function mainLoop() {
ctx.setTransform(1, 0, 0, 1, 0, 0); // set default transform
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawBox(box);
requestAnimationFrame(mainLoop);
}
<canvas id="canvas">
关于javascript - 当使用 .rotate() 时,它会留下 1px 线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60298308/
目前,我在单击我的正文时打开一个新选项卡,但它将焦点更改为子窗口。但我想通过留下窗口来做到这一点,这样弹出窗口就不会被阻止,并且我可以将焦点放在当前窗口上。 以下代码当前正在运行 /** * For
我有一个带有线性渐变的 css 背景图像。 CSS 代码: .footer-about { display: flex; align-items: center; justif
在服务中包含以下代码(假设在快速端点上): async function (res, req, next) { const fetch = require('node-fetch'); awa
我正在使用 IImageList 和 SHGetFileInfo 为任何给定路径提取巨型图标。一旦我有了它,然后我使用 DrawIconEx 将 HICON 渲染到 HBITMAP 中,最终使用 GD
我有图表并计算了网络密度,现在我应该只保留具有最大权重的分支(网络密度的前 10%,例如 200 中权重最大的 20 个分支)。我找不到该怎么做? 最佳答案 这个问题有点令人困惑,因此,如果稍后出现更
我一直在尝试使用 jquery 创建一种效果,当您将鼠标移到一个 div 上时,整个 body 都会移动,并沿着它经过的点留下一条轨迹。我创建了一个可以使整个 body 移动的功能,但我找不到离开轨迹
我想在桌面上显示放大和缩小图标(控件),而仅在移动设备上浏览时显示 gps 图标。我正在使用这个 css https://unpkg.com/leaflet@1.1.0/dist/leaflet.cs
相关代码(索引为数组大小): typedef struct elemento { unsigned long linha; unsigned long coluna; doub
我有一个 div,因此当我单击时,它会切换为展开或缩回。它在所有浏览器上都运行良好,尽管有一点让我很感兴趣。在谷歌浏览器上,当它缩回时,它会在运动中留下细线。 www.rezoluz.com/logi
每当我的应用程序尝试通过调用 CreateDIBSection() 或使用 LR_CREATEDIBSECTION 标志调用 LoadImage() 来创建 DIB 部分时,它似乎都会成功返回。它返回
我想在 Protractor 测试中脱离 Selenium 控制流。 以下是我迄今为止遇到的步骤和问题: 1。逐个测试禁用它 我的第一个想法是使用 SELENIUM_PROMISE_MANAGER 以
我正在构建一个部署在 CentOS 7.2 上的 ASP.Net Core (netcore 1.1) 应用程序。 我有一个通过 System.Diagnostics.Process 调用外部进程(也
我正在为我的网站创建一个聊天小部件。用户将能够输入纯文本 - 没有 html。 为了消除 HTML 标记并允许用户使用“”,我正在接受他们的输入并在用户屏幕的输入上使用 strip_tags() 和输
我是一名优秀的程序员,十分优秀!