4種不同顏色的色塊,它們的顏色真的不同嗎?

title: 4種不同顏色的色塊,它們的顏色真的不同嗎?
tags: turtle


背景介紹

在上面這幅背景為灰色的圖片中(使用turtle繪製),我們看到了4種不同顏色的色塊。它們的顏色真的不同嗎?

答案是否定的。

這裡的灰色實際上是很小的藍色和黃色像素的混合產物。由於這些像素太小,混合在一起不會引發拮抗過程,也就無法形成對比。

彩色電視機之所以能夠利用顏色差異很小的像素呈現不同色彩就是這個原理。

(感興趣的讀者可以用放大鏡親自驗證一下)綠松石色和淡黃綠色色塊實際上分別由很小的綠色像素與藍色背景像素混合和與黃色背景像素混合而來。紅色像素與背景中的黃色像素混合形成橙色,與背景中的藍色像素混合則成紫色。

導入模塊

import turtle
import random

import time

API說明

定義自己的畫圖類MyTurtle,常用方法介紹如下:

get_color() 隨機取rgb模式下的顏色的三個參數 set_pen_color() 設置畫筆使用顏色 move(x, y) 控制海龜移動到指定x,y座標(移動軌跡不著色) draw_shape(sides, length)畫 sides 條邊,length 長度的圖形 draw_square(length) 調用 draw_shape() 函數畫邊長為 length 正方形 draw_triangle(length)調用 draw_shape() 函數畫邊長為 length 等邊三角形draw_circle(length)調用 draw_shape() 函數畫半徑為 length 圓形 fill_color_shape(shape, length, fill_color)用 fill_color 顏色, 填充 length 邊長, shape (draw_square, draw_triangle, draw_circle)設定的圖形

此例子使用的 turtle 內置函數介紹

left(x)/right(x) 使海龜 逆時針/順時針 旋轉 circle(x)以x為半徑,以當前方向開始畫圓 forward(x)|fd(x) 前進x,單位為像素 backward(x)|bk(x)|back(x) 後退x,單位為像素 goto(x,y)|setpos(x,y)|setposition(x,y)使海龜沿直線移動到(x,y)座標處 setx(x)/sety(y)設置 x/y 座標,使海龜水平移動 dot(size,color)在當前位置以直徑為size畫點,顏色為color speed(n) 設置海龜的移動速度 pendown()|pd()|down() 使海龜“落地”,移動軌跡在屏幕上顯示 penup()|up() 使海龜“起飛”,移動軌跡在屏幕上不顯示 pensize(x) 設置畫筆寬度為x,單位為像素 pencolor(color) 設置畫筆顏色 fillcolor() 設置填充顏色,當軌跡形成閉合圖形時填充的顏色 begin_fill()/end_fill() 控制顏色填充的時間段,只有在begin_fill()與end_fill()中間的閉合圖形才會填充顏色

自定義繪圖類 MyTurtle

class MyTurtle(turtle.Turtle):
def get_color(self):
rgb = []
for i in range(3):
rgb.append(random.randint(0, 255))
return rgb

def set_pen_color(self):
'''
## 設置畫筆的顏色
+ ### colormode(cmode)
>- cmode 為1 或者 255,
>- 隨後rgb三元組的值必須在0~comde之間
+ ### pencolor(color=None)
> 設置畫筆顏色
'''
self.screen.colormode(255)
self.pencolor(self.get_color())

def move(self, x: int, y: int) -> None:
self.penup()
self.goto(x, y)
self.pendown()

def draw_shape(self, sides: int, length: int) -> None:
_angle = 360.0/sides
for side in range(sides):
self.forward(length)
self.left(_angle)

def draw_square(self, length: int) -> None:
self.draw_shape(4, length)

def draw_triangle(self, length: int) -> None:
self.draw_shape(3, length)

def draw_circle(self, length: int) -> None:
self.draw_shape(360, length)

def fill_color_shape(self, shape: str, length: int, fill_color: str) -> None:
_command = f'self.{shape}(length)'
self.begin_fill()
self.color(fill_color)
eval(_command)
self.end_fill()

定義函數

根據 star 列表(通常為[x, y]起始座標), end 座標最大值,step 步長,來計算出所有座標。 返回座標列表([[x,y], [x, y1], [x1, y], [x1, y1], …])

def diff_color_square_address(star: list, end: int, step: int) -> list:
x = list(range(star[0], end+1, step))
y = list(range(star[1], end+1, step))
res_array = []
for xi in x:
for yi in y:
res_array.append([xi, yi])
return res_array

畫圖主函數:

def draw_main(b_val: int, s_len: int) -> None:
'''
+ ### bgcolor(color)
> 設置屏幕顏色,方式同 color()
+ ### speed(s=None)
> s為0-10的整數或者速度字符串
- None:返回當前速度
- "fastest":0
- "fast":10
- "normal":6
- "slow":3
- "slowest":1
'''
star_time = time.time()
t = MyTurtle()

t.screen.bgcolor("black") # white
t.speed(100)

tem_b = b_val + 1
tem_s = b_val - tem_b % 2 # 取單數數量
sx = list(x1 for x1 in range(1, tem_s)) # 小方格基本座標
sy = list(y1 for y1 in range(1, tem_s))
bx = list(x1 for x1 in range(1, tem_b)) # 大方格基本座標
by = list(y1 for y1 in range(1, tem_b))

b_len = len(sx) # 大方格邊長
different_colors_square_list = [
diff_color_square_address([2, 2], b_val, 4), # 混合橙色座標
diff_color_square_address([4, 4], b_val, 4), # 混合淡綠色座標
diff_color_square_address([4, 2], b_val, 4), # 混合紫色座標
diff_color_square_address([2, 4], b_val, 4) # 混合綠松石色座標
]

color_list = [
['red', 'yellow'], # 混合橙色
['green', 'yellow'], # 混合淡綠色
['red', 'blue'], # 混合紫色
['green', 'blue'], # 混合綠松石色
['yellow', 'blue'], # 混合灰色
]

offset = (s_len * b_len * (b_val + 2) + s_len) / 2
print(
f's_len: {s_len}, b_len: {b_len}, offset: {offset}, turtle: {t._screen.screensize()}')
turtle.tracer(False) # 如果想看看程序的畫圖過程設成True
for x3 in bx:
for y3 in by:
for x4 in sx:
for y4 in sy:
x = x3 * s_len * b_len + x4 * s_len - offset
y = y3 * s_len * b_len + y4 * s_len - offset
t.move(int(x), int(y))
# 判斷座標是否在特定顏色組座標中,是選用對應顏色組
if [x3, y3] in different_colors_square_list[0]:
colors = color_list[0]
elif [x3, y3] in different_colors_square_list[1]:
colors = color_list[1]
elif [x3, y3] in different_colors_square_list[2]:
colors = color_list[2]
elif [x3, y3] in different_colors_square_list[3]:
colors = color_list[3]
else:
colors = color_list[4]

if ((x4 + y4) % 2) == 0:
color = colors[0]

else:
color = colors[1]
t.fill_color_shape('draw_square', s_len, color)
t.move(800, 800)
turtle.update()
end_time = time.time() - star_time
# print_time = time.strftime("%b %d %Y %H:%M:%S", end_time)
print(end_time)
t.screen.mainloop()

調用函數繪圖

if __name__ == '__main__':
big_input = 9
big_value = 9 if big_input == '' or int(big_input) <= 0 else int(big_input)
small_input = 5
small_len = 5 if small_input == '' or int(
small_input) <= 0 else int(small_input)
print('big_value:', big_value, type(big_value),
'\\n', 'small_len:', small_len, type(small_len))
draw_main(big_value, small_len)


4種不同顏色的色塊,它們的顏色真的不同嗎?

關注我的頭條號【Python與算法社區】,持續分享Python、機器學習等內容


分享到:


相關文章: