站酷网络,wordpress 调取文章内容,网站开发报价方案,建设工程合同民法典可能有人要问#xff1a;求交点坐标有什么用呢#xff1f;而且为啥要用线代来求#xff1f;直线方程不行吗#xff1f;#xff1f;#xff1f; 这个问题#xff0c;我只能说#xff0c;直线方程计算的次数过多了#xff0c;而且动不动就要考虑线的方向#xff0c;90的… 可能有人要问求交点坐标有什么用呢而且为啥要用线代来求直线方程不行吗 这个问题我只能说直线方程计算的次数过多了而且动不动就要考虑线的方向90°的直线的斜率不存在所以用向量也就是线性代数来算更好点。至于有什么用处也许一些算法需要吧比如计算一线是否与矩形相交来进行判定。 本教程涉及线代的内容较少除了思想你还会学到 如何判断两线段是否相交相似三角形的性质。一点到另一点的方向。三角函数相关知识。 还有向量叉乘的正负特性向量叉乘的计算单位向量的计算一点至另一点的向量表示方法向量的数量积点积的几何意义与计算。 线性代数的运用举例
求交点本教程将凹多边形分为三角形用于渲染距离一条直线最短的点叉乘各种方向判断问题。 Part 1:怎样判断线段是否相交 此部分需要先理解向量叉乘的意义我先通俗地讲一下 首先看下图。 我们有两个向量v与向量w那么v向量两字省略后面也是如此与w所形成的平行四边形的面积就是v×w的结果×即为叉乘但是叉乘具有正负性 如果v在w的左边那么v×w0也就是负的 如果v在w的右边那么v×w0也就是正的 当v与w重合或相反很容易想到结果是0没有张成平行四边形 总结一下顺时针负逆时针正。 对了对于一个向量[x1,y1]与向量[x2,y2]他们的叉乘就是这两个向量的行列式这句可以看不懂也就是x1*y2-x2*y1。 根据以上结论我们就可以开始研究两条线怎样才会相交。 相交示意图 如图线段AB与线段CD相交连接AB的端点到CD形成向量abcd。 我们发现a叉乘b的结果与d叉乘c异号。 再来看不相交的。 不相交示意图 向量a叉乘b与d叉乘c的的符号一样 接下来看看特殊的。 特殊的不相交 这次a叉乘b与d叉乘c的符号不同这种错误要把d与b互换就行了如下图 更正后的注意向量叉乘时要让端点在同一个地方。 这回a叉乘b与d叉乘c的符号又相同了 总结一下若a(x1,y1),b(x2,y2),c(x3,y3),d(x4,y4)都是向量那么上面的一大堆用数学来表示就是下面这个图 上图中×代表叉乘·代表乘法相乘大于等于就是同号的意思啦。 或者把“或”改为“与”然后把≥改为那么线段就相交反之不相交。 接下来开始用代码实现 这里呢我先简简单单地做了一个绘制系统 然后创建一个自制积木 那么我们就可以写下这样的代码来实现判断两线段是否相交先计算abcd的向量然后根据叉乘公式别忘了就是行列式x1*y2-x2*y1进行判断。 那向量怎么求呢 这个问题有个公式对于在平面直角坐标系内的点A(x1,y1)与点B(x2,y2)向量AB即为[(x2-x1),(y2-y1)] 我们直接上代码。 计算向量 首先是计算向量然后保存在缓存里面并且初始化返回值。接下来我们要进行叉乘并且判断是否0如下图 叉乘并判断 这样一个香蕉 相交判断就做完力可要是判断线段是否在线上那该怎么弄呢 我们知道如果一个向量与另一个向量的夹角为0°或者180°那么他们的叉乘为0。在线上时两个向量分别指向另外两个端点就形成了180度 如果这个点在另条线段的延长线上那么这两个向量的夹角是0° 那如果点在端点上呢 想想看那么一个向量的模长长度就是0了好像怎么叉乘还是0。 那么这3种可能都会出现叉乘为0我们就可以加上等于0的判断返回相应的值。如下图 Part 2计算交点 部分1总算是写完了接下来便是交点坐标的计算。
1.理清思路。 线段AB与CD交于点E 如图点H为C投影至AB的点G同理。投影就是向它做垂线投影长度分别为d1d2。 我们要求的是点E的坐标为此我先讲一下什么是相似三角形六年级即可懂初三及以上学生请跳过 两个三角形 如图AB平行于CF平行于DE由于平行线我们知道图中有大多相同的角都已经标在图中。 我们观察一下这两个三角形三个角或者两个是一样的真的但是他们并不全等像这样三个角都相等的两个三角形我们称它们相似不知道准不准确啊我才初一 对于两个相似三角形它们的对应边长的比值都是相等的。比如 AB/BCDE/DC , AB/DEAC/CE。 不知道你有没有看懂反正就这些了。
再来看刚刚的图 求交点E的坐标 首先我们看三角形DGE与三角形CHE由于俩对顶角相等∠CEH与∠GED而且由于是投影所以有个角都是90度所以这两个三角形相似。 相似那就是比值相等呗那不就是交点(x, y)距离两点的比例则和d1, d2的比例相同吗d1/d2EH/GE 我们看看EH占GH的几分之几呢是EH/GH吧现在由于比例相同我们可以把EH/GH写成d1/(d1d2)的形式{也就是EH/GHEH/(EHGE)d1/(d1d2)}。 同理GE/GH也能写成d2/(d1d2)的形式{也就是GE/GHGE/(EHGE)d2/(d1d2)}。 哎权重占比知道了坐标不就好办了嘛(x,y)就是 H坐标*占比G坐标*占比啊即 注意权重不要写反了 2.计算投影。 你肯定要问我d1d2咋算啊还有你投影坐标是个啥 这就要说一下向量点积·的几何意义了。 向量点积示意图 向量点积的几何意义是一个向量向另一向量投影然后再乘上另一向量的长度模长之后的点与端点的距离。在图中向量AB·向量AD得到AE的长度即AC*AD。 坐向量点积公式1坐标系a·b(x1y1)·(x2y2)x1*x2y1*y2。其中a和b分别为两个向量(x1y1)和(x2y2) 向量点积公式2几何a·b|a|*|b|*cosθ,θ是a,b的夹角 向量叉乘公式几何a·b|a|*|b|*sinθ,θ是a,b的夹角 哎我们发现有个投影那如果上面公式中b的模长长度为1呢 由于点积的几何意义当b的模长为1时a·b就是a向b的投影 那我们就可以计算投影了。 “投影” 给定一个直线外点(x0, y0)和直线上两点(x1, y1), (x2, y2)计算投影点(x, y)。 如何把向量AB投影至向量AC 首先求出AC的单位向量模长为1紫色然后向量AB·紫色向量就得到了AD的长度最后求出AC的方向在AC方向上移动AD长度就是点D的坐标啦。耶 至于AC方向怎么求可以用反三角函数——arctan来求这里不多说直接上代码。 接下来怎么求出单位向量 对于一个向量[x,y]它的单位向量是[x/√(x^2y^2),y/√(x^2y^2)]其实就是向量除以模长。如下图 单位向量公式 那么就剩点积了。 点积 接下来我们就可以计算投影了。 一半的投影由于可能要用缓存所以使用的是倒数第1和2项 啊我们求出AD长度和方向但怎么知道他的横纵坐标呢 求AB与BD 这是刚刚那幅图的一部分我们要求的是AB的x长度和y长度横纵坐标差也就是AB与BD 因为∠AAB90°所以三角形AAB为直角三角形 对于直角三角形我们有一个定理每个角度的三角形三个边都有一个固定的比值。 也就是说在三角形AAB中AB/AB与AA长度也就是BD/AB的值是固定的。 在这里我们把AA叫做角a的邻边AB叫做角a的对边AB叫做角a的斜边。可以不记住 我们把对边与斜边的比叫做正弦记作sin即sin a对/斜 邻边与斜边的比值叫做余弦记作cos即cos a邻/斜; 还有正切tan和反三角等函数感兴趣的可以自己搜我们这次只用sin和cos。 我们知道AB与角a的值了那AB和AA就很好求了 sin aAB/ABAB*sin aAB/AB*ABAB求出来了 cos aAA/ABAB*cos aAA/AB*ABAA 那么横纵坐标差也就求出来了代码如下所示 投影 不要忘记还要算出投影距离勾股定理 最终代码如图所示 更改绘制代码 图像 我们发现投影是个垂线说明程序正常。在做程序时要养成检测的习惯wonderful 3.计算交点坐标 刚刚推出的公式 这是我们刚刚推出的交点坐标公式在这里d1d2和x6y6x5y5我们都可以算出来那么xy也就出来了 首先我们要先把一个线段投影到另一个线段上 线段交点坐标的一部分 然后算出每个点的权重就是d1 d2那个 线段交点坐标的一部分*2 最后将权重与点坐标相乘并相加即为相交点坐标。 线段交点坐标全 Part 3结尾 到此两个线段的交点坐标已经做完了以下是全部代码 所有代码 在绘制与移动区域内我添加了透明度变化防止混淆。 我们来测试一下。 效果展示 资源下载链接 不想写代码的可以下载这个配套资源Scratch 教程作品线段交点坐标 感谢支持