Nigdy nie byłem dobry z matmy, jakoś sobie w życiu radzę starając się zawsze rozkładać problemy na najprostsze możliwe elementy. tym razem napotkałem problem, który nie wiem jak ugryźć.
Problem z algorytmem, którego potrzebuję w pluginie minecrafta. Spokojnie, nie chodzi mi o grę, ale o rozwiązanie matematyczne.
Sytuacja praktyczna:
Jest mapa (w każdej grze jest jakaś mapa), są na niej gracze, którzy się poruszają tu i tam. Jest wyznaczony środek mapy, gdzie jest spawn. Mapa jest nieskończona, czyli teoretycznie można iść w nieskończoność. Ale ja tego nie chcę, bo się porozchodzą i nie trafią na siebie. Dlatego chcę zbudować barierę. Jeżeli gracz odejdzie na większą odległość od spawn niż to jest ustawione, to go teleportuje do punktu położonego przed granicą. Rozumiecie?
Mam taki plugin, ale do tej pory działał tak, że spawn był zawsze ustawiony w punkcie x=0, z=0 (zero, zero).
Jesli granica była 1000 jednostek, to gra sprawdzała wartość bezwzględną pozycji gracza i jeśli x lub z było większe niż 1000, to teleportowało gracza do punktu o współrzędnych 0.98 * x, 0.98 * z. W ten sposób gracz odbijał się od bariery. Było to proste po spawn był w 0,0.
Ale teraz potrzebuję, żeby punkt spawn w dowolnym innym punkcie, niekoniecznie zero. I tu pojawia się
Problem matematyczny:
Jest układ współrzędnych x, z (y w grze to wysokość). Układ typowy od minus do plus nieskończoności. (w praktyce od -10000 do +10000).
Dane:
- punkt "zero" spawn (x, z) ustalony dowolnie na układzie współrzędnych.
- granica: g - dozwolona stała odległość od spawn. Z tym, że odległość 'po kwadracie' a nie po okręgu. Czyli granica jest osiągnięta wtedy, gdy którakolwiek współrzędna x lub z jest większa niż granica.
- pozycja gracza (x1,z1) punktu, w którym znajduje się gracz.
Szukane:
- sprawdzanie czy punkt (gracz) jest w granicy. - ten problem rozwiązuję tak, że biorę wartość bezwzględną z różnicy między współrzędnymi pozycji gracza i punktu spawn
czyli gracz jest poza granicą jeśli: Abs(x1 - x) > g lub Abs (z1 - z) > g i to chyba jest dobrze.
- wyznaczanie nowej, dozwolonej pozycji gracza - tu jest problem do rozwiązania. Trzeba znaleźć nowy punkt o współrzędnych mieszczących się w obszarze granicy i zbliżony do aktualnej pozycji gracza.
Czyli trzeba znaleźć (x2,z2) które znajdują się np. w odległości 98% od spawn, w pobliżu pozycji gracza.
Żeby było prościej zakodować, szukamy nowego x2, jeśli x1 jest poza granicą, lub nowe z2 jesli z1 jest poza granicą.
Algorytm musi uwzględniać sytuacje, gdzie spawn znajduje się w każdej 'ćwiartce' układu współrzędnych, granica mieści się lub nie w tej ćwiartce i tak samo gracz.
I co wy na to?