Прежде чем приступить к программированию, давайте сделаем немного MATH:
Пусть screen_width
будет переменной, обозначающей ширину пиксельной сетки.Пусть button_width
будет переменной, обозначающей ширину кнопки.
Если порядок идеально отцентрирован, если screen_width
нечетно, то button_width
также должно быть нечетным.Кроме того, если screen_width
четное, то button_width
четное.Первоначально у нас был только 1 пиксель минимум для кнопки.Однако это можно расширить до минимума 2 пикселей, если сетка пикселей имеет четное число пикселей в ширину.
Ниже приведены результаты для некоторых примеров размеров холста (screen_width
):
+--------+---------+
| Canvas | Central |
| width | Button |
| | width |
+--------+---------+
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 2 |
| 5 | 3 |
+--------+---------+
Пусть n = max {целое число k такое, что k меньше или равно 60% ширины экрана, а k is имеет ту же четность (четную или нечетную), что и ширина экрана.
Пусть m будет такой переменной, что m = 1, если (ширина экрана нечетная), и (m = 2), если ширина экрана четная.
Пусть button_width
будет min {n, m} Тогда button_width
обладает всеми необходимыми свойствами.
Программирование
Теперь мы наконец-то напишем некоторый код:
int CALC_BUTTON_WIDTH(int screen_width, float fraction) {
int bw_lrg = CALC_BUTTON_WIDTH_FOR_LRG_CANVAS(screen_width, fraction);
int bw_sml = CALC_BUTTON_WIDTH_FOR_SML_CANVAS(screen_width, fraction);
button width = min(bw_sml, bw_lrg);
return button_width;
}
int CALC_BUTTON_WIDTH_FOR_SML_CANVAS(int screen_width, float fraction) {
// sw_pairity --- parity of screen width
// sw_pairity is 0 if screen width is even
// sw_pairity is 1 if screen width is odd
sw_pairity = screen width % 2;
// sw_pairity_inv --- inverse of parity of screen width
// sw_pairity_inv is 1 if screen width is even
// sw_pairity_inv is 0 if screen width is odd
sw_pairity_inv = 1 – sw_pairity;
// bw_sml is the button with minimum.
// Either 1 or 2 pixels
// if screen is even number of pixels wide, bw_sml is 1
// if screen is odd number of pixels wide, bw_sml is 0
// Example: screen 3 --> button 1
// Example: screen 4 --> button 2
//
// --X- button not centered!
// -XX- okay
//
// --X-- okay
// -XX-- button not centered!
bw_sml = 1 + sw_pairity_inv;
return bw_sml;
}
int CALC_BUTTON_WIDTH_FOR_LRG_CANVAS(int screen_width, float fraction) {
int sw_pairity;
int bw_lrg;
sw_pairity = screen width % 2;
bw_lrg = floor(fraction * screen_width);
bw_lrg_parity = bw_lrg % 2;
correction = (sw_pairity + bw_lrg_parity) % 2;
bw_lrg = bw_lrg + correction;
return bw_lrg;
}