Расчет положения полосы прокрутки - PullRequest
2 голосов
/ 10 сентября 2009

Я пытаюсь нарисовать вертикальную полосу прокрутки для моего апплета G15, но мне трудно правильно ее расположить (если вы ничего не сделали для ЖК-экрана G15, подумайте о том, чтобы нарисовать изображение размером 160x43 пикселей).

Это мой текущий код для позиционирования:

perc = (float)Math.Round( range / Items.Count+1 );

y = ( perc * SelectedID+1 );

Верхний край полосы прокрутки находится в 5px от верхнего, нижний край - в 32px. Y в этом случае будет верхним концом полосы прокрутки, и я использую длину 2 пикселя; Я попытался применить планку переменной длины, как и в коде выше. SelectionID равен 0 на основе.

Все, что мне нужно, это математика, чтобы выяснить положение, не нужно кода для ее рисования.

Спасибо.

1 Ответ

6 голосов
/ 10 сентября 2009

То есть вы просто после прямой линейной интерполяции, верно?

Так как у вас есть значение c в диапазоне a..b, и вам нужно результирующее значение в диапазоне x..y на основе его линейного положения между a и b?

Уравнение для этой ситуации (при условии, что рассматриваемые числа являются числами с плавающей запятой или двойными числами):

// c is between a and b
pos = (c-a)/(b-a) // pos is between 0 and 1
result = pos * (y-x) + x // result is between x and y

Теперь, если все 0 проиндексировано, вы можете опустить a и x, чтобы получить

pos = c/b
result = pos * y

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

Вы можете объединить все уравнения вместе, если не можете привести что-либо к удвоению, хотя:

result = (c * y) / b

Это гарантирует, что c и y будут умножены вместе до целочисленного деления, что уменьшит ошибку, связанную с целочисленным делением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...