2013-03-20 55 views
7

Tiêu đề nói tất cả, tôi đã tìm kiếm xung quanh và không thể tìm thấy bất cứ điều gì đó là thẳng và cho điểm. Làm thế nào tôi sẽ có một dòng với các điểm (x1, y1) & (x2, y2) và kiểm tra giao điểm của nó giữa một hình chữ nhật (xR, yR)? Tôi đã thấy trong gói Line2D có một số phương pháp giao nhau nhưng không chắc chắn cách thiết lập tất cả. Ai đó có thể chỉ cho tôi cách thiết lập chính xác để kiểm tra giao lộ (va chạm) không?Cách kiểm tra giao lộ giữa một đường thẳng và hình chữ nhật?

+0

* "Cảm ơn Dan" * Không bao gồm sigs. trong câu hỏi. Việc va chạm giữa các đối tượng 'Area' có thể được thực hiện tương đối dễ dàng. Đây là [ví dụ] (http://stackoverflow.com/a/14575043/418556). –

+0

Cảnh báo. Bởi vì bạn thường có thể sử dụng lớp Area của Java để phát hiện va chạm/giao cắt cho hầu như tất cả các đối tượng đồ họa Java 2D, nên nó có thể được sử dụng cho tất cả các đối tượng đồ họa. Nhưng nó không thể được - bởi vì nếu bạn xây dựng một khu vực cho một 'dòng' khu vực của dòng chính nó bắt đầu trống rỗng. Do đó, giao lộ với bất kỳ khu vực nào khác luôn trả về trống - ngay cả khi đường đi qua khu vực khác của bạn. Bạn đa được cảnh bao! –

Trả lời

5

Sử dụng các lớp khả dụng từ API đồ họa 2D.

Rectangle r1 = new Rectangle(100, 100, 100, 100); 
Line2D l1 = new Line2D.Float(0, 200, 200, 0); 
System.out.println("l1.intsects(r1) = " + l1.intersects(r1)); 

Điều này không cho bạn biết, là nơi ...

+0

Cảm ơn bạn, tôi không cần biết đâu, chỉ cần biết họ có làm hay không. –

4

Hình chữ nhật có 4 dòng. Bạn có thể tính toán giao điểm giữa đường của bạn và 4 dòng của hình chữ nhật.

cho các phương trình của hai dòng, chúng sẽ giao nhau khi x và y bằng nhau.

y = m1x + b1 y = m2x + b2

giải phương trình bạn sẽ nhận được:

x = b2 - b1/(m1 - m2);

Lưu ý rằng nếu m1 == m2, các đường thẳng song song và sẽ không bao giờ cắt nhau, hãy xem số chia cho 0 trong trường hợp này. Sau đó, vì bạn đang giao dịch với các phân khúc ratter hơn so với các dòng vô hạn, hãy kiểm tra xem giao lộ có nằm trong các phân khúc của bạn hay không (kiểm tra xem cả X và Y nằm trong ranh giới của mỗi đoạn) hay không.

+0

+1 chỉ vì nó trông rất tốt – MadProgrammer

+0

Cảm ơn bạn :) Hãy chơi xung quanh với câu trả lời của bạn :) Cảm ơn –

+0

Đó là một chút khó khăn hơn thế này - đại diện y = mx + c không thể xử lý đường thẳng đứng. – aaronsnoswell

4

Returns null nếu dòng không giao nhau. Sửa đổi một số mã c từ một phản ứng khác cho câu hỏi tương tự để làm cho nó Java. Đã không bận tâm để xem xét như thế nào/tại sao nó hoạt động, nhưng công việc tôi cần nó để.

static Point get_line_intersection(Line2D.Double pLine1, Line2D.Double pLine2) 
{ 
    Point 
     result = null; 

    double 
     s1_x = pLine1.x2 - pLine1.x1, 
     s1_y = pLine1.y2 - pLine1.y1, 

     s2_x = pLine2.x2 - pLine2.x1, 
     s2_y = pLine2.y2 - pLine2.y1, 

     s = (-s1_y * (pLine1.x1 - pLine2.x1) + s1_x * (pLine1.y1 - pLine2.y1))/(-s2_x * s1_y + s1_x * s2_y), 
     t = (s2_x * (pLine1.y1 - pLine2.y1) - s2_y * (pLine1.x1 - pLine2.x1))/(-s2_x * s1_y + s1_x * s2_y); 

    if (s >= 0 && s <= 1 && t >= 0 && t <= 1) 
    { 
     // Collision detected 
     result = new Point(
      (int) (pLine1.x1 + (t * s1_x)), 
      (int) (pLine1.y1 + (t * s1_y))); 
    } // end if 

    return result; 
} 
+0

Chỉ cần kiểm tra. Công trinh. – Danon

Các vấn đề liên quan