Я пишу функцию для рисования приблизительного круга на квадратном массиве (в Matlab, но проблема в основном алгоритмическая).
Цель состоит в том, чтобы создать маску для интеграции света, который падает на часть датчика CCD от точечного источника с ограниченной дифракцией (диаметр которого соответствует нескольким пикселям на матрице CCD). Таким образом, датчик CCD видит шаблон с симметрией вращения, который, разумеется, не обязан центрироваться на одном конкретном пикселе CCD (см. Пример изображения ниже).
Вот алгоритм, который я сейчас использую для создания моей дискретной круговой маски и который работает частично (код Matlab / Octave):
xt = linspace(-xmax, xmax, npixels_cam); % in physical coordinates (meters)
[X Y] = meshgrid(xt-center(1), xt-center(2)); % shifted coordinate matrices
[Theta R] = cart2pol(X,Y);
R = R'; % cart2pol uses a different convention for lines/columns
mask = (R<=radius);
Как видите, мой алгоритм выбирает (устанавливает в 1) все пиксели, физическое расстояние которых (в метрах) меньше или равно радиусу, который не обязательно должен быть целым числом.
Мне кажется, что мой алгоритм не может быть лучшим решением этой проблемы. В частности, я хотел бы, чтобы он включал пиксель, в котором присутствует центр, даже если радиус очень мал.
Есть идеи?
(См. http://i.stack.imgur.com/3mZ5X.png для примера изображения пятна, ограниченного дифракцией, на ПЗС-камере).