笔记十三(绘制二)

利用quadraticCurveTo(cpx,cpy,x,y)方法绘制曲线,接收两个参数,第一个是控制点,第二个是曲线终点。该形状由一个名为二次贝塞尔曲线的标准算法决定。该曲线会弯向但永不触及控制点。要想曲线穿过某点,使用一下公式:(x0,y0)为起点,(x2,y2)为终点,(x1,y1)作为控制点,(xt,yt)代表要穿过的目标点。

x1 = xt  * 2 - (x0 + x2) / 2
y1 = yt * 2 - (y0 + y2) / 2

创建一个绘制曲线的程序:
文件名:drawing2.html。

<!DOCTYPE html>
<html>
<head>
    <meta charset = "utf-8">
    <title>绘制2</title>
<style>
#canvas{background-color: #99cc33;}
</style>
</head>
<body>
<canvas id="canvas" width="400" height="400"></canvas>
<script src="utils.js"></script>
<script type="text/javascript">
    window.onload = function(){
        var canvas = document.getElementById('canvas'),
            context = canvas.getContext("2d"),
            mouse = utils.captureMouse(canvas),
            x0= 100,
            y0= 200,
            x2= 300,
            y2= 200;
        canvas.addEventListener("mousemove" , function(){
            context.clearRect(0,0,canvas.width,canvas.height);
            var x1 = mouse.x * 2 - (x0+x2)/2,
                y1 = mouse.y * 2 - (y0+y2)/2;
            context.beginPath();
            context.moveTo(x0,y0);
            context.quadraticCurveTo(x1,y1,x2,y2);
            context.stroke();
        },false);
    }
</script>
</body>
</html>

效果图:
曲线效果图

参见《HTML5+Javascript动画基础》。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双缓冲技术可以有效地提高绘图的效率和质量,尤其是在需要频繁更新图像或实现动画效果的情况下。下面介绍一下在 VC++ 如何使用双缓冲技术绘制图片。 1. 创建位图对象 首先,我们需要创建一个位图对象,用于存储要绘制的图片。可以使用 LoadImage 函数从文件加载一个位图,也可以使用 CreateBitmap 函数创建一个空的位图对象,然后使用 SetPixel 或者 BitBlt 等函数将图像数据写入到位图。 2. 创建内存 DC 接下来,我们需要创建一个内存 DC(Device Context)对象,用于在内存绘制图像。可以使用 CreateCompatibleDC 函数创建一个与屏幕兼容的内存 DC 对象。 3. 将位图对象选入内存 DC 将创建的位图对象选入内存 DC ,以便在内存进行绘制操作。可以使用 SelectObject 函数将位图对象选入内存 DC。 4. 绘制图像 在内存 DC 使用 GDI 函数绘制图像,例如使用 DrawImage 或者 BitBlt 函数将图像从源 DC 复制到内存 DC 。 5. 将内存 DC 的图像绘制到屏幕 最后,使用 BitBlt 函数将内存 DC 的图像绘制到屏幕上,将内存的图像复制到屏幕 DC 。 下面是一个简单的示例代码: ``` // 加载位图 HBITMAP hBitmap = LoadImage(NULL, _T("test.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); // 创建内存 DC HDC hMemDC = CreateCompatibleDC(NULL); // 将位图选入内存 DC HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 在内存 DC 绘制图像 // ... // 将内存 DC 的图像绘制到屏幕上 HDC hDC = GetDC(hWnd); BitBlt(hDC, 0, 0, cx, cy, hMemDC, 0, 0, SRCCOPY); ReleaseDC(hWnd, hDC); // 释放资源 SelectObject(hMemDC, hOldBitmap); DeleteDC(hMemDC); DeleteObject(hBitmap); ``` 其,hWnd 是窗口的句柄,cx 和 cy 分别是窗口的宽度和高度。需要注意的是,如果使用了双缓冲技术,就不要直接在窗口 DC 上绘制图像,而是应该在内存 DC 进行操作,最后再将图像绘制到屏幕上。这样可以避免闪烁和卡顿等问题,提高绘图的效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值