class Lasgun(Module):
mass = 0
consumption = 0
efficiency = 1
output_range = [1e10, 8e10] # 최대/최소 출력 (W... 이긴 한데, 사실 계속 조사하는 게 아니니 의미없을듯?)
efficiency = 0.98 # 에너지 효율, 0에서 1 사이
minwavelength = 40e-9 # 빔의 파장 사실 BPP/렌즈 직경을 이렇게 물리적으로 유도할 필요는 없고,
m_square = 1.2 # 품질 계수 실상 이상값과 현실 차이에는 격차가 크므로...
caliber = 0.12 # 렌즈의 '구경' 걍 바로 self.BPPpercaliber 집어넣는 게 편할지도
cep = 30 # 명중률을 1e9 m에서의 공산오차 형태로 표시.
accuracy = 1000 / cep - 10
tracking = 40
reloadtime = 16 # 쿨타임
def __init__(self, socket):
super().__init__(socket)
self.damaged = {'energy': None, 'output': None, 'precision': None,
'reloadtime': None, 'BPP/D': None}
self.setting = {'target': None, 'output': self.output_range[1],
'wavelength': self.minwavelength,
'cep': self.cep, 'tracking': self.tracking}
def get_shot(self, k=8, n=8):
target, output, wavelength, cep, tracking = self.setting.values()
scandata = self.socket.scanned[target.name]
distance = self.socket.measure_dstnc(target)
time = (10 + distance/1e8) * 100 / (100+tracking)
k = k * time / 100
impact_pos, impact_vel = scandata.get_target_acquisition(time, k, n)
if impact_pos is None:
return
gap = np.linalg.norm(impact_pos - self.socket.get_pos())
relative_spd = np.linalg.norm(impact_vel - self.socket.get_vel())
impact_pos += np.random.normal(0, 0.65*cep*gap/1e9, 3)
impact_pos += np.random.normal(0, (relative_spd/tracking
*gap/1e9), 3)
relative_pos = impact_pos - self.socket.get_pos()
impact_f = np.linalg.norm(relative_pos)
w_0_ideal = impact_f * wavelength / (np.pi * self.caliber / 2)
z_r = np.pi * w_0_ideal ** 2 / wavelength
def omega_z(z):
return self.m_square * w_0_ideal * np.sqrt(1 + z**2/z_r**2)
def intensity(x, y, z):
return (2 * output / np.pi / omega_z(z)**2
* np.exp(-2 * (x**2 + y**2) / omega_z(z)**2))
z = project_vector(distance, relative_pos)
r = distance - z
z_abs = np.linalg.norm(z)-z_r
direction = target.get_direction()
p_direction = reject_vector(direction, relative_pos)
p_length = np.linalg.norm(p_direction)
if p_length * target.length >= target.beam:
x_center = np.dot(p_direction, r) / p_length
y_center = np.linalg.norm(-np.dot(p_direction, r)
* p_direction + r)
x_width = target.length / 2 * p_length
y_min = lambda x: (y_center - target.beam / 2
* np.sqrt(1 - (x-x_center)**2/x_width**2))
y_max = lambda x: (y_center + target.beam
* np.sqrt(1 - (x-x_center)**2/x_width**2))
else:
x_center = 0
y_center = np.linalg.norm(r)
x_width = target.beam / 2
y_min = lambda x: (y_center - target.beam / 2
* np.sqrt(1 - x**2/x_width**2))
y_max = lambda x: (y_center + target.beam / 2
* np.sqrt(1 - x**2/x_width**2))
pow = dblquad(lambda x, y: intensity(x, y, z_abs),
x_center-x_width, x_center+x_width, y_min, y_max)
print('\n'
f'error: {target.get_pos() - impact_pos}\n'
f'w_0_ideal: {w_0_ideal}\n'
f'z_r: {z_r}\n'
f'r: {r}\n'
f'x_center: {x_center}\n'
f'x_width: {x_width * 2}\n'
f'y_center: {y_center}\n'
f'pow: {pow[0]}\n'
)
return pow[0]
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.