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

 
那么,方法中的坐标点,有前后要求么?答案是没有的 。只需要知道这个直线上的任意两点就可以 。
点斜式斜率公式:K=(y2-y1)/(x2-x1)?也可以写为:K=(y1-y2)/(x1-x2) 这两个公式的结果是等值的 。
公式中的K?就是斜率值,而x和y是坐标点X轴和Y轴的值 。
将上面的公式进行简单的变换,我们可以得到:

  • y2=K(x2-x1)+y1
  • x2=(y2-y1)/K+x1  
也就是说,x1,y1 是已知的坐标点 。斜率K也知道的情况下 。我们如果知道交点的X轴就可以计算出Y轴坐标 。反之当我们知道Y轴坐标也可以计算出X轴坐标 。
3.2 计算线段交点在某种情况下,交点坐标的某个值是可以快速确定的 。例如其中一条线段垂直X轴 。或者平行于X轴 。那么它们两个线段的交点的X轴或者Y轴就是已经明确了 。
例如有坐标点:Point pointA?, Point pointB?, Point pointC?, Point pointD 。其中 pointA 和 pointB 组合成线段1,pointC 和pointD组合成线段2 。
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肯定不会垂直 。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轴坐标值point.y =k * (point.x - pointA.x) + pointA.y;}return point;}可以得到垂直的,而平行于x轴的情况也可以参照上面的示例进行额外处理:
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轴坐标值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轴是没有斜率的zinyan.compoint.x =(point.y - line1start.y) / k + line1start.x;}return point;} 通过上面的方法,应该给大家详细介绍了 。线段平行或者垂直情况下 。快速计算交点的运算逻辑 。
但是,如果线段并不垂直或者平行于X轴或者Y轴 。那么如何计算呢?在实际处理过程中,不垂直才是最多的场景 。所以上面的方法还需要进行扩充 。
仍然使用:Point pointA?, Point pointB?, Point pointC?, Point pointD  这四个坐标点,计算未知的交点 。
假如交点坐标是Point point 。我们来一步步推导相关的方程组 。
int k1 = (pointB.y - pointA.y) / (pointB.x - pointA.x); //线段1的斜率int k2=(pointD.y - pointC.y) / (pointD.x - pointC.x); //线段2的斜率 线段1的斜率和线段2的斜率肯定是不一样的 。但是线段公式中斜率是一个常量 。也就是说只要是直线上的任意两点,计算出来的斜率是固定的 。我们再根据点斜式公式的变种:y2=K(x2-x1)+y1? 和x2=(y2-y1)/K+x1 。可以得到以下:


推荐阅读