2015-05-25 2 views
0

Я пытаюсь написать программу, которая записывает цифровой автомобиль Speedo на ЖК-экран (ST7735) с Tiva C (Tm4C123GXL). Приложенный код - это функция линии ничьей, которая должна нарисовать прямую линию между двумя расстояниями. если я включу (speed_x1, speed_y1, 80, 60, ST7735_WHITE) в функцию, то до 45 градусов линия будет горизонтальной, а не под углом, как и должно быть. После 45 градусов до 90, рисунок в порядке, затем после 90 он снова ломается.c функция рисования не правильно рисуется

speed_x1 = 80 - 55 * cos((PI/180) * (speed * 1.8)) 
speed_y1 = 60 - 55 * sin((PI/180) * (speed * 1.8)) 

(Я хочу, чтобы спидометр на максимум на 100, следовательно, скорость * 1.8 1,8 град/км/ч)

Любая помощь в решении моей проблемы здесь было бы весьма признателен. Спасибо :)

void ST7735_DrawLine(short x1, short y1, short x2, short y2, unsigned short color) { 
     // unsigned char hi = color >> 8, lo = color; 
     //int x=x1; 
     //int y=y1; 

     int dy = y2 - y1; 
     int dx = x2 - x1; 
     double m = dy/dx; 
     double c = y1 - m * x1; 
     if ((x1 >= _width) || (y1 >= _height) || (x2 >= _width) || (y2 >= _height)) return; 
     setAddrWindow(x1, y1, x1 + x2 - 1, y2); 
     while(x1 <= x2) 
     { 
      if (m <= 1) 
      { 
       x1 = x1 + 1; 
       y1 = m * x1 + c; 
       ST7735_DrawPixel(x1,y1,color); 
      } 
      else 
      { 
       y1 = y1 + 1; 
       x1 = (y1 - c)/m; 
       ST7735_DrawPixel(x1,y1,color); 
      } 
     } 
    } 

void ST7735_DrawPixel(short x, short y, unsigned short color) { 
    if ((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) 
     return; 
    setAddrWindow(x,y,x+1,y+1); 
    pushColor(color); 
} 
+1

Почему начинающие всегда добавляют тег 'C' и' C++ '? Используйте типы 'stdint.h' для типов определенного размера. Slso, для tivia лучшим размером для аргументов будет '(u) int32_t', так как это 32-битный процессор, а не 16-разрядные типы, которые обычно были бы короткими. Также: что вы сделали, чтобы получить ошибку. У вас есть какой-то конкретный вопрос? «Почему мой код не работает» слишком широк; обратите внимание, что большинство ppl здесь не будут иметь этого оборудования. Если это будет алгоритм рисования линии Bresenham, обратите внимание на то, что он обычно требует переупорядочения координат, если линия не находится в пределах 0-45 градусов (base/dir зависит от реализации). – Olaf

+0

Обратите внимание, что вы можете безопасно сравнивать отрицательные значения, если вы используете uint32_t для координат. Стандартное предупреждение: UB, если вы передали подписанный отрицательный знак в unsigned! – Olaf

+0

мой конкретный вопрос: «Почему он рисует горизонтальную линию, когда она должна быть под углом?» Но похоже, что мне может понадобиться разбить его на 45 градусов и код для каждого из них. –

ответ

1

Проблема с типом. M приводит к 0, когда dy/dx меньше единицы. Typecast их плавает, чтобы получить поплавок в результате.

0

Если бы bresenham line drawing algorithm отметить, что он работает только в пределах 45 град. (Всегда удивляйтесь, почему ppl даже не взглянул на WP.) Не уверен, но поскольку ваша фамилия имеет немецкое происхождение: вы также найдете это на немецком языке на WP.

Для других углов вам придется менять/изменять порядок координат. Возможно, было бы лучше иметь отдельные алгоритмы рисования для горизонтальных и диагональных линий, если производительность является проблемой (но, поскольку вы используете double, очевидно, что она вообще отсутствует).

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