一个canvas中strokeStyle的疑问

本文详细解析了HTML Canvas元素中红色圆弧绘制的过程及关键代码逻辑,包括strokeStyle与stroke方法的使用顺序对绘图颜色的影响,以及Canvas的基本命令与样式设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!DOCTYPE html>
<html>
 <head>
    <meta charset="utf-8">
    <title>Canvas</title>
 </head>
 <style type="text/css">
    body{margin:20px auto; padding:0; width:800px; }
    canvas{border:dashed 2px #CCC}
 </style>
 <script type="text/javascript">
    function pageLoad(){
        var can = document.getElementById('can');
        var cans = can.getContext('2d');
        cans.arc(400,300,200,0,Math.PI,1);
        cans.strokeStyle = 'red';
        cans.lineWidth = 10;
        cans.stroke();
    }
 </script>
<body onload="pageLoad();">
    <canvas id="can" width="800px" height="600px"></canvas>
</body>
</html>

这个效果是圆弧是红色,但是如果strokeStyle在后面,就不会显示红色。为什么?

        cans.lineWidth = 10;
        cans.stroke();
        <pre name="code" class="html">        cans.strokeStyle = 'red';<pre name="code" class="html">



canvas中的常用命令

canvas画布设置width和height,里面的xy是相对画布的左上角开始0,0.

lineWidth=3,制定线的粗细

strokeStyle,指定边框的颜色

stroke()

实心的fillStyle的颜色设置

fill();


canvas设置的css样式,建议就是行间设置。

js中可以用canvas.Width和canvas.Height设置画布的宽度和高度。

<think>好的,用户现在想让我用原生的JavaScript写一个3D三角形。之前他可能遇到了问题,只发了一个问号,然后我引导他提供更多细节,现在他具体问到了这个需求。我需要先理解他的具体要求。 首先,用户提到“JS原生”,这意味着他可能不想用Three.js这样的库,而是直接用WebGL或者其他底层API。不过WebGL本身比较复杂,用原生JS的话可能需要较多的代码。不过用户可能希望的是使用Canvas的2D上下文来模拟3D效果,或者真的用WebGL实现。需要进一步判断。 用户之前提到过Three.js模型不动的问题,所以可能他对WebGL或Three.js有一定了解,但这次想尝试原生实现。也有可能他是在学习基础,想从底层开始理解3D渲染的原理。这时候我需要考虑如何用最简单的方式展示一个3D三角形,可能包括旋转效果,让他能看到立体感。 接下来,我需要考虑使用哪种技术方案。如果使用Canvas 2D来模拟3D投影,可以通过计算三维坐标到二维的投影,然后绘制三角形。这种方法虽然性能不高,但代码相对简单,适合教学。而如果直接使用WebGL,虽然更接近原生,但代码量会大很多,涉及着色器、缓冲区等概念,对新手可能不太友好。 用户可能更希望看到一个简单易懂的例子,所以选择Canvas 2D模拟3D可能更合适。这样可以在不引入复杂库的情况下,展示如何计算3D坐标并渲染到2D画布上。同时,加入旋转动画,让三角形动起来,这样能直观地看到3D效果。 然后,我需要构建一个基本的HTML结构,包含Canvas元素,并设置其大小。接着,在JavaScript中获取上下文,定义三角形的三维顶点。接下来需要处理投影,将3D点转换为2D画布上的坐标。这里需要考虑视角的位置和投影矩阵,或者使用简单的透视投影公式。 为了简化,可以采用正交投影或者基本的透视投影。比如,将3D点的z坐标用来计算缩放,模拟远小近大的效果。然后,处理旋转,让三角形绕Y轴旋转,这样用户可以看到动态效果。 在绘制过程中,需要计算每个顶点旋转后的坐标,然后应用投影变换得到2D坐标,绘制三角形。同时,每一帧都要清除画布,重新计算旋转角度,形成动画循环,比如使用requestAnimationFrame。 可能需要注意的问题包括坐标系的转换,比如3D坐标系到Canvas的2D坐标系的转换,可能需要调整原点位置和Y轴方向。此外,旋转矩阵的计算是否正确,以及动画的流畅度。 另外,用户可能对代码的每一步都有疑问,所以需要确保代码结构清晰,注释详细。同时,可能需要解释为什么选择这样的投影方式,以及旋转矩阵的应用。 最后,提供一个完整的代码示例,用户可以直接复制运行,看到旋转的三角形。如果有必要,还可以补充说明如何调整参数,比如旋转速度、三角形的大小或颜色,以满足用户可能的进一步需求。</think>好的!以下是一个使用原生 JavaScript(配合 Canvas 2D 上下文)实现的 **3D 三角形旋转动画**的示例。虽然没有使用 WebGL,但通过数学投影模拟了 3D 效果: ```html <!DOCTYPE html> <html> <head> <title>原生JS 3D三角形</title> <style> canvas { border: 1px solid #ccc; } </style> </head> <body> <canvas id="myCanvas" width="400" height="400"></canvas> <script> const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); // 定义三角形的3D顶点坐标 (x, y, z) const points = [ { x: 0, y: 100, z: 0 }, // 顶点 { x: -100, y: -100, z: 0 }, // 左下 { x: 100, y: -100, z: 0 } // 右下 ]; // 视角参数 const cameraZ = 300; // 摄像机Z轴位置 // 动画旋转角度 let angle = 0; function project(point) { // 3D投影到2D屏幕(简单透视投影) const scale = cameraZ / (cameraZ - point.z); return { x: point.x * scale + canvas.width / 2, y: point.y * scale + canvas.height / 2 }; } function rotateY(point, angle) { // 绕Y轴旋转 return { x: point.x * Math.cos(angle) - point.z * Math.sin(angle), y: point.y, z: point.x * Math.sin(angle) + point.z * Math.cos(angle) }; } function draw() { ctx.clearRect(0, 0, canvas.width, canvas.height); // 旋转三角形 const rotatedPoints = points.map(p => rotateY(p, angle)); // 投影到2D const projectedPoints = rotatedPoints.map(project); // 绘制三角形 ctx.beginPath(); ctx.moveTo(projectedPoints[0].x, projectedPoints[0].y); ctx.lineTo(projectedPoints[1].x, projectedPoints[1].y); ctx.lineTo(projectedPoints[2].x, projectedPoints[2].y); ctx.closePath(); ctx.strokeStyle = '#3498db'; ctx.lineWidth = 2; ctx.stroke(); // 更新角度 angle += 0.02; requestAnimationFrame(draw); } // 启动动画 draw(); </script> </body> </html> ``` --- ### **代码解析**: 1. **3D顶点定义**:三角形的三个顶点用 `{x, y, z}` 表示。 2. **投影函数**:`project()` 将3D坐标转换为2D画布坐标(模拟透视效果)。 3. **旋转函数**:`rotateY()` 通过三角函数绕Y轴旋转顶点。 4. **动画循环**:通过 `requestAnimationFrame` 持续更新旋转角度并重绘。 5. **Canvas绘制**:使用2D路径绘制三角形边框。 --- ### **运行效果**: - 你会看到一个蓝色边框的三角形绕Y轴持续旋转。 - 由于是简单投影,Z轴方向没有变化,但可以通过修改顶点Z值(例如 `{x: 50, y: 0, z: 100}`)观察透视效果。 --- 如果需要更真实的3D渲染(光照、深度缓冲等),建议使用 **WebGL**(原生WebGL代码较复杂)或 **Three.js** 库。如果需要进一步优化或扩展此示例,请告诉我! 🚀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值