- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 canvas 元素中,lineTo
和 arc
方法实际上将 float 视为 float 吗?
例如:
context.moveTo(20.4562, 80.8923);
context.lineTo(120.1123, 90.2134);
context.arc(24.5113, 36.7989, 20.123, 0, Math.PI*2);
canvas是真的支持 float 坐标,还是画直线、圆弧、矩形等时只是将 float 转为整数?
最佳答案
位图本身不支持浮点值。它只能处理整数值。 Canvas 的 2D 上下文主要处理路径,每个 SE 不连接到位图。
路径是任意的,在内部仅作为向量存在。当它们被描边或填充时,它们将通过光栅化过程,即。转换为位图表示。
位图中的路径及其分配的点本身可以包含小数值,但位图不能。但是,可以使用插值(子像素化)来表示分数值,这给人的印象是具有更大的可用位图分辨率,如果值减少到恰好,这又会消除锯齿状的外观整数。
(而且分辨率是做插值的重点,一个屏幕大约相当于72-96DPI,如果屏幕有更高的分辨率,300+DPI,就不需要插值了,比如打印。但我们现在在那里,如果不使用插值作为对分辨率不足的补偿,绘图会看起来参差不齐。
当像素落在整数边界值上时,将像素设置为该值是一种简单的情况。
当您处理 float 时,没有地方可以设置部分像素,它必须向下舍入(floor'ed)或放置在下一个单元格(ceil'ed)中,即。 3.2 变成 3,3.7 变成 4 等等。
然而,几十年前有人提出了将小数部分表示为实际像素和下一个像素之间的混合的想法。
如果像素值为 3.5,小数部分在这里表示 50% 的黑色和 50% 的白色。它仍然会占据一个完整的像素单元,但由于它是如此之小,它看起来只占据了其单元的一小部分,这要归功于造成幻觉的周围像素。
所以在这种情况下,最后一个像素集看起来像这样:
如果值为 3.25,则只有 25% 的剩余像素会被混合,使最后一个像素看起来像:
这将应用于所有落在分数值上的像素。当您绘制一条对角线并且一些点“穿过”两个像素时,这些点的混合将应用于基于闭合整数的放置,使该线看起来平滑。
现在,在 Canvas 的情况下,形状是用 alpha channel 插值的。然后使用 Porter-Duff 将形状与现有内容混合和合成,这就是我们看到的最终结果。
关于性能,这也是需要牢记的一点。如果需要插值,成本会上升,因为对于每个像素,浏览器(或子系统)必须计算分数表示。出于这个原因,您可以确保使用整数值,在将它们传递给路径方法之前将它们四舍五入。这当然不适用于圆弧、椭圆、某些角度的对角线等,但在某些情况下它可以帮助加快速度。
这是使用分数坐标时适用的插值原理。然而,还有更复杂的插值和子像素方式。在现代世界中,2x2 或 4x4 采样更常见以提供更准确的结果。
如果我们放大一条小线,当我们改变分数值时,我们可以看到线的末端“淡入”和“淡出”。
这条线是 3 个像素宽,然后我们在 [0, 1] 之间添加一个分数值给它,我们可以看到最后一个 ceil'ed 像素正在重新采样:
var ctx = document.querySelector("canvas").getContext("2d"),
x = 3.1, dx = 0.1;
ctx.imageSmoothingEnabled = ctx.mozImageSmoothingEnabled = ctx.webkitImageSmoothingEnabled = false;
ctx.font = "14px sans-serif";
(function loop() {
ctx.fillStyle = "#000";
ctx.clearRect(0,0,350,50);
ctx.fillRect(0,0, x, 1); // forces pixel-alignment for demo
ctx.drawImage(ctx.canvas, 0,0,4,1, 0, 0, 200, 50);
x += dx;
if (x <= 3 || x >= 4) dx = -dx;
info(x);
document.querySelector("div").innerHTML = "length: " + x.toFixed(2);
setTimeout(loop, 160)
})();
function info(x) {
ctx.fillStyle = "#f00";
ctx.fillText("Perceived length", 210, 19);
ctx.fillRect(0, 15, x * 50, 2);
ctx.fillRect(x*50-1, 12, 2, 7);
x = x === 3 ? 3 : 4;
ctx.fillText("Actual length", 210, 40);
ctx.fillRect(0, 35, x * 50, 2);
ctx.fillRect(x*50-1, 32, 2, 7);
}
div {font:bold 14px sans-serif}
<canvas width=500 height=50></canvas><br>
<div></div>
关于html - canvas画直线或圆弧时是否支持 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29371695/
这一章实现的连接线,目前仅支持直线连接,为了能够不影响原有的其它功能,尝试了2、3个实现思路,最终实测这个实现方式目前来说最为合适了。 请大家动动小手,给我一个免费的 Star 吧~ 大家
本章分享一下如何使用 Konva 绘制基础图形:矩形、直线、折线,希望大家继续关注和支持哈! 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue
本章响应小伙伴的反馈,除了算法自动画连接线(仍需优化完善),实现了可以手动绘制直线、折线连接线功能。 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Is
我有一条线(两点(x,y)(x1,y1))和一个带有焦点(rx,ry)的矩形。我需要帮助找出线和矩形之间的碰撞点,C++ 中的一个例子会有所帮助。 最佳答案 我不知道如何仅用“焦点”来表示矩形。您将需
让我们画一条线和一个圆: canvas.create_line(x0,y0,x1,y1) canvas.create_oval(x0,y0,x1,y1) 如何计算每个像素的像素数? 最佳答案 你不能。
本文实例讲述了php使用gd2绘制基本图形。分享给大家供大家参考,具体如下: 应用GD2函数可以绘制的图形有多种,最基本的图形包括条、圆、方形等。无论开发人员绘制多么复杂的图形,都是在这些最基本的
我已经尝试了所有改变颜色的方法: call s:h("Underlined", {"fg": s:norm, "gui": "underline", "cterm": "underline"})
为什么以下行有时会在 chrome 开发控制台中产生消息“未定义不是函数”: (callbackOrUndefined || function() {})(); 这个想法是,如果回调为真,即函数,则执
我想在 MS Chart 中实现直线(分段拟合)图表。 我知道 X 轴上的点 [最小值 = 1.4,最大值 = 2.2]。我已将所有这些点都放在折线图上。 现在的要求是我如何知道 X 轴上的点 [最小
所以我正在使用 charts.js http://www.chartjs.org/我试图使 2 个点之间的线是直线而不是弯曲的,没有明显的原因。 现在看起来是这样的 http://imgur.com/
我已将我的机器人发布到 Azure。现在我要开发自己的聊天用户界面。我想在 JavaScript 中使用 Direct Line API 来调用机器人。 如何在 JavaScript 中使用 Dire
这个有点难解释。我有一个整数列表。因此,例如,[1, 2, 4, 5, 8, 7, 6, 4, 1] - 当根据元素编号绘制时,它类似于凸图。我如何以某种方式从列表中提取此“形状”特征?它不必特别准确
我在学习 javaScript 和 jQuery 的第一周,我正在尝试制作一些动画。 基本上我想要做的就是让这些箭头从屏幕开始,从一侧进入,通过 throw 目标,然后离开屏幕的另一侧。 理想情况下,
假设我有一个向导并且有 3 个部分,假设它是这样的。 [A]----[B]----[C] 假设当前在范围内选择了 A。这是一个彩色的红色圆圈。当 B 在范围内被选中时,就可以移动一个对象(假设一条彩色
我正在使用 botframework-directlinejs NodeJS SDK 为我的机器人前端实现一个新 channel 。该 channel 将提供一些自定义反向 channel 功能;但是
我正在使用直线执行 hql 查询。该作业似乎没有出现在 HDP 2.6 上 Spark History 服务器的资源管理器中。如何让它运行在 Yarn 上? 谢谢 最佳答案 Beeline 是一个 A
我目前正在尝试找到一种如何使用 Google Maps Api V3 获得直线路线的方法。 我已经设法使用地理编码和方向服务来获取从 A 点到 B 点的路线,包括两条替代路线。我还尝试过“无高速公路”
我有一个简单的 Canvas html5。它可以通过选择选项绘制一些形状,如直线、圆形、矩形、多边形,但现在我想让所有绘制都可拖动(如果可能的话)可调整大小,没有 3 部分库,只有纯 JS。
我正在使用在 Kerberos 中添加的帐户启动 beeline 来测试 Sentry: beeline -u "jdbc:hive2://IP:10000/;principal=test_table
我正在使用普通的 html/javascript Canvas (无库)。我有一种从两点计算 Angular 方法,我的理论是,我获取 Angular 并通过循环所需的水平距离 (x) 并对该 Ang
我是一名优秀的程序员,十分优秀!