Html5画钟表盘/指针实时跳动

1、最终效果
  时钟、分钟、秒指针连续移动

2、完整代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Clock in canvas</title>
    <script type="text/javascript" charset="utf-8" src="Scripts/Jquery/jquery-1.9.1.min.js"></script>
    <script>
        $(function () {
            var container = $('.container');
            var clockPanel = $('.clockPanel', container).get(0);
            var ctx = clockPanel.getContext('2d');

            var r = 100;
            var point = { X: 150, Y: 150 };
            drawCircle(ctx, point, r);

            var clockPointer = $('.clockPointer', container).get(0);
            var ctxPointer = clockPointer.getContext('2d');


            var run = function () {
                drawPointer(ctxPointer, point, r, new Date());
                requestAnimFrame(run);
            }
            run();
        })

        function drawCircle(ctx, point, r) {
            ctx.beginPath();
            ctx.arc(point.X, point.Y, r, 0, Math.PI * 2, true);
            ctx.stroke();

            ctx.beginPath();
            ctx.arc(point.X, point.Y, 4, 0, Math.PI * 2, true);
            ctx.fillStyle = "#ccc";
            ctx.fill();
            ctx.closePath();
            for (var i = 0; i < 60; i++) {
                drawScale(ctx, point, r, 5, i);
            }
        }

        function drawScale(ctx, point, r, len, scale) {
            var angle = 360 * scale / 60 * 2 * Math.PI / 360

            if (scale % 5 == 0) {
                len = len + 3
                ctx.lineWidth = 3;
            }
            else {
                ctx.lineWidth = 1;
            }
            var sX = point.X - (r - len) * Math.sin(angle);
            var sY = point.Y - (r - len) * Math.cos(angle);
            var eX = point.X - r * Math.sin(angle);
            var eY = point.Y - r * Math.cos(angle);

            ctx.beginPath();
            ctx.strokeStyle = "#ccc";
            ctx.moveTo(sX, sY);
            ctx.lineTo(eX, eY);
            ctx.stroke();
            ctx.closePath();
        }

        function drawPointer(ctx, point, r, time) {
            ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
            var hours = time.getHours();
            var minutes = time.getMinutes();
            var seconds = time.getSeconds();
            var minSec = time.getMilliseconds();
            var angleS = 2 * Math.PI * (60 * 1000 - seconds * 1000 - minSec) / (60 * 1000);
            var esX = point.X - (r - 5) * Math.sin(angleS);
            var esY = point.Y - (r - 5) * Math.cos(angleS);

            var eSec = { X: esX, Y: esY };
            drawLine(ctx, point, eSec, 1);

            var angleM = 2 * Math.PI * (60 * 60 - minutes * 60 - seconds) / (60 * 60);
            var emX = point.X - (r - 10) * Math.sin(angleM);
            var emY = point.Y - (r - 10) * Math.cos(angleM);

            var eMinu = { X: emX, Y: emY };
            drawLine(ctx, point, eMinu, 2);

            var angleH = 2 * Math.PI * ((24 * 60 * 60 - hours * 60 * 60 - minutes * 60 - seconds) % (12 * 60 * 60)) / (12 * 60 * 60);
            var ehX = point.X - (r - 15) * Math.sin(angleH);
            var ehY = point.Y - (r - 15) * Math.cos(angleH);

            var eHour = { X: ehX, Y: ehY };
            drawLine(ctx, point, eHour, 3);
        }

        function drawLine(ctx, pointS, pointE, lineWidth) {
            ctx.lineWidth = lineWidth;
            ctx.beginPath();
            ctx.strokeStyle = "#808080";
            ctx.moveTo(pointS.X, pointS.Y);
            ctx.lineTo(pointE.X, pointE.Y);
            ctx.stroke();
            ctx.closePath();
        }

        window.requestAnimFrame = (function () {
            return window.requestAnimationFrame ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame ||
            window.oRequestAnimationFrame ||
            window.msRequestAnimationFrame ||
            function (run) {
                window.setTimeout(run, 16);
            };
        })();
    </script>
    <style>
        .container {
            width: 300px;
            height: 300px;
            /*background: orange;*/
            margin: 0 auto;
            position: relative;
        }

        canvas {
            position: absolute;
        }
    </style>
</head>
<body>
    <div class="container">
        <canvas class="clockPanel" height="300" width="300"></canvas>
        <canvas class="clockPointer" height="300" width="300"></canvas>
    </div>
</body>
</html>

3、实现重点

    window.requestAnimFrame = (function () {
            return window.requestAnimationFrame ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame ||
            window.oRequestAnimationFrame ||
            window.msRequestAnimationFrame ||
            function (run) {
                window.setTimeout(run, 16);
            };
        })();

 

 

转载于:https://www.cnblogs.com/zhanqun/p/5736060.html

<think>好的,用户的问题是关于使用神经网络模型或方法来绘制钟表图形。首先,我需要理解用户的具体需求。钟表图形可能包括表盘指针、数字等元素,可能需要生成静态图像或动态变化的图像。接下来,我要考虑现有的神经网络模型,哪些适合生成这种结构化的图形。 首先想到的是生成对抗网络(GAN),比如DCGAN,它常用于生成逼真的图像。但钟表图形结构规则,可能不需要逼真,而是需要精确的几何形状。这时候,GAN生成的结果可能不够准确,容易出现扭曲的指针或不均匀的数字分布。 然后是变分自编码器(VAE),它可以在潜在空间中学习数据的分布,生成新图像。不过VAE生成的图像通常比较模糊,可能不适合需要清晰线条的钟表图形。 接下来,考虑矢量生成的方法,比如神经矢量图形(NVG)。这类模型直接生成矢量图形,如直线、圆弧,可能更适合钟表的几何结构。例如,使用基于序列的模型如Transformer或RNN,按步骤绘制钟表的各个部分,如先表盘,再数字,最后指针。 另外,结合注意力机制的模型可能有用,特别是在定位不同部件的位置时,比如指针的角度、数字的位置。还有,条件生成模型可能适用,用户可以提供时间作为条件输入,生成对应时间的钟表图像。比如,输入“3:15”,模型生成指针指向3和15钟表。 还需要考虑数据的问题。训练这样的模型需要大量的钟表图像数据,或者使用程序化生成的数据集。后者可能更可行,因为可以生成不同样式、时间的钟表图像,并带有对应的标签(如时间、指针角度等)。 另外,是否有结合传统计算机图形学的方法?比如用神经网络控制参数,生成SVG路径。这类方法可以借助神经网络的生成能力,同时保持图形的精确性。例如,DiffVG项目将矢量图形渲染与深度学习结合,允许优化SVG参数。 可能还需要分层生成,先生成表盘,再生成指针,分步骤进行。这可以通过级联的神经网络模型实现,或者使用图网络来建模部件之间的关系。 最后,要验证这些方法的可行性,可能需要查阅相关文献。比如,是否有研究使用神经网络生成几何图形或钟表,或者结合符号回归的方法。此外,程序化生成与神经网络的结合可能也是一个方向,比如用神经网络优化程序化生成的参数,使其更符合真实数据分布。 总结下来,可能的解决方案包括使用条件GAN或VAE生成钟表图像,但需要注意结构准确性;使用神经矢量图形模型生成矢量格式的钟表;或者结合传统图形学方法,用神经网络控制生成参数。同时,合成数据集和分步骤生成可能是关键。</think>要绘制具有几何特征的钟表图形,可采用以下神经网络方法结合计算机图形学原理: ### 1. 条件生成对抗网络(CGAN) 通过输入时间参数(如$t=14:30$)生成对应钟表图像,网络结构需包含: $$G(z|t): \mathbb{R}^d \times \mathcal{T} \rightarrow \mathbb{R}^{H\times W\times 3}$$ 其中时间参数$t$通过嵌入层转化为条件向量[^2] ### 2. 神经矢量图形(NVG) 采用基于路径的生成方式: ```python class ClockGenerator(nn.Module): def __init__(self): super().__init__() self.path_predictor = TransformerModel() # 预测SVG路径参数 def forward(self, time_input): # 生成表盘指针的贝塞尔曲线参数 circles = self.path_predictor(time_input[:,:2]) hands = self.path_predictor(time_input[:,2:]) return combine_svg(circles, hands) ``` ### 3. 图神经网络(GNN) 建模钟表组件关系: - 节表盘、时针、分针、刻度 - 边:空间位置关系 - 通过图卷积传播几何约束 ### 4. 混合方法(神经网络+传统渲染) 使用神经网络预测参数,结合canvas绘图指令: ```python def draw_clock(hour, minute): # 神经网络预测参数 params = neural_net(torch.tensor([hour, minute])) # 传统图形渲染 ctx.beginPath() ctx.arc(params['center'], params['radius'], 0, 2*math.pi) # 表盘[^1] ctx.strokeStyle = params['color'] # 样式控制[^1] # 绘制预测的指针角度 draw_hand(params['hour_angle'], params['minute_angle']) ``` ### 5. 强化学习方法 设置奖励函数强化几何精度: $$R(\theta)=\sum_{i=1}^n e^{-\alpha|\theta_{pred}^{(i)}-\theta_{gt}^{(i)}|}$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值