用html+canvas+js實如今網頁上畫直線曲線很容易。可是怎麼判斷本身畫出來的是什麼形狀呢,好比判斷畫出來的是否是直線,是否是曲線,是否是三角形。今天就先來說下:若是判斷canvas和js畫出來的是否是直線,很少說先看效果圖。 javascript
下面就來說下思路css
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style type="text/css">
body {
background-color: black;
}
canvas {
background-color: white;
}
</style>
<script type="text/javascript">
function atan(x, y) {
return Math.atan(y / x) * 180 / Math.PI;
}
//檢測是否是直線
function checkIsLine(pointArray) {
if (pointArray === null || pointArray === undefined || pointArray.length < 3) {
return false;
}
// console.log(pointArray);
var startX = pointArray[0].x;
var startY = pointArray[0].y;
var endX = pointArray[pointArray.length - 1].x;
var endY = pointArray[pointArray.length - 1].y;
var tan = atan(endX - startX, endY - startY);
// console.log("tan" + tan);
for (let i in pointArray) {
// console.log(pointArray[i]);
if (i > 4) {
var tantemp = atan(pointArray[i].x - pointArray[i - 4].x,
pointArray[i].y - pointArray[i - 4].y);
// console.log("tantemp" + tantemp);
if (Math.abs(tantemp - tan) > 16) {
return false;
}
}
}
return true;
}
window.onload = function () {
var oc = document.getElementById('c1');
var ogc = oc.getContext('2d');
oc.onmousedown = function (ev) {
var pointArray = [];
var ev = ev || window.event;
ogc.moveTo(ev.clientX - oc.offsetLeft, ev.clientY - oc.offsetTop);
document.onmousemove = function (ev) {
var point = new Object();
point.x = ev.clientX;
point.y = ev.clientY;
pointArray.push(point);
var ev = ev || window.event;
ogc.lineTo(ev.clientX - oc.offsetLeft, ev.clientY - oc.offsetTop);
ogc.stroke();
};
document.onmouseup = function () {
var isLine = checkIsLine(pointArray);
console.log("是不是直線:" + isLine);
document.onmousemove = null;
document.onmouseup = null;
};
}
}
</script>
</head>
<body>
<canvas id="c1" width="400" height="400">
</canvas>
</body>
</html>
複製代碼
咱們是經過對比臨近點直接的正切值(tan值)來看是否是直線的。好比我畫條線是有100個點組成的。 經過下面函數求出正切角html
//第一個點(x1,y1)和第100個點(x100,y100)
//下面x=x100-x1,y=y100-y1;
function atan(x, y) {
return Math.atan(y / x) * 180 / Math.PI;
}
複製代碼
這樣就能求出首尾兩點之間的正切值。 而後再遍厲組成直線的100個座標點。對比相近兩個點的正切值是否和首尾求出來的正切值,若是相同或者偏差不大。就說明畫出來的是個直線了。java
//檢測是否是直線
function checkIsLine(pointArray) {
if (pointArray === null || pointArray === undefined || pointArray.length < 3) {
return false;
}
// console.log(pointArray);
var startX = pointArray[0].x;
var startY = pointArray[0].y;
var endX = pointArray[pointArray.length - 1].x;
var endY = pointArray[pointArray.length - 1].y;
var tan = atan(endX - startX, endY - startY);
// console.log("tan" + tan);
for (let i in pointArray) {
// console.log(pointArray[i]);
if (i > 4) {//這裏相隔4個點比較一次
var tantemp = atan(pointArray[i].x - pointArray[i - 4].x,
pointArray[i].y - pointArray[i - 4].y);
// console.log("tantemp" + tantemp);
if (Math.abs(tantemp - tan) > 16) {//容許偏差在16度
return false;
}
}
}
return true;
}
複製代碼
這樣就能夠判斷畫出來的是否是直線了。canvas