การทำงานคือ ป้อนค่า จุดต้น-ปลาย เส้นตรงที่ 1 และ 2 ที่ต้องการหาจุดตัดตามลำดับ
 
สมการหาค่า x, y นี่ หามาจาก
 
(y2-y1) = m(x2-x1)
 
เอา 2 สมการ มาแทนค่าให้เหลือแค่ x
อีกทีก็เอามาแทนค่าให้เหลือ y ตัวเดียว

 
 
public class CrossLinePoint {

    public static void main(String[] args) {
        new CrossLinePoint();
    }

    public CrossLinePoint() {
        Point L1P1 = new Point(0, 0);
        Point L1P2 = new Point(0, 1);
        Point L2P1 = new Point(0, 0);
        Point L2P2 = new Point(1, 0);

        Point meng_result = getCrossLinePoint(L1P1, L1P2, L2P1, L2P2);
    }
 
//รับ Point เข้ามา ซึ่ง Point นี่จะประกอบไปด้วยค่า x และ y
//พารามิเตอร์ของ function นี้คือ
//จุดต้นของเส้นที่1, จุดปลายของเส้นที่1, จุดต้นของเส้นที่2, จุดปลายของเส้นที่2
    public Point getCrossLinePoint(Point l1p1, Point l1p2, Point l2p1,
            Point l2p2) {

        float x, y;
        float x1 = l1p1.getX();
        float y1 = l1p1.getY();
        float x2 = l2p1.getX();
        float y2 = l2p1.getY();
        float m1, m2;
 
//ส่วนสีน้ำเงินตรงนี้เป็นการ มาจากการย้ายข้างของสมการเส้นตรง
//เพื่อหา m ความชัน ให้มาอยู่ข้างเดียว

        m1 = (l1p2.getY() - l1p1.getY()) / (l1p2.getX() - l1p1.getX());

        m2 = (l2p2.getY() - l2p1.getY()) / (l2p2.getX() - l2p1.getX());

        if (m1 == m2) {
 
//ถ้าความชันเท่ากัน ก็คือขนานกัน เส้นมันก็ไม่ตัดกันอะสิ
            System.out.println("not cross");
            return null;
        }
 
//หาค่า Y ที่จุดตัดก่อน
        if (l1p2.getY() == l1p1.getY()) {
//อันนี้คือถ้า Y ของเส้น 1 จุดต้น จุดปลายเท่ากัน แสดงว่าเป็นเส้นแนวนอน ขนานแกน x
            y = l1p2.getY();
        } else if (l2p2.getY() == l2p1.getY()) {
//อันนี้คือถ้า Y ของเส้น 2 จุดต้น จุดปลายเท่ากัน แสดงว่าเป็นเส้นแนวนอน ขนานแกน x
            y = l2p2.getY();
        } else {
//ตรงนี้จุดสำคัญที่สุด เป็นการแทนค่าสมการ 2 ชุด 2 ตัวแปล ย้ายข้างมาให้เหลือ y ตัวเดียว
            y = (m1 * x2 - m1 * x1 + y1 - m1 * y2 / m2) / (1 - m1 / m2);
        }
 
//ค่า X ที่จุดตัด ทำนองเดียวกับค่า Y
        if (l1p2.getX() == l1p1.getX()) {
            x = l1p2.getX();
        } else if (l2p2.getX() == l2p1.getX()) {
            x = l2p2.getX();
        } else {
            x = (y1 / m2 - y2 / m2 + x2 - m1 * x1 / m2) / (1 - m1 / m2);
        }

        System.out.println("m1=" + m1 + "/m2=" + m2 + "/y=" + y + "/x=" + x);
        return new Point(x, y);
    }

}

Comment

Comment:

Tweet

คนใช้เยอะสุด คลิ๊ก หรือ Enter แล้วมีเสียงด้วย ค่ายอื่นเค้าไม่มีเสียง
ช่วงแรกที่ออก 8 มา error + ค้างเยอะเกินกว่าจะรับได้เลยหยุดใช้ไป

#1 By water for gas (122.168.39.214) on 2012-01-23 13:29