Java 计算坐标点距离,平行线交点算法详解( 三 )


PS: x1 ,x2,y1,y2 只是表示的变量,不是数值*2哦 。别弄混了 。
 
int k1 = (pointB.y - pointA.y) / (pointB.x - pointA.x); //线段1的斜率int k2= (pointD.y - pointC.y) / (pointD.x - pointC.x); //线段2的斜率point.x =(point.y-pointB.y)/k1+porintB.x; // 根据线段1的点斜式公式可以得到的方程组point.x =(point.y-pointD.y)/k2+porintD.x; // 根据线段2的点斜式公式可以得到的方程组point.y = k1(point.x-pointA.x)+pointA.y; point.y = k2(point.x-pointC.x)+pointC.y; 在上面的计算过程中,x和y的两种算法得到的结果是相同的 。我们先求x轴坐标的话,从y的两个等式进行计算 。得到以下方程组:
k1(point.x-pointA.x)+pointA.y-(k2(point.x-pointC.x)+pointC.y)=0; //第一步//第一步去除乘法括号k1*point.x-k1*pointA.x+pointA.y-(k2*point.x-k2*pointC.x+pointC.y)=0;//去除所有的括号k1*point.x-k1*pointA.x+pointA.y-k2*point.x+k2*pointC.x-pointC.y=0;//由于point.x 是未知数,其他的都是已知数 。我们将未知数和已知进行等式的移动, 从左边移动到右边的时候,正负要互换k1*point.x-k2*point.x=k1*pointA.x-pointA.y-k2*pointC.x+pointC.y;//左边的等式可以继续简化(k1-k2)*point.x = k1*pointA.x-pointA.y-k2*pointC.x+pointC.y;//确保左边只有一个point.x 这个未知变量point.x= (k1*pointA.x-pointA.y-k2*pointC.x+pointC.y)/(k1-k2);通过上面的推导,当我们知道线段1的斜率,线段2的斜率 。以及线段1的某个坐标点坐标 。线段2的某个坐标点坐标 。
我们就可以直接通过公式:(k1*pointA.x-pointA.y-k2*pointC.x+pointC.y)/(k1-k2)计算出交点的x轴坐标 。
当我们知道x轴坐标 。之后通过y2=K(x2-x1)+y1点斜式方程的变种 。直接计算y轴的坐标:
point.x = (k1*pointA.x-pointA.y-k2*pointC.x+pointC.y)/(k1-k2);point.y = k1(point.x-pointA.x)+pointA.y; //直接得到Y值的坐标 上面计算y轴坐标是使用的线段1的斜率进行计算的 。所以x1和y1的值需要时线段1上的坐标点 。
我们也可以使用线段2进行计算得到y轴值:
 
point.y = k2(point.x-pointC.x)+pointC.y; //直接得到Y值的坐标 
到这里,我们就可以得到斜线的交点了 。我们总结一下方法:
publicPoint getCross1(Point pointA, Point pointB, Point pointC, Point pointD) {Point point =new Point();if (pointA.x - pointB.x == 0) {//线段1 两个坐标的x轴相等 说明是垂直x轴的情况,它们的交点x轴就是pointA的x轴point.x= pointA.x ;//解释1:线段1垂直X轴,所以它的斜率值计算是0.无法计算,所以我们使用线段2的坐标计算斜率 。//解释2:我在其他方法中判断过平行线的情况,所以如果线段1垂直,那么线段2肯定不会垂直 。//因为是交点,所以交点坐标是满足线段2的斜率公式的 。int k = (pointD.y-pointC.y)/(pointD.x-pointC.x);//解释3:代入公式:y2=K(x2-x1)+y1 。在已知x2,x1,y1,K的情况下求y2point.y= k*(point.x-pointC.x)+pointC.y;}else if (pointC.x - pointD.x == 0) {//线段2 垂直X轴的情况 。它们的交点X轴就是线段2中的坐标的X轴point.x = pointC.x;//解释1:线段2垂直X轴,所以它的斜率值计算是0.无法计算,所以我们使用线段1的坐标计算斜率 。int k = (pointB.y - pointA.y) / (pointB.x - pointA.x);//代入公式 进行计算y轴坐标值(zinyan.com)point.y =k * (point.x - pointA.x) + pointA.y;}else if(pointA.y-pointB.y==0){//说明线段1,平行于X轴point.y= pointA.y;//使用线段2,计算斜率K 。因为线段1平行x轴是没有斜率的int k = (pointD.y-pointC.y)/(pointD.x-pointC.x);//代入公式: x2=(y2-y1)/K+x1在已知y2,y1,K,x1的情况下求x2point.x = (point.y - line2start.y) / k + line2start.x;}else if(pointD.y-pointC.y==0){//说明线段2,平行于X轴point.y = pointD.y;int k = (pointB.y-pointA.y)/(pointB.x-pointA.x);//使用线段1,计算斜率K 。因为线段2平行x轴是没有斜率的point.x =(point.y - line1start.y) / k + line1start.x;}else{int k1 = (pointB.y - pointA.y) / (pointB.x - pointA.x); //线段1的斜率int k2= (pointD.y - pointC.y) / (pointD.x - pointC.x); //线段2的斜率point.x = (k1*pointA.x-pointA.y-k2*pointC.x+pointC.y)/(k1-k2);point.y = k1(point.x-pointA.x)+pointA.y; //直接得到Y值的坐标}return point;}到这里,我们其实就可以获取交点了 。而除此以外,我们还可以通过斜截式公式,来计算交点
3.3 斜截式计算交点我们上面的推导过程使用的都是点斜式的公式进行的 。其实我们还可以通过直线的斜截式方程:y=kx+b来进行推导直线的交点 。相较于点斜式,个人认为斜截式可能会更容易理解吧 。
在公式中,K表达的是斜率 。斜率计算公式在上面有介绍 。就不重复了
而y和x就是我们的坐标点的Y轴值和X轴值 。b就是Y轴截距 。


推荐阅读