2011-08-22 10 views
5

Powiel możliwe:
How can I tell if a point is nearby a certain line?Punkt na linii najbliżej 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); 

Każdy użytkownik wie szybszy sposób niż pojedynczy wchodzisz przez pikseli?

Czy ktoś bardziej czujny niż ja może wykazać się matematyką? & Sprawność geometrii proszę?

_______EDIT___________

Dzięki Kris, to było mylące mnie:

[X; -a/bx-c/b] = [0; -c/b] -1/b [-b; topór.

Teraz widzę, że po prostu dzieli się (głównie składnik y) wektor na dwa, które łączą się, dając ten sam rezultat. Dostał stary frakcje częściowe komórek mózgu podekscytowany na minutę, a następnie :)

_______EDIT_________

Jason Moore, dzięki za inspirację, tutaj jest to, co robię, graficznie,

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

I nadzieja, która jest jaśniejsza.

____EDIT________

Mogłem więc oczekiwać, aby zrobić linię pod kątem prostym do mojego próbą linii i uruchomić go od centrum, ale jak stwierdzić, kiedy dotknąć?

enter image description here

myślę strona Kris równań jest droga. Jeśli wszyscy mówicie mi, że jest to proces dwuetapowy. To tylko dwa równoczesne równania, więc nie potrzebuję derywacji Krisa.

____EDIT_________

dobre czy złe, nie wiem, ale piękno stackoverflow jako wyszukiwarkę objawił mi kilka dróg dochodzenia. Przede wszystkim podoba mi się pierwsze rozwiązanie: Shortest distance between a point and a line segment.

Ale to udowodnić w mojej własnej Potrzebowałem link z roztworem Matti u dołu (ale jeden):

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

Wyprowadzenie jest tak prosty i elegancki nawet mógłbym go śledzić!

względu http://mathworld.wolfram.com/Point-LineDistance2-Dimensional.html

+0

Myślę, że wszechobecny szybki rodzaj wkrótce się tu pojawi. Nie! Są już posortowane !! Tak blisko, ale .. – John

+0

To jest pytanie trygonometryczne. Spróbuj zadać to na http://math.stackexchange.com/. – Enigmativity

+0

Nie duplikować. Cóż, to jest dla innych ludzi, którzy pytali o to samo. Ale znalezienie punktu na linii najbliższej danego punktu jest innym pytaniem, niż ustalenie, czy punkt jest blisko linii. Możesz użyć odpowiedzi na to, aby znaleźć odpowiedź na to pytanie, ale w szczególności wybrane rozwiązanie tego pytania nie odpowiada na to pytanie. – Tatarize

Odpowiedz

7

Jest sprawą występu liniowego punktu na linii, które mogą być wykonane z kilku drobnych wektora gimnastyka, jak określono w MathWorld.

W artykule opisano, jak znaleźć najkrótszą odległość od punktu do linii, a jednym z pośrednich kroków jest znalezienie prostopadłej linii od punktu x, y do pierwotnej linii. Przecięcie tych dwóch linii da ci punkt, na linii, najbliższy x, y.

Edytuj w odpowiedzi na komentarz: To, co robi równanie (2) w łączu, przekształca wektor w formę przypominającą y = mx + c, co pozwala szybko i łatwo odczytać gradient, z którego Prostopadły gradient można łatwo obliczyć.

+0

To wygląda na dobry link. Mój iteracyjny zol pobiegł do klasy fpPoint i kilku lokalnych zmiennych. Teraz zastanawiam się nad: [x; -a/bx-c/b] = [0; -c/b] -1/b [-b; topór. Zajmij się redagowaniem postu, nie sądzę, że opisałem proste wektory, więc jestem tu wolny. Dzięki. – John

+0

aah, tak y = mx + c, słyszałem to już wcześniej. Ale myślę, że przekonasz się, że to jest cel (eq.1). Miałem powiedzieć, że byłem o krok przed wami, ale teraz jestem zakłopotany na eq.3 :) – John

+0

W twoim linku czy umlat^nad wektorem oznacza, że ​​jest to wektor jednostkowy? Wydaje mi się, że brytyjskie podręczniki matematyczne używają płaskiego kapelusza .. – John

1

myślę, że najszybszym sposobem będzie procesem dwuetapowym:

  1. Załóżmy linia jest nieskończony w długości i znaleźć punkt przecięcia linii i jej symetralnej przez (500000, 500000).
  2. Upewnij się, że punkt jest rzeczywiście na twojej linii, w przeciwnym razie znajdź najbliższy punkt końcowy.

Kris post zakrywa krok 1 całkiem dobrze, wszystko co musisz zrobić, to dodać czek do kroku 2, ponieważ masz segment linii i jesteś złoty.

Niech punkt 1 = (x1, y1) i punkt końcowy 2 = (x2, y2). Wówczas linia zawierająca te dwa punkty

Y = (Y 2 - Y 1)/(X2 - X1) * (x - x 1) + Y1

i sprawca. Dwusieczna do (5e5, 5e5) jest

Y = (X1 - 2x)/(Y1 - Y2) * (x - 5e5) + 5e5

Punktem (x, y) jest rozwiązanie (x, y) do powyższych dwóch równań (lub jednego z dwóch punktów końcowych). To może być prostsze niż związek z matematyki. Zauważ, że to rozwiązanie nie powiedzie się, gdy twoja linia jest albo prawie pionowa, albo prawie pozioma, podczas gdy nie wydaje mi się, że styl rozwiązania w matematycznym świecie, chociaż nie przyjrzałem się z bliska.

+0

Dobra uwaga, nie wziąłem tego pod uwagę! – Kris

+0

Przepraszam, ta słowność tego wpisu zwróciła mnie do mojego VC IDE i iteracyjnego zolu. Twój punkt "2. Upewnij się, że punkt jest rzeczywiście na twojej linii, w przeciwnym razie znajdź najbliższy punkt końcowy." Nie przeczytałem jeszcze linku Krisa, ale brzmi to tak, jakbyś oczekiwał, że znajdę punkt na mojej linii, co jest najbardziej nieprawdopodobne. – John

+0

Przepraszam, jeśli byłem niejasny. Krok 2 to po prostu wybór najbliższego punktu z trzech kandydujących punktów: punkt znaleziony w kroku 1 lub oba punkty końcowe. Tam naprawdę nie ma skomplikowanej matematyki. Jeśli spełniony jest następujący warunek: 'x max (p1.x, p2.x) || y> max (p1.y, p2.y) ', musisz wybrać pomiędzy dwoma punktami końcowymi dla poprawnego najbliższego punktu. – Sean

0

Zobacz moją odpowiedź na ten przepełnienie stosu question. To pytanie jest bardziej skomplikowane niż twoje, więc powinieneś być w stanie użyć pierwszych kilku kroków w mojej odpowiedzi, aby uzyskać to, czego potrzebujesz.

+0

Preferuję http://stackoverflow.com/questions/3120357/get-closest-point-to-a-line – John

Powiązane problemy