判断两个线段是否相交

判断两个线段是否相交

昨天面试,碰到个比较有意思的问题。编码判断两个线段是否相交,无奈水平太菜,这么简单的东西居然没答上来。今天下午整理了一下,写了个实际的demo出来。权当练手吧,具体如下:

解题思路:

1.求两个线段所在直线line1,line2
2.求两条直线的交点point
3.判断point是否在线段1上(也可以判断是否在线段2)上
4.若在,则两条线段相交

具体代码:

HTML:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/html">
<head lang="en">
    <meta charset="UTF-8">
    <title>判断两个线段是否相交问题</title>
    <link rel="stylesheet" href="css/reset.css"/>
    <link rel="stylesheet" href="css/style.css"/>
</head>
<body>
<div class="wrap">
    <h2>判断两个线段是否相交</h2></br></br>
    <p>线段1:
        端点1的x坐标<input type="text" class="inputBtn" value="0"/>
        端点1的y坐标<input type="text" class="inputBtn" value="0"/>
        端点2的x坐标<input type="text" class="inputBtn" value="100"/>
        端点2的y坐标<input type="text" class="inputBtn" value="100"/>
    </p></br>
    <p>线段2:
        端点1的x坐标<input type="text" class="inputBtn" value="0"/>
        端点1的y坐标<input type="text" class="inputBtn" value="100"/>
        端点2的x坐标<input type="text" class="inputBtn" value="100"/>
        端点2的y坐标<input type="text" class="inputBtn" value="0"/>
    </p></br></br>
    <input type="button" value="判断是否相交" class="button" onclick="isIntersection()"/></br></br>
    <span class="result"></span></br>
    <canvas id="mycanvas"></canvas>
</div>
<script src="js/script.js"></script>
</body>
</html>
JS:
function numBewteen(x, y, z) {
    //判断x是否在y和z之间
    if ((x >= y && x <= z) || (x <= y && x >= z)) {
        return true;
    }
    else {
        return false;
    }
}

function drawLines(l11, l12, l21, l22) {
    //绘图
    var canvas = document.getElementById('mycanvas');
    var ctx = canvas.getContext('2d');
    //清空画布
    ctx.clearRect(0, 0, 300, 300);
    ctx.beginPath();
    //线段1
    ctx.moveTo(l11[0], l11[1]);
    ctx.lineTo(l12[0], l12[1]);
    //线段2
    ctx.moveTo(l21[0], l21[1]);
    ctx.lineTo(l22[0], l22[1]);
    ctx.stroke();
    ctx.closePath();


}

function isIntersection() {//判断两个线段是否相交
    var result = document.getElementsByClassName("result")[0];

    //获取两个线段的4个端点,并绘图
    var inputLines = document.getElementsByClassName("inputBtn");
    var l11 = [inputLines[0].value, inputLines[1].value],
        l12 = [inputLines[2].value, inputLines[3].value],
        l21 = [inputLines[4].value, inputLines[5].value],
        l22 = [inputLines[6].value, inputLines[7].value];
    drawLines(l11, l12, l21, l22);
    //计算两条线段所在直线的斜率和截距
    var k1 = (l11[1] - l12[1]) / (l11[0] - l12[0]);
    var k2 = (l21[1] - l22[1]) / (l21[0] - l22[0]);
    var b1 = l11[1],
        b2 = l21[1];

    //计算两条直线的焦点focus
    var point = new Array();
    point[0] = (b1 - b2) / (k2 - k1);
    point[1] = (k2 * b1 - k1 * b2) / (k2 - k1);

    //判断交点是否在线段line1上
    if (numBewteen(point[0], l11[0], l12[0])) {
        result.innerHTML = "线段相交,图示如下";
    }
    else {
        result.innerHTML = "线段不相交,图示如下";
    }
}
最后放一张界面的截图:

这里写图片描述

源码地址:

github/MyDemos

最后的话:

初步实现而已,另外水平有限还实现的太渣。以后有时间再来重构吧。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值