2010-07-21 13 views
18

Próbuję zaimplementować algorytm linii wzroku na dwuwymiarowej siatce. Wiem, jak to musi działać koncepcyjnie, ale nie mogę myśleć o tym, jak zaimplementować go jako algorytm.Jak znaleźć wszystkie kwadraty siatki na linii?

Podstawowy pomysł jest dość prosty. W pseudokodzie:

function LineOfSight(point1, point2): boolean 
    squares = GetListOfSquaresOnLine(point1, point2) 
    for each square in squares 
    if square.IsOpaque then return false 
    return true 

GetListOfSquaresOnLine że (koncepcyjnie) narysować linię prostą z centrum kwadratu siatki, punktem 1 do centrum kwadratu siatki, punktem2 i zwraca się wszystkie kwadraty, że oś przechodzi przez . Ale to jest część, której nie mam pojęcia, jak ją wprowadzić. Czy ktoś wie, jak to zrobić? Przykłady Delphi lub C są preferowane, ale nie są wymagane.

Odpowiedz

27

obydwie odpowiedzi do tej pory wskazują na artykuł na algorytmie Bresenhams „s. Oto ilustracja, którą artykuł podaje w pełnym rozmiarze. Zauważ, że linia przechodzi przez kwadraty siatki, które nie są podświetlone, więc algorytm Bresenhama podaje jedynie podzbiór tego, co chcesz.

alt text

Skoro wspomniałeś „linii wzroku”, to brzmi jak chcesz algorytm, który wylicza wszystkie kwadratów siatki że linia przebiega przez. Ten zestaw jest czasami określany jako super okładka (linii) i one algorithm is described here.

Istnieje również kilka innych podejść, podanych w odpowiedziach na this question.

Aktualizacja:Here's another reference

+1

Dzięki! Linia supercover jest lepiej dopasowana niż podstawowa linia Bresenham. Przełączam to na akceptowaną odpowiedź. –

+0

Ten obraz ma kwadraty, które _ są_ na linii, ale nie są podświetlone. Dlaczego to? --- Edytuj: Teraz rozumiem. Oto link, który modyfikuje algorytm, aby uzyskać supercover http://eugen.dedu.free.fr/projects/bresenham/. – byxor

7

Czy nie jest to Bresenham's Algorithm czego szukasz?

+0

Dzięki. Nie słyszałem o tym wcześniej, ale wygląda na to, czego szukam. –

5
+7

Nie jestem pewien, czy powinienem awansować lub wycofać: –

+0

Ty. jesteś złym człowiekiem. Otrzymasz przegraną tylko dlatego, że to było zabawne :-) – rhbvkleef

Powiązane problemy