更新说明:
2013-05-27 上传到gitcafe上面拖管 https://gitcafe.com/lcc/somecode/tree/master/jsdraw
写了一段生成象素点来绘制5边形的代码。用到了 Bresenham斜线画法、三角函数等知识。代码如下:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<title>JS绘制五边形</title>
<style type="text/css">
.paper {
width: 600px;
height: 300px;
border-color: #E0E0E0;
border: 1px solid #DDD;
position: relative;
}
.point {
width: 1px;
height: 1px;
position: absolute;
overflow: hidden;
display: block;
zoom: 1;
}
.red {
background-color: red;
}
</style>
<script type="text/javascript">
// 画斜线
function drawLine(point1, point2) {
var point, pointElem, paper;
pointElem = document.createElement('div');
if ('className' in pointElem) {
pointElem.className = 'point red';
}
else {
pointElem.setAttribute('class', 'point red');
}
paper = document.getElementById('paper');
var xLen = Math.abs(point2[0] - point1[0]);
var yLen = Math.abs(point2[1] - point1[1]);
var x, y, cx, cy, tox, toy, rate, rateVal, isAdd = true;
// 从x轴遍历
if (xLen >= yLen) {
if (point1[0] > point2[0]) { point1 = [point2, point2=point1][0]; }
if (point1[1] > point2[1]) { isAdd = false; }
x = cx = point1[0];
y = cy = point1[1];
tox = point2[0];
toy = point2[1];
rateVal = rate = parseInt( (yLen / xLen) * 1000)
for (var i=x; i<tox; i++) {
cx = i;
point = pointElem.cloneNode();
paper.appendChild(point);
point.style.left = cx + 'px';
point.style.top = cy + 'px';
rateVal += rate
if (rateVal >= 1000) {
cy += isAdd ? 1 : -1
rateVal -= 1000;
}
}
}
// 从y轴遍历
else {
if (point1[1] > point2[1]) { point1 = [point2, point2=point1][0]; }
if (point1[0] > point2[0]) { isAdd = false; }
x = cx = point1[0];
y = cy = point1[1];
tox = point2[0];
toy = point2[1];
rateVal = rate = parseInt( (xLen / yLen) * 1000)
for (var i=y; i<toy; i++) {
cy = i;
point = pointElem.cloneNode();
paper.appendChild(point);
point.style.left = cx + 'px';
point.style.top = cy + 'px';
point = null
rateVal += rate
if (rateVal >= 1000) {
cx += isAdd ? 1 : -1
rateVal -= 1000;
}
}
}
// 补点
if (cx != tox || cy != toy) {
point = pointElem.cloneNode();
paper.appendChild(point);
point.setAttribute('style', 'left:' + tox + 'px; top:' + toy + 'px');
point = null
}
pointElem = null;
}
// 获取点信息
function getPointInfo(R, dot) {
var A = 360 / 5
var sinLen = Math.sin(A / 180 * Math.PI) * R
var cosLen = Math.cos(A / 180 * Math.PI) * R
sinLen = Math.round(sinLen)
cosLen = Math.round(cosLen)
var point1 = [dot[0], dot[1] - R]
var point2 = [dot[0] + sinLen, dot[1]- cosLen]
var point5 = [dot[0] - sinLen, dot[1] - cosLen]
var A2 = (180 - A) / 2
sinLen = Math.sin(A2 / 180 * Math.PI) * R
cosLen = Math.cos(A2 / 180 * Math.PI) * R
sinLen = Math.round(sinLen)
cosLen = Math.round(cosLen)
var point3 = [dot[0] + cosLen, dot[1] + sinLen]
var point4 = [dot[0] - cosLen, dot[1] + sinLen]
return [point1, point2, point3, point4, point5];
}
// 画点
function drawShape(type, R, dot) {
var pointInfo = getPointInfo(R, dot)
var point1 = pointInfo[0];
var point2 = pointInfo[1];
var point3 = pointInfo[2];
var point4 = pointInfo[3];
var point5 = pointInfo[4];
// 五边形
if (type == 1) {
drawLine(point1, point2);
drawLine(point2, point3);
drawLine(point3, point4);
drawLine(point4, point5);
drawLine(point5, point1);
}
// 五角星
else if (type == 2){
drawLine(point1, point3);
drawLine(point3, point5);
drawLine(point5, point2);
drawLine(point2, point4);
drawLine(point1, point4);
}
}
window.onload = function () {
drawShape(1, 100, [150, 150])
drawShape(2, 100, [450, 150])
}
</script>
</head>
<body>
<div id="paper" class="paper"></div>
</body>
</html>
效果图:
