#python
Вопрос:
В настоящее время я моделирую прохождение света через оптическую систему с помощью python и Zemax. В настоящее время я настроил его, где я определяю границы x и y «датчика», чтобы я мог выбрать размер области, которую я хочу смоделировать. Я получаю 1 прямоугольник.
Я хотел бы смоделировать девять прямоугольников в сетке 3х3. Я не уверен, какой способ был бы самым элегантным… моя первая идея состояла в том, чтобы «жестко закодировать» разные интервалы в 9 разных сценариев и запустить их через сценарий bash, но это кажется немного «неэлегантным».
Как мне теперь определить xmax, xmin, ymax, ymin, чтобы я мог запустить ту же симуляцию и получить эти девять повторений?
Моя мысль состояла в том, чтобы, возможно, создать какой-то список, в котором определены границы, а затем, возможно, каждый раз повторять моделирование с другой границей и, наконец, объединять появляющиеся изображения.
Текущий код довольно длинный, но все параметры заданы в основных функциях, которые выглядят следующим образом:
if __name__ == '__main__':
DirNameZmx = r'C:SomePath'
FileNameZmx = r"Optics.zmx"
DirNameResults = r"C:SomeOtherPath"
FileNameResults = r"Interferogram_Result"
(QueueFieldsOut, QueueToDetector, ProcessRaytracing, ProcessesPsfWorkers, ProcessDetector) =
InitializeSimulation(DirNameZmx=DirNameZmx, FileNameZmx=FileNameZmx,
DirNameResults=DirNameResults, FileNameResults=FileNameResults,
FieldAngleHxMin=-0.02, FieldAngleHxMax= 0.02, dFieldAngleX=0.001,
FieldAngleHyMin=-0.06, FieldAngleHyMax= 0.06, dFieldAngleY=0.001,
NbrWavelength=1, Configurations=[1, 2], NbrRaysFieldRow=32, RAperture=0.99,
DetectorImageSize=11., DetectorPixelSize=0.011, ZeroPadding=8,
BatchRaysMax=512**2, NbrProcessWorkers=2)
print(ProcessRaytracing.join())
for Process in ProcessesPsfWorkers:
print(Process.join())
print(Process.name, Process.exitcode)
print(ProcessDetector.join())
data = np.load(os.path.join(DirNameResults, FileNameResults '.npy'))
plt.imshow(data, cmap="coolwarm")
plt.show()
FieldAngleHxMin/Max и FieldAngleHyMin/Max являются границами прямоугольника. Результат выглядит так:
Комментарии:
1. Можете ли вы поделиться кодом, который вы в настоящее время используете, чтобы получить один прямоугольник, чтобы дать нам основу для работы и вписаться в ваш текущий подход?
2. Конечно, я виноват. Я отредактирую его в
3. Что-то еще, о чем я подумал, и где я не уверен, как именно это сделать, заключается в том, что у меня может быть своего рода справочный файл, в котором я указываю границы для каждого меньшего прямоугольника. Затем я импортирую этот файл в свой сценарий моделирования, а затем запускаю моделирование с каждым набором границ, т. Е. 9 раз
Ответ №1:
Простая итерация сделает всю работу.
Попробуйте это:
def nine_squares(FieldAngleHxMin, FieldAngleHxMax, FieldAngleHyMin, FieldAngleHyMax):
xstep = (FieldAngleHxMax - FieldAngleHxMin) / 3
ystep = (FieldAngleHyMax - FieldAngleHyMin) / 3
for i in range(3):
for j in range(3):
xstartpoint = xstep i * FieldAngleHxMin
xendpoint = xstep (i 1) * FieldAngleHxMin
ystartpoint = ystep i * FieldAngleHyMin
yendpoint = ystep (i 1) * FieldAngleHyMin
yield (xstartpoint, xendpoint, ystartpoint, yendpoint)
Он будет возвращать списки начальных и конечных координат при каждом вызове.
Комментарии:
1. Я понимаю, но разве это не даст мне 9 квадратов, которые заполняют большую площадь? Возможно, я неправильно прояснил свою проблему: я пытаюсь выполнить выборку детектора в 9 заранее определенных «областях», а не разбивать время моделирования на 9 частей.