test area draw line

This commit is contained in:
Bartosz Kościów 2017-05-30 18:42:07 +02:00
parent e8c7f815c2
commit 73f15ba6b8
3 changed files with 208 additions and 15 deletions

View File

@ -32,47 +32,79 @@ class Area(Pixel):
for _ in itertools.repeat(None, length): for _ in itertools.repeat(None, length):
self.driver.data(color, None) self.driver.data(color, None)
# def _calculate_steps(self, length, step, required_length):
# """calculate lineparts - helper"""
# steps = [length for _ in range(0, step)]
# if step * length < required_length:
# for idx in range(0, required_length - step * length):
# steps[idx] += 1
#
# return steps
def _calculate_steps(self, length, step, required_length): def _calculate_steps(self, length, step, required_length):
"""calculate lineparts - helper""" """calculate lineparts - helper"""
steps = [length for _ in range(0, step)] steps = [length for _ in range(0, step)]
if step * length < required_length: if step * length < required_length:
for idx in range(0, required_length - step * length): offset = len(steps) // 2
steps[idx] += 1 rest = required_length - step * length
steps_even = True if len(steps) & 1 == 0 else False
rest_even = True if rest & 1 == 0 else False
appendix = 0
for idx in range(0, rest):
steps[offset + appendix] += 1
if steps_even:
appendix = self._calculate_appendix(appendix)
elif idx > 0 and rest_even:
appendix = self._calculate_appendix(appendix)
elif not rest_even:
appendix = self._calculate_appendix(appendix)
return steps return steps
def _calculate_appendix(self, appendix):
"""calculate appendix during drawing a line"""
if appendix == 0:
appendix = -1
elif appendix < 0:
appendix *= -1
else:
appendix = (appendix + 1) * -1
return appendix
def draw_line(self, pos_x1, pos_y1, pos_x2, pos_y2): def draw_line(self, pos_x1, pos_y1, pos_x2, pos_y2):
"""draw diagonal line""" """draw diagonal line"""
width = abs(pos_x2 - pos_x1) width = abs(pos_x2 - pos_x1)
height = abs(pos_y2 - pos_y1) height = abs(pos_y2 - pos_y1)
if pos_x1 == pos_x2: if pos_x1 == pos_x2:
steps = [height] steps = [height+1]
horizontal = False horizontal = False
offset_x = offset_y = 0 offset_x = offset_y = 0
elif pos_y1 == pos_y2: elif pos_y1 == pos_y2:
steps = [width] steps = [width+1]
horizontal = True horizontal = True
offset_x = offset_y = 0 offset_x = offset_y = 0
elif width > height: elif width > height:
width += 1
if pos_x2 < pos_x1: if pos_x2 < pos_x1:
pos_x1, pos_x2 = pos_x2, pos_x1 pos_x1, pos_x2 = pos_x2, pos_x1
pos_y1, pos_y2 = pos_y2, pos_y1 pos_y1, pos_y2 = pos_y2, pos_y1
offset_y = 1 if pos_y2 > pos_y1 else -1 offset_y = 1 if pos_y2 > pos_y1 else -1
offset_x = 1 if pos_x2 > pos_x1 else -1 offset_x = 1 if pos_x2 > pos_x1 else -1
horizontal = True horizontal = True
step = height step = height + 1
length = width / step length = width // step
steps = self._calculate_steps(length, step, width) steps = self._calculate_steps(length, step, width)
else: else:
height += 1
if pos_y2 < pos_y1: if pos_y2 < pos_y1:
pos_x1, pos_x2 = pos_x2, pos_x1 pos_x1, pos_x2 = pos_x2, pos_x1
pos_y1, pos_y2 = pos_y2, pos_y1 pos_y1, pos_y2 = pos_y2, pos_y1
offset_y = 1 if pos_y2 > pos_y1 else -1 offset_y = 1 if pos_y2 > pos_y1 else -1
offset_x = 1 if pos_x2 > pos_x1 else -1 offset_x = 1 if pos_x2 > pos_x1 else -1
horizontal = False horizontal = False
step = width step = width + 1
length = height / step length = height // step
steps = self._calculate_steps(length, step, height) steps = self._calculate_steps(length, step, height)
delta_y = 0 delta_y = 0

View File

@ -26,3 +26,165 @@ class TestPageDrawing(object):
buffer = self.get_buffer() buffer = self.get_buffer()
buffer[1][1] = 1 buffer[1][1] = 1
assert_equal(self.drv.buffer, buffer) assert_equal(self.drv.buffer, buffer)
def test_draw_two_pixel(self):
self.lcd.draw_pixel(1, 1)
self.lcd.draw_pixel(2, 2)
buffer = self.get_buffer()
buffer[1][1] = 1
buffer[2][2] = 1
assert_equal(self.drv.buffer, buffer)
def test_draw_horizontal_line(self):
self.lcd.draw_line(1, 1, 8, 1)
buffer = self.get_buffer()
buffer[1][1] = 1
buffer[2][1] = 1
buffer[3][1] = 1
buffer[4][1] = 1
buffer[5][1] = 1
buffer[6][1] = 1
buffer[7][1] = 1
buffer[8][1] = 1
self.draw_buffer(self.drv.buffer)
assert_equal(self.drv.buffer, buffer)
def test_draw_vertical_line(self):
self.lcd.draw_line(1, 1, 1, 14)
buffer = self.get_buffer()
buffer[1][1] = 1
buffer[1][2] = 1
buffer[1][3] = 1
buffer[1][4] = 1
buffer[1][5] = 1
buffer[1][6] = 1
buffer[1][7] = 1
buffer[1][8] = 1
buffer[1][9] = 1
buffer[1][10] = 1
buffer[1][11] = 1
buffer[1][12] = 1
buffer[1][13] = 1
buffer[1][14] = 1
self.draw_buffer(self.drv.buffer)
assert_equal(self.drv.buffer, buffer)
def test_draw_overlapping_lines(self):
self.lcd.draw_line(1, 1, 8, 1)
self.lcd.draw_line(1, 1, 1, 14)
buffer = self.get_buffer()
buffer[1][1] = 1
buffer[2][1] = 1
buffer[3][1] = 1
buffer[4][1] = 1
buffer[5][1] = 1
buffer[6][1] = 1
buffer[7][1] = 1
buffer[8][1] = 1
buffer[1][1] = 1
buffer[1][2] = 1
buffer[1][3] = 1
buffer[1][4] = 1
buffer[1][5] = 1
buffer[1][6] = 1
buffer[1][7] = 1
buffer[1][8] = 1
buffer[1][9] = 1
buffer[1][10] = 1
buffer[1][11] = 1
buffer[1][12] = 1
buffer[1][13] = 1
buffer[1][14] = 1
assert_equal(self.drv.buffer, buffer)
def test_draw_diagonal_line(self):
self.lcd.draw_line(0, 0, 9, 1)
buffer = self.get_buffer()
buffer[0][0] = 1
buffer[1][0] = 1
buffer[2][0] = 1
buffer[3][0] = 1
buffer[4][0] = 1
buffer[5][1] = 1
buffer[6][1] = 1
buffer[7][1] = 1
buffer[8][1] = 1
buffer[9][1] = 1
self.draw_buffer(self.drv.buffer)
assert_equal(self.drv.buffer, buffer)
def test_draw_diagonal_line_even_steps(self):
self.lcd.draw_line(0, 0, 9, 15)
buffer = self.get_buffer()
buffer[0][0] = 1
buffer[1][1] = 1
buffer[2][2] = 1
buffer[2][3] = 1
buffer[3][4] = 1
buffer[3][5] = 1
buffer[4][6] = 1
buffer[4][7] = 1
buffer[5][8] = 1
buffer[5][9] = 1
buffer[6][10] = 1
buffer[6][11] = 1
buffer[7][12] = 1
buffer[7][13] = 1
buffer[8][14] = 1
buffer[9][15] = 1
self.draw_buffer(self.drv.buffer)
assert_equal(self.drv.buffer, buffer)
def test_draw_diagonal_line_even_steps_even_rest(self):
self.lcd.draw_line(0, 0, 9, 5)
buffer = self.get_buffer()
buffer[0][0] = 1
buffer[1][1] = 1
buffer[2][1] = 1
buffer[3][2] = 1
buffer[4][2] = 1
buffer[5][3] = 1
buffer[6][3] = 1
buffer[7][4] = 1
buffer[8][4] = 1
buffer[9][5] = 1
self.draw_buffer(self.drv.buffer)
assert_equal(self.drv.buffer, buffer)
def test_draw_diagonal_line_odd_steps_even_rest(self):
self.lcd.draw_line(0, 0, 9, 6)
buffer = self.get_buffer()
buffer[0][0] = 1
buffer[1][1] = 1
buffer[2][2] = 1
buffer[3][2] = 1
buffer[4][3] = 1
buffer[5][3] = 1
buffer[6][4] = 1
buffer[7][4] = 1
buffer[8][5] = 1
buffer[9][6] = 1
self.draw_buffer(self.drv.buffer)
assert_equal(self.drv.buffer, buffer)
def test_draw_diagonal_line_even_steps_odd_rest(self):
self.lcd.draw_line(0, 0, 8, 6)
buffer = self.get_buffer()
buffer[0][0] = 1
buffer[1][1] = 1
buffer[2][2] = 1
buffer[3][3] = 1
buffer[4][3] = 1
buffer[5][3] = 1
buffer[6][4] = 1
buffer[7][5] = 1
buffer[8][6] = 1
self.draw_buffer(self.drv.buffer)
assert_equal(self.drv.buffer, buffer)
def draw_buffer(self, buffer):
for y in range(self.lcd.height):
row = ""
for x in range(self.lcd.width):
row += str(buffer[x][y])
print (row)

View File

@ -139,19 +139,18 @@ class TestPageDrawing(object):
assert_equal(self.lcd.buffer, buffer) assert_equal(self.lcd.buffer, buffer)
def test_draw_diagonal_line_even_steps_odd_rest(self): def test_draw_diagonal_line_even_steps_odd_rest(self):
self.lcd.draw_line(0, 0, 9, 6) self.lcd.draw_line(0, 0, 8, 6)
buffer = self.get_buffer() buffer = self.get_buffer()
buffer[0][0] = 1 buffer[0][0] = 1
buffer[1][0] = 2 buffer[1][0] = 2
buffer[2][0] = 4 buffer[2][0] = 4
buffer[3][0] = 4 buffer[3][0] = 8
buffer[4][0] = 8 buffer[4][0] = 8
buffer[5][0] = 8 buffer[5][0] = 8
buffer[6][0] = 16 buffer[6][0] = 16
buffer[7][0] = 16 buffer[7][0] = 32
buffer[8][0] = 32 buffer[8][0] = 64
buffer[9][0] = 64 self.draw_buffer(self.lcd.buffer)
assert_equal(self.lcd.buffer, buffer) assert_equal(self.lcd.buffer, buffer)
def test_fill_rect(self): def test_fill_rect(self):