js判断向量叉点 并求出交点坐标
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>判断线段相交并求交点</title>
<style>
.title{text-align:center;}
.wrapper{width: 500px;height: 500px;margin: 0 auto;border: 1px solid #000000;}
.content{position: relative;height: 500px;}
.dot{position: absolute;width:1px;height: 1px;overflow: hidden;font-size:0;line-height: 0; background: #333;} </style>
</head>
<body>
<h1 class="title">判断相交并求交点</h1>
<div class="wrapper">
<div class="content" id="content"></div> </div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
<script>
//*********定义加载模块方法 start **************//
(function (window, undefined) {
if (window.define) {
return
}
function isFunction(obj) {
return Object.prototype.toString.call(obj) === "[object Function]"
} var MM = {};
var initModuleName = "initRun"; function require(name) {
if (!MM[name]) {
throw new Error("Module " + name + " is not defined.")
}
var module = MM[name];
if (module.inited === false) {
runModule(name)
}
return module.ret
} function runModule(name) {
var exports = {};
var module = MM[name];
if (isFunction(MM[name].factory)) {
var ret = MM[name].factory.apply(undefined, [require, exports, undefined]);
module.ret = ret === undefined ? exports : ret
} else {
module.ret = MM[name].factory
}
module.inited = true
} function define(name, deps, factory) {
if (MM[name]) {
throw new Error("Module " + name + " has been defined already.")
}
if (isFunction(deps)) {
factory = deps
}
MM[name] = {factory:factory, inited:false};
if (name === initModuleName) {
runModule(name)
}
} window.define = define
})(window);
//*********定义加载模块方法 end **************//
(function(){
/**
* 可以缓存的操作节点
*/
var $dom = {
content : $('#content')
}
define('Mode/drawLine',function(require){
var drawLine = function(){};
drawLine.prototype = {
/**
* @根据两坐标画线段
* @param vector1
* @param vector2
*/
draw : function(vector1 ,vector2){
var k = (vector2.y - vector1.y)/((vector2.x - vector1.x));//求斜率k
var y,x ;_lineHtml = [];//用来保存xy变量坐标
var maxX = Math.max(vector2.x,vector1.x),
minX = Math.min(vector2.x,vector1.x),
maxY = Math.max(vector2.y,vector1.y),
minY = Math.min(vector2.y,vector1.y); //利用长度相隔比较大的作为循环确保画的线段质量高些
if((maxX-minX) > (maxY - minY) || (maxX-minX) == (maxY - minY)){
for(var i = minX;i<maxX;i++){
y = k * (i - vector1.x) + vector1.y;
_lineHtml.push('<div class="dot" style="left:'+ i +'px;top:'+ y +'px"></div>'); } }else{
for(var i = minY;i<maxY;i++){
x = (i - vector1.y)/k + vector1.y;
_lineHtml.push('<div class="dot" style="left:'+ x +'px;top:'+ i +'px"></div>'); } } $dom.content.append(_lineHtml.join('')) ; } ,
/**
* @desc求交点坐标具体算法见http://www.cnblogs.com/rubyxie/articles/3548450.html
* @param vector1
* @param vector2
* @param vector3
* @param vector4
* @return {Object}交点坐标
*/
computeCrossVector : function (vector1 ,vector2,vector3 ,vector4){
var crossVector = {},
v1 = {"x" : vector2.x - vector1.x , "y" : vector2.y - vector1.y},
v2 = {"x" : vector4.x - vector3.x , "y" : vector4.y - vector3.y};
var product = v1.x * v2.y - v1.y * v2.x; //两向量的乘积
//计算二阶行列式的两个常数项
var const1 = vector1.x * v1.y - vector1.y * v1.x ;
const2 = vector3.x * v2.y - vector3.y * v2.x ; crossVector.x = (const2 * v1.x - const1 * v2.x)/product;
crossVector.y = (const2 * v1.y - const1 * v2.y)/product; return crossVector; }
,
//向量叉乘
crossMul: function (v1, v2) {
return v1.x * v2.y - v1.y * v2.x;
}
,
checkLineCross : function(vector1 ,vector2,vector3 ,vector4){ var v1 = {x: vector1.x - vector3.x, y: vector1.y - vector3.y},
v2 = {x: vector2.x - vector3.x, y: vector2.y - vector3.y},
v3 = {x: vector4.x - vector3.x, y: vector4.y - vector3.y},
v = this.crossMul(v1, v3) * this.crossMul(v2, v3),
v1 = {x: vector3.x - vector1.x, y: vector3.y - vector1.y},
v2 = {x: vector4.x - vector1.x, y: vector4.y - vector1.y},
v3 = {x: vector2.x - vector1.x, y: vector2.y - vector1.y}; return (v <= 0 && this.crossMul(v1, v3) * this.crossMul(v2, v3) <= 0) ? true : false; } };
return drawLine; }); /**
* @desc 模块启动函数
*/
define('initRun',function(require){
var vector1 = {"x" :50 ,"y":100 }, //定义四个向量坐标
vector2 = {"x" :180 ,"y":400 },
vector3 = {"x" :10 ,"y":104 },
vector4 = {"x" :200 ,"y":104 }; var drawMode = require("Mode/drawLine");
var line = new drawMode; line.draw(vector1,vector2);
line.draw(vector3,vector4); if(line.checkLineCross(vector1,vector2,vector3,vector4)){
var cross = line.computeCrossVector(vector1,vector2,vector3,vector4);
$dom.content.append('<div>交点坐标为:x坐标为 '+ cross.x + ' y坐标 :'+cross.y+'</div>'); }else{
alert("这两向量线段未相交");
}
}) })();
</script>
</body>
</html>
js判断向量叉点 并求出交点坐标的更多相关文章
- poj 1269 Intersecting Lines——叉积求直线交点坐标
题目:http://poj.org/problem?id=1269 相关知识: 叉积求面积:https://www.cnblogs.com/xiexinxinlove/p/3708147.html什么 ...
- fzu 1015 土地划分(判断线段相交+求出交点+找规律)
链接:http://acm.fzu.edu.cn/problem.php?pid=1015 Problem 1015 土地划分 Accept: 714 Submit: 1675Time Lim ...
- js判断文件类型大小并给出提示
上传文件是工作中常用的功能,不同的场景对不同的文件类型和文件大小都有不同的要求: <form id="uploadForm" method="post" ...
- js判断软键盘是否开启弹出
移动端关于页面布局,如果底部有position:fixed的盒子,又有input,当软键盘弹出收起都会影响页面布局.这时候Android可以监听resize事件,代码如下,而ios没有相关事件. va ...
- 提交Form表单,submit之前做js判断处理
效果: 在点击提交按钮时,首先进行js判断, 如果不符合条件,则alert出提示信息,并return false. 主要点就在于给form表单添加一个onsubmit事件. 在onsubmit事件中定 ...
- JS 判断 Radio 单选按钮是否为选中状态 并弹出 值信息
今天项目中所解决的问题:JS 判断 Radio 单选按钮是否为选中状态 并弹出 值信息,一开始总是获取不到 radio 的值,后来发现逻辑存在些问题,特此共享该代码留笔记 和 分享给遇到 这类问题的 ...
- js判断是否是ie浏览器且给出ie版本
之前懒得写判断ie版本js,因为网上关于这方面的代码太多了,所以从网上拷贝了一个,放到项目上才发现由于时效性的问题,代码不生效.就自己写一个吧. 怎么去看浏览器的内核等信息 ---- js的全局对象w ...
- 快速判断&求出区间相交的长度
有两个区间A[a1,b1], B[a2,b2],判断这两个区间有没有交集.我们可以分为两种思维来判断: /** *思路就是如果两个区间不相交,那么最大的开始端一定大于最小的结束端 **/ if(max ...
- 黑马基础阶段测试题:定义一个int类型的数组,数组中元素为{5,7,3,9,4}。求出数组中的最小值,并判断最小值是否为偶数,如果是偶数则输出“最小值为偶数”,如果不是偶数则输出“最小值为奇数”。打印如下:
package com.swift; import java.util.Arrays; public class ArrayTest { public static void main(String[ ...
随机推荐
- ASP Base64位 加密解密
网上找了很多,运行时都会提示某个错误,有点乱.后面找到测试,这个转ASNI码的能实现 sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabc ...
- [C#学习笔记]你真的理解拆箱装箱吗?
学习一项新知识的时候,最好的方法就是去实践它. 前言 <CLR via C#>这本神书真的是太有意思了!没错我的前言就是这个. 装箱 首先来看下,下面这段代码 可以看到,每次循环迭代都会初 ...
- pageadmin 网站建设系统如何新建进程池并在站点中使用
1.打开iis管理界面,右键应用程序池,点击添加应用程序池,添加界面如下图,注意pageadmin cms net版本选择4.0,托管模式建议选择集成模式. 2.添加完毕后,在网站中点击对应站点,点击 ...
- 2018年秋PTA乙级回顾
距离上次我一个人参加PAT考试已经过去快一个学期了,想想上次自己也是搞笑,自己一个人被这个书包就去了ZZ,人生地不熟的,乘坐公交车还坐反了.考完试因为不知道要等到考试结束就可以领取成绩证书,自己连那张 ...
- 【Oracle 12c】最新CUUG OCP-071考试题库(54题)
54.(12-15) choose the best answer: View the Exhibit and examine the structure of the ORDER_ITEMS and ...
- 【文文殿下】【HAOI2008】硬币购物
题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 数据规模 di,s<=1 ...
- Ubuntu下实现socks代理转http代理
代理(英语:Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接.一些网关.路由器等网络设备具备网络代理功能. ...
- html中object和embed标签的区别
♦object定义一个嵌入的对象.请使用此元素向您的 XHTML 页面添加多媒体.此元素允许您规定插入 HTML 文档中的对象的数据和参数,以及可用来显示和操作数据的代码. ♦<object&g ...
- Laravel5.5 引入并使用第三方类库操作
理论上,Laravel5系列都支持,各位可以一试.我这里使用5.5版本. 我这里引入了一个将汉字转化为拼音的类库测试,一起来看看吧! 首先,在laravel的app目录下自定义一个文件夹,我用的名字是 ...
- Linux服务器核心参数配置
使用Linux作为长连接的web服务器时,为了增加服务的容量,以及处理性能,需要修改一些参数. 一.多进程绑定CPU 1.使用taskset命令可以绑定进程到指定CPU,以减少多核CPU环境中,单进程 ...