Это простая проблема преобразования ваших мировых координат в экранные координаты.
Я понимаю, что первоначальный вопрос был о кругах, но я собираюсь использовать квадрат в интересах более простых примеров псевдокода и математики.
Рассмотрим простой пример, где вы собираетесь нарисовать квадрат, который вы смоделировали как один угол в [0, 0]
и противоположный угол в [1, 1]
в мировых координатах. То, что вы хотели бы видеть на первом примере экрана (с пикселями, которые растягиваются от 0 до 500 в каждом измерении) - это один угол в [0, 0]
, а другой в [500, 500]
в пиксельном пространстве.
Это простое матричное преобразование, известное как масштабная матрица . Вкратце, матрица масштабирования, в которой вы нуждаетесь, будет иметь одинаковый коэффициент масштабирования для каждого из диагональных элементов и нулей везде. Записанный в виде псевдокода (используя *
в качестве операции умножения матрицы на вектор ), мы можем сказать, что:
worldCorner0 = {0, 0};
scaleMatrix = {500, 0,
0, 500};
pixelCorner0 = scaleMatrix * worldCorner0;
worldCorner1 = {1, 1};
pixelCorner1 = scaleMatrix * worldCorner1;
Результат будет pixelCorner0 = {0, 0}
и pixelCorner1 = {500, 500}
.
Теперь в другом примере у вас экран неквадратный, но вы все равно хотите нарисовать свой квадрат без искажений. Вам по-прежнему нужна масштабная матрица, но, если вы хотите видеть весь квадрат на экране, вы должны продолжать масштабирование на наименьшее количество пикселей в размерах экрана. Если вы использовали большее число, квадрат расширится от видимой области (но все равно останется квадратом).
В вашем случае максимальный размер второго экрана составляет 800 пикселей в одном измерении и 500 - в другом. Удобно, что у вас уже есть масштабная матрица, которая масштабируется на 500 пикселей. Если вы нарисуете пиксельные углы, описанные выше, вы сохраните свою геометрию независимо от размеров экрана.