2015-10-29 5 views
0

У меня есть массив точек, все из которых варьируются от x (0-512) и y (0-384), что означает соотношение сторон 4: 3.масштабирование 4: 3 указывает на 16: 9 баллов

Если я хочу показать все точки, отлично, на мониторе 16: 9, какая математика понадобится для достижения этого?

Скажет «й» моя 4: 3 точка и «точка» является 16: пунктом 9 мне нужно ..

Я думал, так что я пытаюсь растягивать его на 1920: мониторе 1080, который имеет соотношение сторон 16: 9

point = new PointF(ee.x * (1920/512), ee.y * (1080/384)); 

Но это похоже на abit.

Любая помощь? Благодарю.

+0

Что значит «отлично»? Заполните весь монитор 16: 9, который разрушит соотношение сторон (кружок превратится в яйцо) или сохранит пропорции и примет черные вертикальные полосы влево и вправо от изображения 3: 4? – Roland

+0

Удостоверьтесь, что вы используете поплавки, а затем приводите сюда целые числа '1920/512 = 3' и' 1080/382 = 2' ... просто делайте '1920.0' и' 1080.0' –

ответ

1

Вы не можете сопоставить с точностью до, а не путем умножения каждого измерения на целое число. Здесь единственное целое число, которое будет соответствовать 2 (причина 384 * 3> 1080) ...

, так что вы должны сделать:

point = new Point (ee.x * 2, ee.y * 2); 

и вы можете расположить его в центре с:

point = new Point (ee.x * 2 + ((1920 - 512*2)/2), ee.y * 2 + ((1080 - 384*2)/2))); 

Надежда, что помогает ...

Edit: с поплавками, вы должны принять минимум мультипликатора:

var multiplier = Math.Min(1920.0/512, 1080.0/384); 
point = new Point (ee.x * multiplier + ((1920 - 512*multiplier)/2), ee.y * multiplier + ((1080 - 384*multiplier)/2))); 
+0

Мне очень жаль .. Я забыл сказать PointF вместо точки. Я принимаю значения float. – Pops

0

Не могли бы вы уточнить, что вы подразумеваете под «выключением»?

Если вы имеете в виду, что изображение выглядит растянутым по горизонтали, это связано с тем, что соотношение сторон больше, чем раньше. Если вы хотите, чтобы изображение выглядело так, как раньше (но больше), вам нужно масштабировать одну ось по соотношению сторон, чтобы исправить ее.

aspect_ratio_before = 4.0f/3.0f; 
aspect_ratio_after = 16.0f/9.0f; 

// This is equal to 4/3. 
aspect_ratio_difference = aspect_ratio_after/aspect_ratio_before; 

// I squish the X axis here. 
point.x /= aspect_ratio_difference; 

// Alternatively, you can also multiply point.y by the 
// aspect_ratio_difference, though that will stretch the Y axis instead. 
// Use only one! 
// point.y *= aspect_ratio_difference; 

Отказ от ответственности: Я не работал с .net и раньше, так что я не знаю, все детали его механизма рендеринга. Это связано с моим опытом работы с OpenGL и масштабированием.

Смежные вопросы