whycxzp
2025-04-02 506168ae540c5aabb34f97a46a6248cd73b77f8b
src/main/java/com/whyc/util/PointUtil.java
@@ -4,7 +4,7 @@
public class PointUtil {
    public static void main(String[] args) {
        double a1 = 1, b1 = 2;
        /*double a1 = 1, b1 = 2;
        double a2 = 3, b2 = 4;
        double x0 = 9, y0 = 9;
        Point p1 = new Point(1, 2);
@@ -18,7 +18,17 @@
        System.out.println("Intersection Point P3: (" + p3[0] + ", " + p3[1] + ")");
        String position = determinePosition(a1, b1, a2, b2, x0, y0);
        System.out.println("Point P is on the " + position + " of the line P1P2.");
        System.out.println("Point P is on the " + position + " of the line P1P2.");*/
        double x0 = 5, y0 = 5;
        double x1 = 0, y1 = 0;
        double x2 = 2, y2 = 2;
        double proportion = calculateProportion(x0, y0, x1, y1, x2, y2);
        if (proportion >= 0) {
            System.out.println("垂足到mstPointStart的距离占整条线段长度的比例是: " + proportion);
        } else {
            System.out.println("垂足不在线段上");
        }
    }
    public static double[] findIntersection(double a1, double b1, double a2, double b2, double x0, double y0) {
@@ -77,5 +87,50 @@
            return "line";
        }
    }
    /**
     * 计算点到线段的距离占线段长度的比例
     * @param x0 垂足x点
     * @param y0 垂足y点
     * @param x1 起点x点
     * @param y1 起点y点
     * @param x2 终点x点
     * @param y2 终点y点
     * @return
     */
    public static double calculateProportion(double x0, double y0, double x1, double y1, double x2, double y2) {
        // 向量 AB
        double ABx = x2 - x1;
        double ABy = y2 - y1;
        // 向量 AP
        double APx = x0 - x1;
        double APy = y0 - y1;
        // 向量积 AB × AP
        double crossProduct = ABx * APy - APx * ABy;
        if (crossProduct == 0) {
            // 点在直线上,判断是否在线段上
            double dotProduct = APx * ABx + APy * ABy;
            double squaredLengthAB = ABx * ABx + ABy * ABy;
            double t = dotProduct / squaredLengthAB;
            if (t >= 0 && t <= 1) {
                return t; // 垂足到mstPointStart的距离占整条线段长度的比例
            }  else if (t < 0) {
                //点在mstPointStart的延长线上
                return 0;
            } else {
                //点在mstPointEnd的延长线上
                return 1;
            }
        } else {
            return -1; // 点不在直线上
        }
    }
}