Тикающая функция графера - PullRequest
       9

Тикающая функция графера

2 голосов
/ 07 декабря 2008

Я пытаюсь выяснить следующую проблему. Я строю еще один инструмент для математической функции. Функция рисуется в предопределенном диапазоне x, y, и это все хорошо.

Сейчас я работаю над фоном и пометив оси X, Y (если отображаются какие-либо оси).

Я разработал следующее. У меня фиксированная ширина 250 р Зазор между галочками должен составлять от 12,5 до 50 пунктов.

Галочки должны указывать единицу или половину единицы измерения, под этим я подразумеваю следующее.

х диапазон (-5, 5): один тик = 1

x range (-1, 1): один тик = 0,5 или 0,1 в зависимости от разрыва, который будет генерировать каждый из этих параметров.

х диапазон (0,1, 0,3): 0,05

Учитывая Xrange Как бы вы получили количество тиков между полным или половинным диапазоном единиц?

Или, может быть, есть другие способы решения этого типа проблем.

Ответы [ 5 ]

4 голосов
/ 07 декабря 2008

Один из способов сделать это - «нормализовать» разницу между минимумом и максимумом и провести различие в регистре для этого значения. В питоне:

delta = maximum - minimum
factor = 10**math.ceil(math.log(delta,10))  # smallest power of 10 greater than delta
normalised_delta = delta / factor           # 0.1 <= normalised_delta < 1
if normalised_delta/5 >= 0.1:
  step_size = 0.1
elif normalised_delta/5 >= 0.05:
  step_size = 0.05
elif normalised_delta/20 <= 0.01:
  step_size = 0.01
step_size = step_size * factor

Приведенный выше код предполагает, что вы хотите максимально возможный разрыв. Для самых маленьких вы должны использовать следующее, если:

if normalised_delta/20 == 0.005:
  step_size = 0.005
elif normalised_delta/20 <= 0.01:
  step_size = 0.01
elif normalised_delta/5 >= 0.05:
  step_size = 0.05

Помимо возможности того, что существует более одного подходящего значения, существует также несколько тревожная возможность того, что их нет. Возьмем, к примеру, диапазон [0,24], где разрыв 12,5p даст размер шага 1,2, а разрыв 50p даст размер шага 4,8. Между ними нет ни «единицы», ни «половины единицы». Проблема заключается в том, что разница между пропуском 12,5p и одним из 50p является фактором 4, а разница между 0,01 и 0,05 - фактором 5. Таким образом, вам придется немного расширить диапазон допустимых пропусков и соответствующим образом изменить код .

Разъяснение некоторых магических чисел: деления на 20 и 5 соответствуют количеству сегментов с минимальным и максимальным размером зазора соответственно (т. Е. 250 / 12,5 и 250/50). Поскольку нормализованная дельта находится в диапазоне [0,1,1), вы получите, что, поделив ее на 20 и 5, вы получите [0,005,05) и [0,02,0,2) соответственно. Эти диапазоны приводят к возможным (нормализованным) размерам шагов 0,005 и 0,01 для первого диапазона и 0,05 и 0,1 для второго.

0 голосов
/ 07 декабря 2008

В диапазоне -1, 0

я получаю

normalised_delta 1.0
step_size 0.1
Total steps 10.0
Range [ -1 , 0 ]
firstInc  -1.0 tick at  0.0
start at  0.0 0.0
 inc -0.9 tick at  25.0
 inc -0.8 tick at  50.0
 inc -0.7 tick at  75.0
 inc -0.6 tick at  100.0
 inc -0.5 tick at  125.0
 inc -0.4 tick at  150.0
 inc -0.3 tick at  175.0
 inc -0.2 tick at  200.0
 inc -0.1 tick at  225.0
 inc -1.38777878078e-16 tick at  250.0
 inc 0.1 tick at  275.0

Почему вторая строка снизу получила это число?

0 голосов
/ 07 декабря 2008

Это похоже на то, что я ожидал.

математика импорта

def main (): getTickGap (-1,1.5)

def next_multiple (x, y): вернуть math.ceil (x / y) * y

def getTickGap (xmin, xmax): xdelta = xmax -xmin ширина = 250 # наименьшая мощность 10 больше, чем дельта коэффициент = 10 ** math.ceil (math.log (xdelta, 10)) # 0.1 <= normalised_delta <1 normalised_delta = xdelta / factor печать ("normalised_delta", normalised_delta) </p>

# we want largest gap
if normalised_delta/4 >= 0.1:
  step_size = 0.1
elif normalised_delta/4 >= 0.05:
  step_size = 0.05
elif normalised_delta/20 <= 0.01:
  step_size = 0.01
step_size = step_size * factor


##    if normalised_delta/20 == 0.005:
##      step_size = 0.005
##    elif normalised_delta/20 <= 0.01:
##      step_size = 0.01
##    elif normalised_delta/4 >= 0.05:
##      step_size = 0.05
##    step_size = step_size * factor
print("step_size", step_size)
totalsteps = xdelta/step_size
print("Total steps", totalsteps)
print("Range [", xmin, ",", xmax, "]")

firstInc = next_multiple(xmin, step_size)
count = (250/xdelta)*(firstInc - xmin)
print("firstInc ", firstInc, 'tick at ', count)
print("start at ", firstInc - xmin, (width/totalsteps)*(firstInc - xmin))
inc = firstInc

while (inc <xmax):
    inc += step_size
    count += (width/totalsteps)
    print(" inc", inc, "tick at ", count)

если name == " main ": Основной () * 1 016 *

0 голосов
/ 07 декабря 2008

Возможно, вы захотите взглянуть на Jgraph , который решает дополнительную проблему: это устройство для сбора данных, а не устройство для функций. Но есть много общего, например, работа с основными и второстепенными отметками, надписи на осях и т. Д. И т. Д. Я считаю язык ввода немного многословным на мой вкус, но Jgraph создает действительно хорошие технические графики. На сайте есть много примеров и, возможно, есть хорошие идеи, которые вы можете украсть.

И вы знаете, что они говорят: талант имитирует, а гений крадет: -)

0 голосов
/ 07 декабря 2008

Использование deltaX

если дельтакс от 2 до 10 с половиной приращения если дельтакс от 10 до 20 единиц приращения если меньше 2, мы умножаем на 10 и тестируем снова если больше 20, мы делим Затем мы получаем позицию первого блока или половину приращения по ширине, используя xmin.

Мне все еще нужно протестировать это решение.

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