Autor Wątek: Rzutowanie punktu na wektor  (Przeczytany 1680 razy)

zerlo

  • Gość
# Kwiecień 06, 2008, 11:36:59
Gdy musze (zupelnie jak przy sprawdzaniu kolizji metoda SAT): rzutowac 2 zbiory punktow na wektor, dla kazdego zbioru wybrac rzut o najwiekszej i najmniejszej dlugosc,
sprwadzic czy nachodza one na siebie traktuje punkty jako wektory i:

Rys pom. Nie sugerujcie sie jednostkami.


Czerwona kropka to punkt, ktory rzutuje na wektor.
A to ten punkt potraktowany jako wektor.
Dwu kolorowa zielona strzalka to wektor (B), na ktory rzutuje. Ma dwa kolory bo chcialem ciemniejszym zaznaczyc szukana dlugosc rzutu (d), ktory jest czescia tego wektora.
Czerwona kreska wyznacza trojkat prostokatny, aby wyznaczyc latwo d.

Wiedzac, ze
[tex]\vec{A} \cdot \vec{B} = \|A\|\|B\|\cos(\alpha) [/tex]
[tex]cos(\alpha) =\frac{\vec{A} \cdot \vec{B}}{\|A\|\|B\|}[/tex]
[tex]\vec{A} \cdot \vec{B} = A.x \cdot B.x + A.y \cdot B.y[/tex]

Aby wyliczyc d robie:
[tex]cos(\alpha) = \frac{d}{\|A\|}[/tex]
[tex]d = |A| \cdot cos(\alpha)[/tex]
[tex]d = |A| \cdot \frac{\vec{A} \cdot \vec{B}}{\|A\|\|B\|}[/tex]
[tex]d = \frac{\vec{A} \cdot \vec{B}}{\|B\|} [/tex]
[tex]d = \frac{A.x \cdot B.x + A.y \cdot B.y}{\|B\|}[/tex]

No i mam wzor na dlugosc rzutu.

Czy jezeli zadnego z wynikow nie podziele przez dlugosc wektora na ktory rzutuje (|B|) i bede potem sprawdzal czy rzuty (min-max z jednego i drugiego zbioru) nachodza na siebie to wynik nadal bedzie prawdziwy? Bo wychodzi na to, ze tak:
void GetMinMax(double& fMin, double& fMax, CVec& Axis, CPoly& Poly)
{
float fTmp;
fMin = fMax = (Poly.vVer[0] * Axis) / Axis.Len();     //[1]
        //fMin = fMax = (Poly.vVer[0] * Axis);                  [2]

for(unsigned int i = 1; i < Poly.vVer.size(); i++)
        {
fTmp = (Poly.vVer[i] * Axis) / Axis.Len();   //[1]
                //fTmp = (Poly.vVer[0] * Axis);                [2]
       
if (fTmp > fMax)
      fMax = fTmp;
        else if (fTmp < fMin)
      fMin = fTmp;
}
}

Nie zaleznie czy licze to linijkami [1] czy [2]. Przy sprawdzaniu:
if (fMaxA < fMinB || fMinA > fMaxB)
//fMaxA i fMinA - max i min zbioru 1
//fMaxB i fMinB - max i min zbioru 2

Wynik jest taki sam. I teraz moje pytanie: czemu dzielenie przez dlugosc wektora, na ktory rzutujemy, nie ma w wplywu na wynik koncowy?

Z gory dziekuje.
« Ostatnia zmiana: Kwiecień 06, 2008, 11:48:45 wysłana przez zerlo »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Areal

  • Użytkownik

# Kwiecień 06, 2008, 12:13:02
Cytuj
Wynik jest taki sam. I teraz moje pytanie: czemu dzielenie przez dlugosc wektora, na ktory rzutujemy, nie ma w wplywu na wynik koncowy?

Bo długość B to skalar. Jeśli wszystkie wyniki są przeskalowane jednorodnie to dla tego algorytmu, gdzie zachodzi porównywanie wartości nie ma to znaczenia. Wyobraź sobie, że ktoś porównuje długości w milimetrach i stwierdza, że coś jest dłuższe. Jeśli przedstawi długości w metrach to wynik będzie taki sam :)

zerlo

  • Gość
# Kwiecień 06, 2008, 12:24:52
Cytuj
Wynik jest taki sam. I teraz moje pytanie: czemu dzielenie przez dlugosc wektora, na ktory rzutujemy, nie ma w wplywu na wynik koncowy?

Bo długość B to skalar. Jeśli wszystkie wyniki są przeskalowane jednorodnie to dla tego algorytmu, gdzie zachodzi porównywanie wartości nie ma to znaczenia. Wyobraź sobie, że ktoś porównuje długości w milimetrach i stwierdza, że coś jest dłuższe. Jeśli przedstawi długości w metrach to wynik będzie taki sam :)

Dzieki wielkie za odpowiedz. Czyli to taki trik optymalizujacy (pewnie praktycznie bez roznicy w szybkosci, ale zawsze cos). Ale wstyd... Tak bardzo pochlonalem sie przeksztalcaniem tych wzorow, ze zgubilem po drodze podstawy matematyki. ^_^  Moze ktos tu kiedys trafi, kto bedzie szukal tych wzorow (watpie, ale przynajmniej temat by sie na cos przydal).
« Ostatnia zmiana: Kwiecień 06, 2008, 12:26:40 wysłana przez zerlo »

Offline cienio

  • Użytkownik

# Kwiecień 06, 2008, 12:26:44
Rozwiązujesz nierówność typu:
A/B >C/B
którą mnożysz obustronnie przez B.
Jeżeli B>0 to masz:
A>C