JS画几何图形之六【过直线外一点作垂线】
样例:http://www.zhaojz.com.cn/demo/draw10.html
依赖:【点】、【直线】
//过直线外一点画垂线
function drawVerticalLine(point, line){
//画辅助线-start
var color = 'DarkRed'; //垂线的颜色
var color2 = "#ccc"; //其它辅助线的颜色
drawPoint({
pw:2,ph:2,color:'DarkRed',point: line[0]
});
drawPoint({
pw:2,ph:2,color:'DarkRed',point: line[1]
});
drawLine(point, line[0], {color: color2});
drawLine(point, line[1], {color: color2});
//画辅助线-end drawPoint({
pw:2,ph:2,color:'DarkRed',point: point
}); var v_1_0 = line[1][1]-line[0][1];
var h_1_0 = line[1][0]-line[0][0];
var c_square = Math.pow(v_1_0,2) + Math.pow(h_1_0,2);
var c = Math.sqrt(c_square); //计算直线上两点之间的距离 var a_b_slope = 0;
var hasSlope = true;
if(v_1_0 == 0){
hasSlope = false;
}
a_b_slope = v_1_0/h_1_0; //直线的斜率 var point_pos = 1; //定义point与直线的位置关系
//当直线的斜率大于0时,如果点在直线上方,point_pos = 1,如果点在直线下方,point_pos = 3
//当直线的斜率小于0时,如果点在直线上方,point_pos = 2,如果点在直线下方,point_pos = 4
if(hasSlope){
var a_b_intercept = line[1][1]-a_b_slope*line[1][0];
var p_intercept = point[1]-a_b_slope*point[0];
if(a_b_slope >= 0){
if(p_intercept > a_b_intercept){
point_pos = 3;
}else{
point_pos = 1;
}
}else{
if(p_intercept < a_b_intercept){
point_pos = 2;
}else{
point_pos = 4;
}
}
}
//A为直线与水平线的夹角(锐角)
var sinA = Math.abs(v_1_0)/c; //sinA
var cosA = Math.abs(h_1_0)/c; //cosA
//C为垂线在顺时针方向上与水平线的夹角
var sinC = 0;
var cosC = 0;
//D为过point与line的平行线与水平线的夹角
var sinD = 0;
var cosD = 0;
switch(point_pos){
case 1:
sinC = cosA;
cosC = -sinA;
sinD = -cosC;
cosD = sinC;
break;
case 2:
sinC = cosA;
cosC = sinA;
sinD = cosC;
cosD = -sinC;
break;
case 3:
sinC = -cosA;
cosC = sinA;
sinD = cosC;
cosD = -sinC;
break;
case 4:
sinC = -cosA;
cosC = -sinA;
sinD = -cosC;
cosD = sinC;
break;
default:
}
//过point画line的平行线
drawLine(point, [point[0]+c*cosD, point[1]+c*sinD], {color: 'Red'});
drawLine(point, [point[0]+c*(-cosD), point[1]+c*(-sinD)], {color: 'Red'}); var point_v_1 = point[1]-line[1][1];
var point_h_1 = point[0]-line[1][0];
var point_dist_1 = Math.sqrt(Math.pow(point_v_1,2)+Math.pow(point_h_1,2)); //point到line上一点的距离
var point_v_0 = point[1]-line[0][1];
var point_h_0 = point[0]-line[0][0];
var point_dist_0 = Math.sqrt(Math.pow(point_v_0,2)+Math.pow(point_h_0,2)); //point到line上另外一点的距离
var s = (c+point_dist_1+point_dist_0)/2;
var area = Math.sqrt(s*(s-c)*(s-point_dist_0)*(s-point_dist_1)); //以point、line[0]和line[1]为顶点的三角形的面积
var h = 2*area/c; //三角形的高 var vpoint = [point[0]+h*cosC, point[1]+h*sinC]; //垂点
drawLine(point, vpoint); //画垂线
}
JS画几何图形之六【过直线外一点作垂线】的更多相关文章
- JS画几何图形之一【直线】
JS画图的想法经过大脑的时候,觉得有点意思,所以就实践了一番.JS画图为系列文章,本是讲点.线和面 先看样例:http://www.zhaojz.com.cn/demo/draw5.html 一.点 ...
- JS画几何图形之五【过圆外一点作切线】
样例:http://www.zhaojz.com.cn/demo/draw9.html 依赖:[点].[直线].[圆] //画切线 //point 圆外的一点 //dot 圆心 //r 半径 func ...
- JS画几何图形之三【正弦曲线】
数学式:y=Asin(ωx+φ)+k 样例:http://www.zhaojz.com.cn/demo/draw7.html 依赖:[点].[直线] JS函数的声明: //画正弦曲线 //dot 原点 ...
- JS画几何图形之二【圆】
半径为r的圆上的点p(x,y)与圆心O(x0,y0)的关系: x = x0+rcosA; y = y0+rsinA ,A为弧度 样例:http://www.zhaojz.com.cn/demo/dr ...
- JS画几何图形之四【饼图】
饼图是将一个圆分割为多个扇形. 样例:http://www.zhaojz.com.cn/demo/draw8.html 依赖:[扇形] //饼图 //dot 圆点 //r 半径 //data 数据(一 ...
- MT【45】抛物线外一点作抛物线的切线(尺规作图题)
注1:S为抛物线焦点 注2:由切线的唯一性,以及切线时可以利用MT[42]评得到三角形全等从而得到切线平分$\angle MQS$得到
- 用JS画斐波那契螺旋线(黄金螺旋线)
偶然看到斐波那契螺旋线(黄金螺旋线)的定义及画图方法,试着用JS画了一下,很漂亮,很好玩 具体定义及画法大家查一下就有了,很简单. 以下是代码: <!DOCTYPE html> <h ...
- js画一棵树
用纯js画一棵树.思路: 1.一棵树的图片,作为页面背景: 2.通过html5中的canvas画布进行遮罩: 3.定时每隔10ms,从下往上清除1px的遮罩: <!DOCTYPE html> ...
- jquery.wordexport.js打印echarts.js画出的柱状图
jquery.wordexport.js打印echarts.js画出的柱状图. echarts画出的图是不能直接打印出来的(echarts的柱状图是用canvas画出来的),而jquery.worde ...
随机推荐
- 校门外的树-poj
问题描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种 ...
- 并行设计模式(二)-- Master-Worker模式
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Mast ...
- Nginx配置优化及深入讲解,大家可以听一下
随着访问量的不断增加,需要对Nginx和内核做相应的优化来满足高并发用户的访问,那下面在单台Nginx服务器来优化相关参数. 1) Nginx.conf配置优化: worker_proce ...
- 51Nod 1289 大鱼吃小鱼 栈模拟 思路
1289 大鱼吃小鱼 栈模拟 思路 题目链接 https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1289 思路: 用栈来模拟 ...
- 关于AJAX使用中出现中文乱码的问题
自己初学AJAX,遇到一个棘手的bug就是xmlHttp.open("get",url,false);url里面有中文,结果出现乱码.不过最后在百度,和诸位博主的帮助下,成功解决了 ...
- 小tip:生成一组不重复的随机数(去重的方法)
var arr = []; for(var i=0;i<150;i++){ // num为0-100的随机数 var num = Math.round(Math.random()*100); v ...
- Unity 5--全局光照技术
本文整理自Unity全球官方网站,原文:UNITY 5 - LIGHTING AND RENDERING 简介全局光照,简称GI,是一个用来模拟光的互动和反弹等复杂行为的算法,要精确的仿真全局光照非常 ...
- ettercap的中间人欺骗
环境准备:kali系统 因为kali系统自带ettercap,比较方便, 不需要安装 ifcofing命令查看当前网关 ,当前的IP是: 172.16.42.1 查找局域网所有主机 通过netdisc ...
- IE CSS Bugs 列表和解决方法
我们在开发中我们常会在IE中遇到很多莫名的bug,尤其是老态龙钟的IE6浏览器.为了提高我们的开发效率,需要经常总结,整理工作中遇到的问题.我们在网络上找到的IE Bugs 资料是零散的.不过,在老外 ...
- HDU 2298 Toxophily(公式/三分+二分)
Toxophily Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...