2011-08-22 57 views
5

thể trùng lặp:
How can I tell if a point is nearby a certain line?điểm trên một đường thẳng gần gũi nhất với x, y

//Returns the point on the line traced from start to end which 
//comes nearest to 500,000, 500,000. The points are scaled between 
//1,000,000 and 0 from their original fp types. 
Point closestToCentre(Point start, Point end); 

Bất cứ ai cũng biết cách nhanh hơn bước duy nhất thông qua các điểm ảnh?

Có thể một số cảnh báo nhiều hơn tôi chứng minh toán học của mình & sức mạnh hình học không?

_______EDIT___________

Cảm ơn Kris, điều này đã gây nhầm lẫn tôi:

[x; -a/bx-c/b] = [0; -c/b] -1/b [-b; a] x.

Bây giờ tôi thấy nó chỉ là tách (chủ yếu là thành phần y) vectơ thành hai kết hợp để mang lại kết quả tương tự. Got các phần phần tế bào não cũ vui mừng cho một phút sau đó :)

_______EDIT_________

Jason Moore, nhờ nguồn cảm hứng, đây là những gì tôi đang làm, đồ họa,

64x64 square with 2 sample lines each passing edge to edge and missing the centre by some distance

tôi hy vọng điều đó rõ ràng hơn.

____EDIT________

Vì vậy, tôi một cách hợp lý có thể mong đợi để có một dòng vuông góc với dòng lấy mẫu của tôi và chạy nó từ trung tâm nhưng làm thế nào để biết khi nào họ chạm?

enter image description here

Tôi nghĩ rằng trang của phương trình Kris là con đường để đi. Nếu bạn đang nói với tôi đó là một quá trình hai bước. Nó chỉ là hai phương trình đồng thời bây giờ, vì vậy tôi có thể không cần nguồn gốc của Kris.

____EDIT_________

Dù tốt hay xấu điều, tôi không biết, nhưng vẻ đẹp của stackoverflow như một công cụ tìm kiếm đã tiết lộ với tôi một số tuyến đường của cuộc điều tra. Chủ yếu tôi thích giải pháp đầu tiên ở đây: Shortest distance between a point and a line segment.

Tuy nhiên, để chứng minh điều này để tự tôi, tôi cần liên kết từ giải pháp Matti của ở phía dưới (nhưng một):

http://www.topcoder.com/tc?d1=tutorials&d2=geometry1&module=Static

Các nguồn gốc rất đơn giản và thanh lịch thậm chí tôi có thể làm theo nó!

Với http://mathworld.wolfram.com/Point-LineDistance2-Dimensional.html

+0

Tôi nghĩ rằng sắp xếp nhanh chóng phổ biến sẽ sớm tự khai thác ở đây. Không! Họ đã được sắp xếp !! Rất gần, nhưng .. – John

+0

Đây là câu hỏi lượng giác. Hãy thử yêu cầu nó trên http://math.stackexchange.com/. – Enigmativity

+0

Không trùng lặp. Vâng, nó là cho những người khác hỏi cùng một điều. Nhưng việc tìm điểm trên đường gần nhất với một điểm nhất định là một câu hỏi khác so với việc tìm kiếm có hay không một điểm gần với một đường thẳng. Bạn có thể sử dụng câu trả lời cho câu hỏi này để tìm câu trả lời cho điều đó, nhưng đáng chú ý là giải pháp đã chọn cho câu hỏi đó không trả lời câu hỏi này. – Tatarize

Trả lời

7

Đây là một vấn đề của dự báo tuyến tính của một điểm trên một đường thẳng, mà có thể được thực hiện với một số thể dục dụng cụ vector tốt, như xây dựng tại MathWorld.

Bài viết chi tiết cách tìm khoảng cách ngắn nhất từ ​​điểm này đến điểm khác, và một trong các bước trung gian là tìm đường vuông góc từ điểm x, y đến dòng ban đầu. Giao nhau hai đường này sẽ cho bạn điểm, trên đường thẳng, gần nhất với x, y.

Chỉnh sửa để phản hồi: Phương trình (2) trong liên kết đang làm là chuyển vector thành dạng gợi nhớ của y = mx + c, cho phép bạn đọc nhanh chóng và dễ dàng khỏi gradient, từ đó gradient vuông góc có thể được tính toán dễ dàng.

+0

Điều đó có vẻ là một liên kết tốt. Sol lặp của tôi chạy đến một lớp fpPoint và một số vars địa phương. Bây giờ tôi đang bối rối hơn: [x; -a/bx-c/b] = [0; -c/b] -1/b [-b; a] x. Hãy cẩn thận để chỉnh sửa bài đăng của bạn, tôi không nghĩ rằng tôi đã bao gồm các véc tơ đơn giản để làm chậm quá trình này. Cảm ơn. – John

+0

aah, vâng y = mx + c, tôi đã nghe nói điều đó trước đây. Nhưng tôi nghĩ bạn sẽ thấy đó là mục tiêu của (eq.1). Đã nói rằng tôi đã đi trước bạn một bước, nhưng bây giờ tôi đang stumped trên eq.3 :) – John

+0

Trong liên kết của bạn không umlat^trên vector có nghĩa là nó là một vector đơn vị? Tôi nghĩ rằng sách toán học của Anh sử dụng một chiếc mũ phẳng .. – John

1

Tôi nghĩ rằng cách nhanh nhất sẽ là một quá trình hai bước:

  1. Giả sử dòng của bạn là vô hạn chiều dài, và tìm giao điểm của đường và đường trung trực của mình thông qua (500.000, 500.000).
  2. Đảm bảo rằng điểm đó thực sự nằm trên đường dây của bạn, nếu không tìm điểm cuối gần nhất.

Bài đăng của Kris bao gồm bước 1 khá tốt, tất cả những gì bạn phải làm là thêm kiểm tra bước 2 vì bạn có phân đoạn đường và bạn vàng.

Cho điểm 1 = (x1, y1) và điểm cuối 2 = (x2, y2). Sau đó, dòng chứa hai điểm này là

y = (y2 - y1)/(x2 - x1) * (x - x1) + y1

và perp. phân giác qua (5e5, 5e5) là

y = (x1 - x2)/(y1 - y2) * (x - 5e5) + 5e5

điểm của bạn (x, y) là giải pháp (x, y) với hai phương trình trên (hoặc một trong hai điểm cuối). Điều này có thể đơn giản hơn liên kết mathworld. Lưu ý rằng giải pháp này thất bại, tuy nhiên, khi dòng của bạn hoặc là gần như thẳng đứng hoặc gần như ngang trong khi tôi không nghĩ rằng phong cách giải pháp toán học toán học nào, mặc dù tôi đã không nhìn rất chặt chẽ.

+0

Điểm tốt, không xem xét điều đó! – Kris

+0

Xin lỗi, từ ngữ của bài đăng này đã biến tôi thành IDE VC của tôi và một bản sol lặp lại. Điểm của bạn "2. Hãy chắc chắn rằng điểm thực sự là trên đường dây của bạn, khác tìm điểm cuối gần nhất." Đã không đọc liên kết của Kris nhưng có vẻ như bạn đang mong đợi tôi tìm thấy điểm của tôi trên đường dây của tôi, điều này là không thể xảy ra nhất. – John

+0

Xin lỗi nếu tôi không rõ. Bước 2 chỉ đơn giản là chọn điểm gần nhất từ ​​ba điểm ứng cử viên: điểm được tìm thấy ở bước 1 hoặc cả hai điểm kết thúc. Không có bất kỳ toán học phức tạp nào có liên quan ở đó, thực sự. Nếu điều kiện sau đây hóa ra là đúng: 'x max (p1.x, p2.x) || y> max (p1.y, p2.y) ', bạn phải chọn giữa hai điểm cuối của bạn cho điểm gần đúng nhất. – Sean

0

Xem câu trả lời của tôi cho Ngăn xếp ngăn xếp này question. Câu hỏi đó phức tạp hơn câu hỏi của bạn, vì vậy bạn có thể sử dụng các bước đầu tiên trong câu trả lời của tôi để có được những gì bạn cần.

+0

Tôi thích http://stackoverflow.com/questions/3120357/get-closest-point-to-a-line – John

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