eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingkolizja prostokątów
Ilość wypowiedzi w tym wątku: 21

  • 11. Data: 2011-12-22 09:55:40
    Temat: Re: kolizja prostokątów
    Od: bartekltg <b...@g...com>

    W dniu 2011-12-22 10:53, bartekltg pisze:
    > W dniu 2011-12-21 22:15, Kicer pisze:
    >
    >
    >>> Dwa równania na przesunięcie (x i y), wybierasz
    >>> to z mniejszym wynikiem.
    >>
    >> mogę prosić ciutkę jaśniej? jak wyznaczam te dwa równania?
    >
    >
    > Kurde. Brać się do matematyki a nie do programowania!
    >
    > W = suma szerokości / 2
    > H = suma wysokości /2
    >
    > Wektor od prostokąta A do B
    > [ X_B - X_A ; Y_B - Y_A ]

    W innym poście widzę, że z tym są problemy:
    X_A,Y_A to współrzędny x,y _środka_ prostokąta A.


    > I teraz szukasz takiego t, aby była kolizja,
    > czyli albo
    >
    > abs(X_B - X_A) * (1-t) = W
    >
    > albo
    >
    > abs( Y_B - Y_A ) (1-t) = H
    >
    >
    > Z obu równań wyznaczasz t (zamieniasz wzorek na t = ...,
    > nie trzeba rozwiązywać tego numerycznie;)) i bierzesz
    > to mniejsze. Jeśli początkowo prostokąty były
    > rozłączne, to t będzie w przedziale (0,1).
    >
    > Wektorem, o który należy przesunać prostokąt B jest
    > [ X_B - X_A ; Y_B - Y_A ] * (-t)
    >
    > Tyle, że t będzie jakąś liczba wymierną, a więc
    > i wektor nie musi być całkowity.

    pzdr
    bartekltg


  • 12. Data: 2011-12-22 10:05:24
    Temat: Re: kolizja prostokątów
    Od: Kicer <...@...c>

    Stachu 'Dozzie' K. wrote:

    > On 2011-12-22, Kicer <...@...c> wrote:
    >> niechę będzie że mam:
    >>
    >> +---+
    >> | |
    >> | |
    >> | |
    >> | |
    >> | |
    >> +---+
    >>
    >> +-----------------+
    >> | |
    >> +-----------------+
    >
    >>> 3. Upewniasz się, że xA1 < xB1.
    >>> Chodzi o to, żeby wiedzieć, który prostokąt jest lewy, a który prawy.
    >>
    >> ten na dole jest prawy
    >>
    >>> 4. Jeśli to prawy prostokąt jest przesuwany, liczysz wektor przesunięcia
    >>> równoległego do osi x między xA2 i xB1. Jeśli lewy prostokąt jest
    >>> przesuwany, wektor ma przeciwny zwrot.
    >>
    >> no to wyszedł wektor o długości 0, bo odlegość na osi odciętych (x)
    >> między prawym bokiem górnego a lewym bokiem dolnego == 0.
    >
    > Słusznie. I tyle, jak rozumiem, powinien wyjść.

    nie ;) przesuwając dolny po prostej przechodzącej przez środki prostokątów,
    powinien się on przesunąć lekko w lewo.

    >
    >>> 5. Obliczasz wektor przesunięcia wzdłuż osi y. Może być za pomocą
    >>> proporcji. Możesz nawet sprawdzić, czy udało się tak przesunąć
    >>> prostokąt, żeby dowolny bok poziomy jednego prostokąta znajdował się
    >>> między bokami drugiego prostokąta (wystarczą dwie proste
    >>> alternatywy).
    >>
    >> tu przyznam, że nie do konca rozumiem. Z proporcji miedzy czym a czym?
    >
    > Elementarna planimetria. Przesuwasz wzdłuż prostej przechodzącej przez
    > środki, czyli o dwa wektory (równoległe do osi) składające się na wektor
    > łączący środki prostokątów albo coś proporcjonalnego. Jeśli masz
    > wyliczony wektor przesunięcia wzdłuż jednej osi, drugi się wylicza
    > prosto.

    no dobra, pierwszy wyszedł mi 0 to drugi wyjdzie ile? 0?:>

    >
    >> Poświęciłem naprawdę sporo czasu na rozwiązanie tego problemu i uwierz
    >> mi, wszelkie algorytmy wymyślane "od ręki" mają jakieś błędy dla
    >> wymyślnych przypadków.
    >
    > Jeśli wystarczy ci, że dowolne boki się zetkną, to możesz policzyć dwa
    > warianty i sprawdzić, przy którym prostokąty się rzeczywiście zetkną.
    > Algorytm ten sam. Chyba że wynajdziesz inny problem.
    >

    tego narazie nie skomentuję, bo ciągle są braki w punktach powyżej ;)

    pozdrawiam

    --
    Michał Walenciak
    gmail.com kicer86
    http://kicer.sileman.net.pl
    gg: 3729519


  • 13. Data: 2011-12-22 10:50:57
    Temat: Re: kolizja prostokątów
    Od: Kicer <...@...c>

    bartekltg wrote:

    > W dniu 2011-12-21 22:15, Kicer pisze:
    >
    >
    >>> Dwa równania na przesunięcie (x i y), wybierasz
    >>> to z mniejszym wynikiem.
    >>
    >> mogę prosić ciutkę jaśniej? jak wyznaczam te dwa równania?
    >
    >
    > Kurde. Brać się do matematyki a nie do programowania!

    (4, 9)
    +--+
    | | prostokąt A; środek to punkt 2, 7; Ha = 4; Wa = 4
    | |
    +--+
    (0, 5) (6,4)
    ++
    ||
    || prostokąt B; środek to punkt 5, 2; Hb = 4; Wb = 2
    ++
    (4,0)

    >
    > W = suma szerokości / 2
    > H = suma wysokości /2

    W = (Wa + Wb) / 2 = 3
    H = (Ha + Hb) / 2 = 4;

    >
    > Wektor od prostokąta A do B
    > [ X_B - X_A ; Y_B - Y_A ]

    jak napisales w poście niżej, chodzi o środki, więc:

    [ 5 - 2; 2 - 7] = [3; -5]

    >
    > I teraz szukasz takiego t, aby była kolizja,
    > czyli albo
    >
    > abs(X_B - X_A) * (1-t) = W
    >
    > albo
    >
    > abs( Y_B - Y_A ) (1-t) = H

    abs(X_B - X_A) == 3;
    t = (3 - W)/3 = 0

    abs(Y_B - Y_A) == 5;
    t = (5 - H)/5 = 1/5

    >
    >
    > Z obu równań wyznaczasz t (zamieniasz wzorek na t = ...,
    > nie trzeba rozwiązywać tego numerycznie;)) i bierzesz
    > to mniejsze. Jeśli początkowo prostokąty były
    > rozłączne, to t będzie w przedziale (0,1).
    >

    wygrywa zatem t = 0

    [3; -5] * 0 = [0; 0]

    wychodzi zatem, ze prostokątów nie trzeba przesuwać.

    Jesli wezmę drugie t, które wychodzi 1/5, to wygląda sensowniej, bo wektor
    ma postać:
    [-3/5; -1], co już by się zgadzało.

    pozdrawiam

    --
    Michał Walenciak
    gmail.com kicer86
    http://kicer.sileman.net.pl
    gg: 3729519


  • 14. Data: 2011-12-22 10:51:34
    Temat: Re: kolizja prostokątów
    Od: "Stachu 'Dozzie' K." <d...@g...eat.some.screws.spammer.invalid>

    On 2011-12-22, Kicer <...@...c> wrote:
    > Stachu 'Dozzie' K. wrote:
    >
    >> On 2011-12-22, Kicer <...@...c> wrote:
    >>> niechę będzie że mam:
    >>>
    >>> +---+
    >>> | |
    >>> | |
    >>> | |
    >>> | |
    >>> | |
    >>> +---+
    >>>
    >>> +-----------------+
    >>> | |
    >>> +-----------------+
    >>
    >>>> 3. Upewniasz się, że xA1 < xB1.
    >>>> Chodzi o to, żeby wiedzieć, który prostokąt jest lewy, a który prawy.
    >>>
    >>> ten na dole jest prawy
    >>>
    >>>> 4. Jeśli to prawy prostokąt jest przesuwany, liczysz wektor przesunięcia
    >>>> równoległego do osi x między xA2 i xB1. Jeśli lewy prostokąt jest
    >>>> przesuwany, wektor ma przeciwny zwrot.
    >>>
    >>> no to wyszedł wektor o długości 0, bo odlegość na osi odciętych (x)
    >>> między prawym bokiem górnego a lewym bokiem dolnego == 0.
    >>
    >> Słusznie. I tyle, jak rozumiem, powinien wyjść.
    >
    > nie ;) przesuwając dolny po prostej przechodzącej przez środki prostokątów,
    > powinien się on przesunąć lekko w lewo.
    >
    >>
    >>>> 5. Obliczasz wektor przesunięcia wzdłuż osi y. Może być za pomocą
    >>>> proporcji. Możesz nawet sprawdzić, czy udało się tak przesunąć
    >>>> prostokąt, żeby dowolny bok poziomy jednego prostokąta znajdował się
    >>>> między bokami drugiego prostokąta (wystarczą dwie proste
    >>>> alternatywy).
    >>>
    >>> tu przyznam, że nie do konca rozumiem. Z proporcji miedzy czym a czym?
    >>
    >> Elementarna planimetria. Przesuwasz wzdłuż prostej przechodzącej przez
    >> środki, czyli o dwa wektory (równoległe do osi) składające się na wektor
    >> łączący środki prostokątów albo coś proporcjonalnego. Jeśli masz
    >> wyliczony wektor przesunięcia wzdłuż jednej osi, drugi się wylicza
    >> prosto.
    >
    > no dobra, pierwszy wyszedł mi 0 to drugi wyjdzie ile? 0?:>

    Założyłem (niesłusznie), że to boki pionowe mają się zetknąć. A policz
    teraz wariant dla boków poziomych i wyjaśnij, czemu uważasz że *to* nie
    zadziała?

    >>> Poświęciłem naprawdę sporo czasu na rozwiązanie tego problemu i uwierz
    >>> mi, wszelkie algorytmy wymyślane "od ręki" mają jakieś błędy dla
    >>> wymyślnych przypadków.
    >>
    >> Jeśli wystarczy ci, że dowolne boki się zetkną, to możesz policzyć dwa
    >> warianty i sprawdzić, przy którym prostokąty się rzeczywiście zetkną.
    >> Algorytm ten sam. Chyba że wynajdziesz inny problem.
    >>
    >
    > tego narazie nie skomentuję, bo ciągle są braki w punktach powyżej ;)

    Skomentuj, skomentuj. Bo algorytm wymaga _trywialnej_ poprawki w postaci
    właśnie tego: liczysz wektor dla wariantu, gdy prostokąty mają się
    zetknąć bokami pionowymi i dla wariantu z bokami poziomymi. Sprawdzasz,
    w którym wariancie prostokąty rzeczywiście się zetkną i ten wybierasz.

    Co to mówiłeś o swoim mnóstwie czasu spędzonym nad algorytmem?

    --
    Secunia non olet.
    Stanislaw Klekot


  • 15. Data: 2011-12-22 11:07:46
    Temat: Re: kolizja prostokątów
    Od: bartekltg <b...@g...com>

    W dniu 2011-12-22 11:50, Kicer pisze:
    > bartekltg wrote:
    >
    >> W dniu 2011-12-21 22:15, Kicer pisze:
    >>
    >>
    >>>> Dwa równania na przesunięcie (x i y), wybierasz
    >>>> to z mniejszym wynikiem.
    >>>
    >>> mogę prosić ciutkę jaśniej? jak wyznaczam te dwa równania?
    >>
    >>
    >> Kurde. Brać się do matematyki a nie do programowania!
    >
    > (4, 9)
    > +--+
    > | | prostokąt A; środek to punkt 2, 7; Ha = 4; Wa = 4
    > | |
    > +--+
    > (0, 5) (6,4)
    > ++
    > ||
    > || prostokąt B; środek to punkt 5, 2; Hb = 4; Wb = 2
    > ++
    > (4,0)
    >
    >>
    >> W = suma szerokości / 2
    >> H = suma wysokości /2
    >
    > W = (Wa + Wb) / 2 = 3
    > H = (Ha + Hb) / 2 = 4;
    >
    >>
    >> Wektor od prostokąta A do B
    >> [ X_B - X_A ; Y_B - Y_A ]
    >
    > jak napisales w poście niżej, chodzi o środki, więc:
    >
    > [ 5 - 2; 2 - 7] = [3; -5]


    >>
    >> I teraz szukasz takiego t, aby była kolizja,
    >> czyli albo
    >>
    >> abs(X_B - X_A) * (1-t) = W
    >>
    >> albo
    >>
    >> abs( Y_B - Y_A ) (1-t) = H
    >
    > abs(X_B - X_A) == 3;
    > t = (3 - W)/3 = 0
    >
    > abs(Y_B - Y_A) == 5;
    > t = (5 - H)/5 = 1/5
    >
    >>
    >>
    >> Z obu równań wyznaczasz t (zamieniasz wzorek na t = ...,
    >> nie trzeba rozwiązywać tego numerycznie;)) i bierzesz
    >> to mniejsze. Jeśli początkowo prostokąty były
    >> rozłączne, to t będzie w przedziale (0,1).
    >>
    >
    > wygrywa zatem t = 0

    Aj, późniejszy (minus mi mieszał)

    >
    > [3; -5] * 0 = [0; 0]

    [3; -5] * -1/5 = [-3/5; 1]

    B podskakuje oczko w górę. Zetknął się.


    > wychodzi zatem, ze prostokątów nie trzeba przesuwać.
    >
    > Jesli wezmę drugie t, które wychodzi 1/5, to wygląda sensowniej, bo wektor
    > ma postać:
    > [-3/5; -1], co już by się zgadzało.

    Źle znaki:)

    pzdr
    bartekltg


  • 16. Data: 2011-12-22 11:13:00
    Temat: Re: kolizja prostokątów
    Od: Kicer <...@...c>

    Stachu 'Dozzie' K. wrote:

    >>
    >> no dobra, pierwszy wyszedł mi 0 to drugi wyjdzie ile? 0?:>
    >
    > Założyłem (niesłusznie), że to boki pionowe mają się zetknąć. A policz
    > teraz wariant dla boków poziomych i wyjaśnij, czemu uważasz że to nie
    > zadziała?

    uważam, że drugi wariant nie zadziala? Tzn gdzie tak napisalem?

    Reszty nie skomentuję, bo zaczynasz to w czym jesteś najlepszy: wycieczki
    osobiste bez wdawania się w detale.

    pozdrawiam,
    z mojej strony EOT

    --
    Michał Walenciak
    gmail.com kicer86
    http://kicer.sileman.net.pl
    gg: 3729519


  • 17. Data: 2011-12-22 11:15:04
    Temat: Re: kolizja prostokątów
    Od: Kicer <...@...c>

    bartekltg wrote:

    >> wygrywa zatem t = 0
    >
    > Aj, późniejszy (minus mi mieszał)
    >
    >>
    >> [3; -5] * 0 = [0; 0]
    >
    > [3; -5] * -1/5 = [-3/5; 1]
    >
    > B podskakuje oczko w górę. Zetknął się.
    >
    >
    >> wychodzi zatem, ze prostokątów nie trzeba przesuwać.
    >>
    >> Jesli wezmę drugie t, które wychodzi 1/5, to wygląda sensowniej, bo
    >> wektor ma postać:
    >> [-3/5; -1], co już by się zgadzało.
    >
    > Źle znaki:)

    no to by już wyjasniało wszystko, dzięki :)

    --
    Michał Walenciak
    gmail.com kicer86
    http://kicer.sileman.net.pl
    gg: 3729519


  • 18. Data: 2011-12-26 16:03:32
    Temat: Re: kolizja prostokątów
    Od: Tomek Banach <b...@b...org>

    On 2011-12-21 09:05, Kicer wrote:
    > Witam
    >
    > temat na pograniczu programowania i matematyki.
    >
    > Mam w przestrzeni dwuwymiarowej 2 prostokąty. Wszystkie spółrzędne ich
    > wierzchołków są całkowite.
    >
    > Chodzi o to, by przesunąć jeden z nich w kierunku drugiego po prostej
    > przechodzącej przez środki owych prostokątów tak, by zetknęły się bokami.
    >
    > W pierwszej chwili problem wydaje się prosty, jednakże po wygenerowaniu
    > różnych złośliwych przypadków (prostokąty o bardzo dużych lub bardzo małych
    > proporcjach długości boków), każdy z wymyślonych przeze mnie algorytmów
    > odpada.
    >
    > Oczywiscie nie chodzi o to, aby przesuwać prostokąt z małym krokiem i
    > sprawdzać, czy nastąpiła kolizja. Potrzebowałbym gotowy wektor.

    Hmm a ten problem jest rozwiązywalny ? Bo tak na moje oko założenie
    liczb całkowitych na wierzchołkach i wektora łączącego środki który
    będzie liczbą wymierną może powodować że nie będzie takiego wektora.

    --
    Tomek


  • 19. Data: 2011-12-30 08:44:10
    Temat: Re: kolizja prostokątów
    Od: Kicer <...@...c>

    Tomek Banach wrote:

    >
    > Hmm a ten problem jest rozwiązywalny ? Bo tak na moje oko założenie
    > liczb całkowitych na wierzchołkach i wektora łączącego środki który
    > będzie liczbą wymierną może powodować że nie będzie takiego wektora.


    generalnie prostokaty są na tyle duże (szerokość i wysokośc idą w
    milionach), że zaokrąglenie do wartości całkowitej nie ma żadnego znaczenia
    :)

    Rozwiązanie podane przez bartekltg działa wyśmienicie ;)

    pozdrawiam

    --
    Michał Walenciak
    gmail.com kicer86
    http://kicer.sileman.net.pl
    gg: 3729519


  • 20. Data: 2011-12-30 18:26:47
    Temat: Re: kolizja prostokątów
    Od: Tomek Banach <b...@b...org>

    On 2011-12-30 09:44, Kicer wrote:
    > Tomek Banach wrote:
    >
    >>
    >> Hmm a ten problem jest rozwiązywalny ? Bo tak na moje oko założenie
    >> liczb całkowitych na wierzchołkach i wektora łączącego środki który
    >> będzie liczbą wymierną może powodować że nie będzie takiego wektora.
    >
    >
    > generalnie prostokaty są na tyle duże (szerokość i wysokośc idą w
    > milionach), że zaokrąglenie do wartości całkowitej nie ma żadnego znaczenia
    > :)

    dobra dobra wszyscy wiem jak czesto sprawdzają się szanse jedna na
    milion. A potem spadają samoloty ;)

    --
    Tomek

strony : 1 . [ 2 ] . 3


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: