计算机图形学中直线连接算法的Javascript实现

本文介绍了如何使用JavaScript在浏览器中实现简单DDA和Bresenham算法来绘制平滑直线。通过创建像素表格并定义点类,代码详细展示了如何构造直线并绘制出'Hello World'。
摘要由CSDN通过智能技术生成

之前在想如何使用Javascript实现时钟的时候,被一个问题难到了:如何在像素级别绘制平滑的直线。

在网上查了一下,后来在图书馆里的一本关于计算机图形学的老书里发现了解决方案。针对这个问题,书上提供了三个算法,分别是简单DDA,对称DDA,Bresenham算法。

下面的是我使用简单DDA和Bresenham算法在浏览器上绘制Hello world的代码。

这里的Hello world 分别是定义了字母的一些”节点“,然后使用连线算法绘制出来的。

代码:

  1. //构造画布,使用DOM动态生成表格
  2. var _container = document.getElementById("container");
  3. var pixs = new Array();
  4. var canvasTbody = document.createElement("tbody");
  5. var bgColor = "black";
  6. var fontColor = "green";
  7. var pix_size = "4px";
  8. var pix_numbs = 81;
  9. var temp_tr ;
  10. var temp_td ;
  11. var temp_pixrow;
  12. for(var i = pix_numbs; i >= 0 ; i--){
  13.     temp_tr = document.createElement("tr");
  14.     temp_tr.style.height = pix_size;
  15.     temp_pixrow = new Array();
  16.     for(var j = 0; j <= pix_numbs ; j++){
  17.         temp_td = document.createElement("td");
  18.         temp_td.style.width=pix_size;
  19.         temp_td.style.backgroundColor = bgColor;
  20.         temp_tr.appendChild(temp_td);
  21.         temp_pixrow[j] = temp_td;
  22.     }
  23.     canvasTbody.appendChild(temp_tr);
  24.     pixs[i] = temp_pixrow;
  25. }
  26. var canvasTable = document.createElement("table");
  27. canvasTable.style.backgroundColor = "black";
  28. canvasTable.setAttribute("cellspacing","0");
  29. canvasTable.setAttribute("cellpadding","0");
  30. canvasTable.appendChild(canvasTbody);
  31. _container.appendChild(canvasTable);
  32. // 点 类,包含坐标信息,有绘制和比较操作
  33. function point(_x,_y){
  34.     this.x = _x;
  35.     this.y = _y;
  36. }
  37. function _draw(){
  38.     if(this.x > pix_numbs || this.y > pix_numbs){
  39.         return;
  40.     }
  41.     pixs[this.y][this.x].style.backgroundColor = fontColor;
  42. }
  43. point.prototype.draw = _draw;
  44. function _equal(_p){
  45.     if(! _p instanceof point){
  46.         throw new Error();
  47.     }
  48.     if(this.x == _p.x && this.y == _p.y){
  49.         return true;
  50.     }else{
  51.         retu
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值