202206-4 光线追踪 CCF Python
各位征战CCF的友友们,求帮忙看下代码还能再快些嘛?
主要思路是:可以把镜子看做一段线段,求出线段所在直线的表达式y=ax+b,判断光源是否经过这个线段内的点(不含端点),如果是就转向!如直线斜率是1,当方向0的点射到它就会变成方向1
m = int(input())
mirror = {} #保存镜子信息
def mir(x1,y1,x2,y2): #求直线表达书
a = (y2 - y1)/(x2 - x1)
b = y1 - a * x1
return a,b
def next(x,y,d): #定义每个方向如何走
if d == 0:
x += 1
elif d == 1:
y += 1
elif d == 2:
x -= 1
else:
y -= 1
return x,y,d
def trun_d(sl,d): #定义转向,通过直线斜率和原方向判断
if sl == 1 and d == 0:
d = 1
elif sl == 1 and d == 1:
d = 0
elif sl == 1 and d == 2:
d = 3
elif sl == 1 and d == 3:
d = 2
elif sl == -1 and d == 0:
d =3
elif sl == -1 and d == 3:
d = 0
elif sl == -1 and d == 1:
d =2
elif sl == -1 and d == 2:
d = 1
return d
k = 1
for i in range(m):
op = input().split()
if op[0] == '1':
mirror[k] = {}
x1,y1,x2,y2 = map(int,op[1:5])
mirror[k]['line'] = [min(x1,x2),max(x1,x2)]
sl,b = mir(x1,y1,x2,y2)
mirror[k]['b'] = b
mirror[k]['sl'] = sl
mirror[k]['a'] = float(op[5])
elif op[0] == '2':
del mirror[int(op[1])]
else:
x,y,d = map(int,op[1:4])
I = float(op[4])
t = int(op[5])
while t:
x, y, d = next(x, y, d)
for j in mirror.keys():
if y == (x * mirror[j]['sl'] + mirror[j]['b']) and (x > mirror[j]['line'][0]) and (x < mirror[j]['line'][1]):
d = trun_d(mirror[j]['sl'], d)
I = mirror[j]['a'] * I
t -= 1
if I >= 1:
print(x,y,int(I))
else:
print(0,0,0)
k += 1
写的有点乱,希望大家指正!