2017-01-11 4 views
4

Я проектирую аппаратное обеспечение, которое должно постепенно увеличивать значение переменной от одного значения до другого в пределах определенного диапазона тактовых циклов - графически вы можете просматривать его как рисование сплошной линии.Рисование строки во временной области

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

Я ищу советы

  • может Bresenham-х как-то изменить для работы в вышеназванной ситуации в октанте 2, когда оси не могут быть заменены;
  • какой другой алгоритм может использоваться для ситуаций, когда диапазон x меньше, чем у-диапазон;
  • Возможно, есть какой-то другой подход к разрешению и другой алгоритм, охватывающий оба сценария?

Ограничения: разделение не допускается, а также FP-эмуляция. Разрешается умножение (а также сложение и вычитание).

Обновление: по модулю, отличным от 2^n, не допускается. Только целочисленная математика (без знака и/или подпись). Настройка алгоритма должна занимать один или два цикла.

+0

Линии рисования всегда происходят в пиксельном домене. Поэтому не должно быть (не может быть) никаких проблем с использованием Bresenham. –

+0

@ XenkHolterman - ось времени и не может быть заменена осью y. – Anonymous

ответ

3

Алгоритм Брешенема легко адаптируется для этой ситуации.

Если диапазон у (dy) больше, чем диапазон х (dx), то вы можете разделить dy/dx в дробных и itegral частей:

  • использует алгоритм Bresenham для расчета линии от (x,y) до (x+dx,y+dy%dx)
  • Добавить (x-dx)*floor(dy/dx), т.е. аккумулировать дополнительно floor(dy/dx) на каждые x приращение.
+0

Отдел не допускается. Modulo не допускается. Переменные (регистры) являются только целыми. – Anonymous

+0

@ Вы можете использовать только модуль с модулем во время настройки, а затем сохранить результаты. Если ваш процессор не имеет инструкции деления, вы можете вычислить его с помощью алгоритма shift + subtract. Может быть, не так быстро, чтобы делать на каждом значении x, но, вероятно, достаточно быстро, чтобы сделать это во время настройки –

+0

Вы придумали проблему. Операция установки должна выполняться в течение одного или двух тактов. Сдвиг-вычитание - это деление, которое не допускается. – Anonymous

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