TOPIC

Confuso em relação a questão

lleao8 asked 3 years ago

Alguém poderia me ajudar a entender como é o comparativo para entender quando há a interseção?

from math import sqrt
from dataclasses import dataclass
from typing import Dict
from math import pi

@dataclass
class Magia:
    dano: int
    level: Dict[int, int]

fire = Magia(200, {1: 20, 2: 30, 3: 50})
water = Magia(300, {1: 10, 2: 25, 3: 40})
earth = Magia(400, {1: 25, 2: 55, 3: 70})
air = Magia(100, {1: 18, 2: 38, 3: 60})

def menor_distancia(x1, x0, y1, y0) -> float:
    form = (x0 - x1)**2 + (y0 - y1)**2
    return round(sqrt(form), 2)

def golpe():
    dici = {'fire': fire, 'water': water, 'earth': earth, 'air': air}
    w, h, x0, y0 = [int(x) for x in input().split()]
    inp = input().split()
    var = inp[0]
    nivel, x1, y1 = [int(x) for x in inp[1:]]
    circulo_distancia_x = abs(x0 - x1)
    circulo_distancia_y = abs(y0 - y1)

    if dici[var].level[nivel] >= menor_distancia(circulo_distancia_x, w/2, circulo_distancia_y, h/2):
        return dici[var].dano
    else:
        return 0

output = []
for _ in range(int(input())):
    output.append(golpe())

print(*output, sep="\n")

Remember not post solutions. Your post may be reviewed by our moderators.

  • BrunoSanches replied 3 years ago

    O que você está fazendo de errado no comparativo é dizer que o ponto mais próximo é sempre o (x0, y0), considere um retângulo com certas coordenadas e vá colocando pontos ao redor deles, qual o ponto do retângulo mais próximo de cada ponto ? Em alguns casos é o ponto que está numa linha perpendicular ao lado do triângulo e que cruza o ponto desejado, nestes casos a distância é apenas a diferença entre algumas coordenadas (x ou y para x0, x0+w, y0 ou y0+h), em outros casos é necessário usar teorema de pitágoras para achar a distância a um dos vértices do retângulo (quando não há uma linha perpendicular ligando o ponto a um lado do retângulo)

    Ao descobrir uma forma de achar a distância, você consegue determinar se há interseccção apenas identificando se o raio é maior que essa distância.