前端智勇大闯关-第二季-第一题

简介: 新春之际,新朋友老朋友,祝大家新年快乐。哈哈,给大家拜个晚年。UED 前端智勇大闯关-第二季(http://ued.taobao.com/quiz2/) 这里给出了第一的答案及实现原理,与大家探讨,可随便吐槽。

 

新春之际,新朋友老朋友,祝大家新年快乐。哈哈,给大家拜个晚年。

UED 前端智勇大闯关-第二季(http://ued.taobao.com/quiz2/

这里给出了第一的答案及实现原理,与大家探讨,可随便吐槽。
题目:请画一个三角形穿过4个点
画这个三角形,相对比较容易。如下图所示:


现在讨论的如何实现画板功能
1、准备画布(新标签canvas)
设置画布的宽高,为canvas设置属性width及height

var cs = document.getElementById("ktest");
var mcs = cs.getContext('2d');


2、画一条线段

obj.beginPath();
obj.moveTo(x1,y1);
obj.lineTo(x2,y2);
obj.strokeStyle = "#000000";
obj.stroke();
obj.closePath();


3、画圆形

obj.beginPath();
obj.arc(left,top,radius,0,360,false);
obj.fillStyle = "#FF0000";
obj.fill();
obj.closePath();


4、画线、画圆形

cs.onmousedown(e){
    //记录初始位置
    document.onmousemove = function(e){
        //记录移动位置
        //移动时,要清空画布,重新填充画布
    }
    document.onmouseup= function(e){
        //记录结束位置
    }
}


5、限制坐标的位置

x = e.clientX - cs.offsetLeft; //相对画布的水平位置
y = e.clientY - cs.offsetTop; //相对画布的垂直位置
if(x > csWidth){
   x = csWidth;  //csWidth画布的宽度
}
else if(x<0){
   x = 0;
}
if(y>csHeight){
   y = csHeight;  //csHeight画布的高度
}
else if(y <0 ){
   y = 0;
}



6、直线公式,熟悉吧,亲切吧,是不是想起来初高中学的几何了,还有。。。

//没啥说的,套公式。画直线
var A1 = y2 - y1;
var B1 = x1 - x2;
var C1 = y1*(x2 - x1) -x1*(y2 - y1);
A1*x + B1*y + C1 = 0



7、圆心到直线的距离,等于半径时相切一个交点,小于半径时相交两个交点,大于半径时相离零个交点。大概是这个意思,熟悉吧、亲切吧,是不是想起来初高中学的几何了,还有。。。

//没啥说的,套公式
(Math.abs(A1*50+B1*50+C1)/Math.sqrt(A1*A1+B1*B1))<radius) ||
((Math.abs(A2*50+B2*50+C2)/Math.sqrt(A2*A2+B2*B2))<radius)||
((Math.abs(A3*50+B3*50+C3)/Math.sqrt(A3*A3+B3*B3))<radius)

下图所示能满足上面的判断条件,实际上并没有全部穿过四个圆

8、追加判断,上面的是直线,而三角形是线段组成

(x1<60||x2<60||x3<60)&&(x1>140||x2>140||x3>140)&&
(y1<60||y2<60||y3<60)&&(y1>140||y2>140||y3>140)

 


示例:

<!DOCTYPE html> <html> <head> <title>前端智勇大闯关-第二季-第一题-www.cnblogs.com/kuikui</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <div style="border:1px solid #000;width:400px;height:400px;background: #FFF;color:#000;"> <canvas id="ktest" width="400px" height="400px" style="background: #FFF;position: relative;">请用IE9+,firefox,chrome等浏览器</canvas> </div> <script> (function(){ window.onload = function(){ var cs = document.getElementById("ktest"); var mcs = cs.getContext('2d'); var csWidth = cs.clientWidth; var csHeight = cs.clientHeight; var radius = 10; var status = 0; var x1 = null; var y1 = null; var x2 = null; var y2 = null; var x3 = null; var y3 = null; function circle(obj,params){ params.l=params.l?params.l:0; params.t=params.t?params.t:0; obj.beginPath(); obj.arc(params.l,params.t,radius,0,360,false); obj.fillStyle = "#FF0000"; obj.fill(); obj.closePath(); } function line(obj,params){ params.x1 = params.x1?params.x1:0; params.y1 = params.y1?params.y1:0; params.x2 = params.x2?params.x2:0; params.y2 = params.y2?params.y2:0; obj.beginPath(); obj.moveTo(params.x1,params.y1); obj.lineTo(params.x2,params.y2); obj.strokeStyle = "#000000"; obj.stroke(); obj.closePath(); } function limitWH(e){ x = e.clientX - cs.offsetLeft; y = e.clientY - cs.offsetTop; if(x > csWidth){ x = csWidth; } else if(x<0){ x = 0; } if(y>csHeight){ y = csHeight; } else if(y <0 ){ y = 0; } return {"x":x,"y":y}; } function createCircle(){ circle(mcs,{"l":50,"t":50}); circle(mcs,{"l":150,"t":50}); circle(mcs,{"l":50,"t":150}); circle(mcs,{"l":150,"t":150}); } createCircle(); cs.onmousedown = function(e){ e = e || window.event; status++; if(1===status){ x1 = e.layerX; y1 = e.layerY; document.onmousemove = function(e){ e = e || window.event; mcs.clearRect(0,0,csWidth,csHeight); createCircle(); var tmpx = limitWH(e).x; var tmpy = limitWH(e).y; line(mcs,{"x1":x1,"y1":y1,"x2":tmpx,"y2":tmpy}); }; document.onmouseup= function(e){ e=e||window.event; x2 = limitWH(e).x; y2 = limitWH(e).y; document.onmousemove = null; document.onmouseup = null; }; } if(status===2){ document.onmousemove = function(e){ e = e || window.event; x3 = limitWH(e).x; y3 = limitWH(e).y; mcs.clearRect(0,0,csWidth,csHeight); createCircle(); line(mcs,{"x1":x1,"y1":y1,"x2":x2,"y2":y2}); line(mcs,{"x1":x1,"y1":y1,"x2":x3,"y2":y3}); line(mcs,{"x1":x2,"y1":y2,"x2":x3,"y2":y3}); }; document.onmouseup= function(e){ e=e||window.event; document.onmousemove = null; document.onmouseup = null; var isok1 = false,isok2 = false,isok3 = false,isok4 = false,isok5 = false; var A1 = y2 - y1; var B1 = x1 - x2; var C1 = y1*(x2 - x1) -x1*(y2 - y1); var A2 = y3 - y2; var B2 = x2 - x3; var C2 = y2*(x3 - x2) - x2*(y3 - y2); var A3 = y1 - y3; var B3 = x3 - x1; var C3 = y3*(x1 - x3) - x3*(y1 - y3); if(((Math.abs(A1*50+B1*50+C1)/Math.sqrt(A1*A1+B1*B1))<radius) ||((Math.abs(A2*50+B2*50+C2)/Math.sqrt(A2*A2+B2*B2))<radius)||((Math.abs(A3*50+B3*50+C3)/Math.sqrt(A3*A3+B3*B3))<radius)){ isok1 = true; } if(((Math.abs(A1*150+B1*50+C1)/Math.sqrt(A1*A1+B1*B1))<radius) ||((Math.abs(A2*150+B2*50+C2)/Math.sqrt(A2*A2+B2*B2))<radius)||((Math.abs(A3*150+B3*50+C3)/Math.sqrt(A3*A3+B3*B3))<radius)){ isok2 = true; } if(((Math.abs(A1*50+B1*150+C1)/Math.sqrt(A1*A1+B1*B1))<radius) ||((Math.abs(A2*50+B2*150+C2)/Math.sqrt(A2*A2+B2*B2))<radius)||((Math.abs(A3*50+B3*150+C3)/Math.sqrt(A3*A3+B3*B3))<radius)){ isok3 = true; } if(((Math.abs(A1*150+B1*150+C1)/Math.sqrt(A1*A1+B1*B1))<radius) ||((Math.abs(A2*150+B2*150+C2)/Math.sqrt(A2*A2+B2*B2))<radius)||((Math.abs(A3*150+B3*150+C3)/Math.sqrt(A3*A3+B3*B3))<radius)){ isok4 = true; } if((x1<60||x2<60||x3<60)&&(x1>140||x2>140||x3>140)&&(y1<60||y2<60||y3<60)&&(y1>140||y2>140||y3>140)){ isok5 = true; } if(isok1 && isok2 && isok3 && isok4 && isok5){ alert("太棒了!"); } else{ alert("抱歉,请重试..."); } status = 0; mcs.clearRect(0,0,csWidth,csHeight); createCircle(); }; } } } })(); </script> </body> </html>

目录
相关文章
|
域名解析 缓存 前端开发
2018春招前端面试: 闯关记(精排精校) | 掘金技术征文
年末研发组解散失业, 选择回去学车了,也顺利拿到了驾照,最近回归大深圳,开始踏上漫漫的找工作之路。
375 0
|
前端开发 JavaScript
前端智勇大闯关-第二季-第二题
元宵节快乐,哈哈哈。。。搬运工之解 HTML:  CSS: // textarea样式 .mtextarea{ height: 140px; width: 260px; border: 1px solid #CCCCCC; margin-left:...
956 0
|
前端开发
前端智勇大闯关-第二季-第三题
前端智勇大闯关-第二季-第三题10的世界在我们的世界里,字母A很好理解键盘兄表示65无压力CPU表示01000001才是王道 1、题目中描述的三句话:二进制与十进制与A之间的相互转换2、在textarea元素中包含了一长串的二进制编码(0和1的世界)3、下图展示由二进制码转换成字母的过程每八位一组由二进制转化十进制,由十进制找到对应的asc码,将这些asc码每四个组成一组,再转换成十进制,最后,把十进制转成成asc码,对应的字母相应的就出来了。
911 0
|
前端开发 存储
前端智勇大冲关-第四关-12小球称重问题
有关前端智勇大冲关已给出了前三道题的解答,开始给出第四道题的解答,可能会有些出入,仅供大家的参考与学习。如果有误,请大家帮忙更正,谢谢。 balls[]   定义长度为12的数组status   定义小球的轻重状态   -1代表轻   0代表正常  1代表重 随机生成-1或1两种状态的一种,并随机放在balls数组中,并记录这个坏球在数组中的位置 下面是我给出了一个简单的模拟示例。
1024 0
|
前端开发
前端智勇大冲关
有关淘宝ued前端智勇大冲关的解答一、先给出每一关的地址第一关:http://ued.taobao.com/quiz/index.php 第二关:http://ued.taobao.com/quiz/?ZzCMnTucu2VlfOC2xqrWQL4FY20 第三关:http://ued.taobao.com/quiz/?PGKPkziU7DRlfOC2xqrWQbMOY2w 第四关:http://ued.taobao.com/quiz/?PDSLnWnHvWplfOC2xqrWRLIFY2o 二、分析每一关的解答 第一关:考察css问题,考点在于字体颜色与背景颜色一样。
1268 0
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
1500 14
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
873 0
|
SpringCloudAlibaba JavaScript 前端开发
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
分布式组件、nacos注册配置中心、openfegin远程调用、网关gateway、ES6脚本语言规范、vue、elementUI
谷粒商城笔记+踩坑(2)——分布式组件、前端基础,nacos+feign+gateway+ES6+vue脚手架
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。
736 6