Další upřesnění specifikace
This commit is contained in:
parent
7592365228
commit
86afa8b332
1 changed files with 25 additions and 6 deletions
|
@ -42,6 +42,20 @@ class BoundingBox: # (okraj)
|
|||
max_y: int
|
||||
```
|
||||
|
||||
A tyto funkce:
|
||||
|
||||
```python
|
||||
def distance_squared(x1, y1, x2=0, y2=0) -> int:
|
||||
"""Squared Euclidean distance between two points."""
|
||||
return (int(x1) - int(x2)) ** 2 + (int(y1) - int(y2)) ** 2
|
||||
```
|
||||
|
||||
```python
|
||||
def euclidean_distance(x1, y1, x2=0, y2=0):
|
||||
"""Integer Euclidean distance between two points. Uses integer square root."""
|
||||
return int(isqrt(distance_squared(x1, y1, x2, y2)))
|
||||
```
|
||||
|
||||
## Simulace
|
||||
Každý krok simulace lze rozdělit do následujících tří fází:
|
||||
|
||||
|
@ -104,10 +118,15 @@ Iterujeme přes všechny cíle `goal` a označíme je jako dosažené, pokud `eu
|
|||
|
||||
### Poznámky
|
||||
|
||||
Všimněte si, že simulace používá několik neintuitivních zjednodušení:
|
||||
Všimněte si, že simulace má několik neintuitivních zjednodušení a vlastností:
|
||||
|
||||
- při úvodním posunu lodi o její rychlost **nekontrolujeme** kolize
|
||||
- kolize kontrolujeme až jako průsečík finální pozice lodi s asteroidy či cíle
|
||||
- při kolizi s asteroidem se loď **neodrazí**, tedy nezmění se směr její rychlosti
|
||||
- při řešení kolizí loď pouze posouváme ven z asteroidů
|
||||
- při kolizi nezáleží na tom, v jaké fázi řešení podkroků vydělíme rychlost lodi dvěma
|
||||
- Při úvodním posunu lodi o její rychlost **nekontrolujeme** kolize.
|
||||
- Kolize kontrolujeme až jako průsečík finální pozice lodi s asteroidy či cíle.
|
||||
- Při kolizi s asteroidem se loď **neodrazí**, tedy nezmění se směr její rychlosti.
|
||||
- Při řešení kolizí loď pouze posouváme ven z asteroidů.
|
||||
- Při kolizi nezáleží na tom, v jaké fázi řešení podkroků vydělíme rychlost lodi dvěma.
|
||||
|
||||
Dále, pro detekci průsečíku lodi s asteroidem či cílem schválně používáme `euclidean_distance`, která má odmocninu zaokrouhlenou dolů.
|
||||
Sice by kolize šly počítat exaktně pomocí druhých mocnin vzdálenosti, ale v okrajových případech bychom naráželi na limity velikosti čísel.
|
||||
|
||||
Naše rustová (vyhodnocovadlo) i typescriptová (webová vizualizace) implementace používá místo exaktní `isqrt` klasickou float64 odmocninu, kterou poté zaokrouhlíme dolů na celé číslo.
|
||||
|
|
Loading…
Reference in a new issue