test area draw line
This commit is contained in:
parent
e8c7f815c2
commit
73f15ba6b8
@ -32,47 +32,79 @@ class Area(Pixel):
|
||||
for _ in itertools.repeat(None, length):
|
||||
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):
|
||||
"""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
|
||||
offset = len(steps) // 2
|
||||
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
|
||||
|
||||
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):
|
||||
"""draw diagonal line"""
|
||||
width = abs(pos_x2 - pos_x1)
|
||||
height = abs(pos_y2 - pos_y1)
|
||||
if pos_x1 == pos_x2:
|
||||
steps = [height]
|
||||
steps = [height+1]
|
||||
horizontal = False
|
||||
offset_x = offset_y = 0
|
||||
elif pos_y1 == pos_y2:
|
||||
steps = [width]
|
||||
steps = [width+1]
|
||||
horizontal = True
|
||||
offset_x = offset_y = 0
|
||||
elif width > height:
|
||||
width += 1
|
||||
if pos_x2 < pos_x1:
|
||||
pos_x1, pos_x2 = pos_x2, pos_x1
|
||||
pos_y1, pos_y2 = pos_y2, pos_y1
|
||||
offset_y = 1 if pos_y2 > pos_y1 else -1
|
||||
offset_x = 1 if pos_x2 > pos_x1 else -1
|
||||
horizontal = True
|
||||
step = height
|
||||
length = width / step
|
||||
step = height + 1
|
||||
length = width // step
|
||||
steps = self._calculate_steps(length, step, width)
|
||||
|
||||
else:
|
||||
height += 1
|
||||
if pos_y2 < pos_y1:
|
||||
pos_x1, pos_x2 = pos_x2, pos_x1
|
||||
pos_y1, pos_y2 = pos_y2, pos_y1
|
||||
offset_y = 1 if pos_y2 > pos_y1 else -1
|
||||
offset_x = 1 if pos_x2 > pos_x1 else -1
|
||||
horizontal = False
|
||||
step = width
|
||||
length = height / step
|
||||
step = width + 1
|
||||
length = height // step
|
||||
steps = self._calculate_steps(length, step, height)
|
||||
|
||||
delta_y = 0
|
||||
|
@ -26,3 +26,165 @@ class TestPageDrawing(object):
|
||||
buffer = self.get_buffer()
|
||||
buffer[1][1] = 1
|
||||
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)
|
||||
|
@ -139,19 +139,18 @@ class TestPageDrawing(object):
|
||||
assert_equal(self.lcd.buffer, buffer)
|
||||
|
||||
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[0][0] = 1
|
||||
buffer[1][0] = 2
|
||||
buffer[2][0] = 4
|
||||
buffer[3][0] = 4
|
||||
buffer[3][0] = 8
|
||||
buffer[4][0] = 8
|
||||
buffer[5][0] = 8
|
||||
buffer[6][0] = 16
|
||||
buffer[7][0] = 16
|
||||
buffer[8][0] = 32
|
||||
buffer[9][0] = 64
|
||||
|
||||
buffer[7][0] = 32
|
||||
buffer[8][0] = 64
|
||||
self.draw_buffer(self.lcd.buffer)
|
||||
assert_equal(self.lcd.buffer, buffer)
|
||||
|
||||
def test_fill_rect(self):
|
||||
|
Loading…
Reference in New Issue
Block a user