我的计划:
-
查找斗杆式操纵手柄的角度
-
使用HSV和斗杆角度获取RGB值
-
转换为十六进制
查找操纵手柄斗杆的角度
首先,我们需要找到操纵杆的角度。我们可以使用
law of cosines
和轴语句作为三角形边的长度(因为它们来自一个点/中心)。
在此块中存储axis语句:
for i in range( axes ):
axis = joystick.get_axis( i )
if i == 0:
Xaxis = axis
elif i == 1:
Yaxis = axis
textPrint.print(screen, "Axis {} value: {:>6.3f}".format(i, axis) )
我们存储它们是因为在for循环中,一次只能获取一条语句。
然后定义一个返回斗杆角度的函数。我们需要使用
math
的模块
pi
和
acos
.
def get_angle(Xaxis,Yaxis):
if Xaxis == 0:
Xaxis = 0.001
if Yaxis == 0:
Yaxis = 0.001
b = ((Xaxis)**2 + (Yaxis)**2)**0.5
c = Xaxis
a = Yaxis
angle = math.acos((b**2 + c**2 - a**2) / (2*b*c)) * 180/math.pi
if Yaxis > 0:
angle = 360 - angle
return angle
现在
get_angle(Xaxis,Yaxis)
将返回斗杆的角度。东为0°,北为90°,西为180°,南为270°。
获取HSV并转换为RGB
我们有棍子的角度,我们可以用它来制作HSV颜色,然后将其转换为RGB,因为色轮是基于颜色的色调。
色调的范围与木棍的角度相同,因此我们可以使用木棍的角度作为色调。
使用中的公式
Wikipedia
,定义将HSV转换为RGB的函数。
def hsv_to_rgb(H,S,V):
C = V * S
h = H/60
X = C * (1 - abs(h % 2 -1))
if 0 <= h <= 1:
r = C; g = X; b = 0
elif 1 <= h <= 2:
r = X; g = C; b = 0
elif 2 <= h <= 3:
r = 0; g = C; b = X
elif 3 <= h <= 4:
r = 0; g = X; b = C
elif 4 <= h <= 5:
r = X; g = 0; b = C
elif 5 <= h < 6:
r = C; g = 0; b = X
m = V - C
R = int((r+m)*255)
G = int((g+m)*255)
B = int((b+m)*255)
return [R,G,B]
现在
hsv_to_rgb(get_angle(Xaxis,Yaxis),1,1)
将返回0-255范围内的红色、绿色和蓝色列表(以便于十六进制转换)。在这种情况下,不需要饱和度和值。
转换为十六进制
最简单的部分。我们需要得到RGB列表并将值转换为十六进制。
colors = hsv_to_rgb(get_angle(Xaxis,Yaxis),1,1)
lst = list(map(hex,colors))
for i in range(len(lst)):
lst[i] = lst[i][2:]
if len(lst[i]) == 1:
lst[i] = "0"+str(lst[i])
print(get_angle(Xaxis,Yaxis))
类似于
#ff0000
,
#00ff00
和
#0000ff
将打印。
您还可以使您的程序实时显示颜色变化,只需添加
WHITE = colors
在这个街区。
如果你患有光敏性癫痫,不要使用它。
合并所有内容
将两个函数从第一点和第二点放在开头的某个位置。
将存储从第一个点添加到块
for i in range( axes ):
axis = joystick.get_axis( i )
textPrint.print(screen, "Axis {} value: {:>6.3f}".format(i, axis) )
从块后的第三个点添加转换。我建议创建死亡区功能。
death_zone = 0.1
if abs(Xaxis) > death_zone or abs(Yaxis) > death_zone:
colors = hsv_to_rgb(get_angle(Xaxis,Yaxis),1,1)
lst = list(map(hex,colors))
for i in range(len(lst)):
lst[i] = lst[i][2:]
if len(lst[i]) == 1:
lst[i] = "0"+str(lst[i])
print("#"+"".join(lst))
这就是您的代码的外观:
P、 您可能需要更改一些代码,因为我想我的操纵杆的轴没有被正确捕获。
import pygame
import math
BLACK = ( 0, 0, 0)
WHITE = ( 62, 210, 255)
def hsv_to_rgb(H,S,V):
C = V * S
h = H/60
X = C * (1 - abs(h % 2 -1))
if 0 <= h <= 1:
r = C; g = X; b = 0
elif 1 <= h <= 2:
r = X; g = C; b = 0
elif 2 <= h <= 3:
r = 0; g = C; b = X
elif 3 <= h <= 4:
r = 0; g = X; b = C
elif 4 <= h <= 5:
r = X; g = 0; b = C
elif 5 <= h < 6:
r = C; g = 0; b = X
m = V - C
R = int((r+m)*255)
G = int((g+m)*255)
B = int((b+m)*255)
return [R,G,B]
def get_angle(Xaxis,Yaxis):
if Xaxis == 0:
Xaxis = 0.001
if Yaxis == 0:
Yaxis = 0.001
b = ((Xaxis)**2 + (Yaxis)**2)**0.5
c = Xaxis
a = Yaxis
angle = math.acos((b**2 + c**2 - a**2) / (2*b*c)) * 180/math.pi
if Yaxis > 0:
angle = 360 - angle
return angle
class TextPrint:
def __init__(self):
self.reset()
self.font = pygame.font.Font(None, 25)
def print(self, screen, textString):
textBitmap = self.font.render(textString, True, BLACK)
screen.blit(textBitmap, [self.x, self.y])
self.y += self.line_height
def reset(self):
self.x = 25
self.y = 25
self.line_height = 30
def indent(self):
self.x += 10
def unindent(self):
self.x -= 10
pygame.init()
size = [900, 1080]
screen = pygame.display.set_mode(size)
pygame.display.set_caption("PS4Testing")
done = False
clock = pygame.time.Clock()
pygame.joystick.init()
textPrint = TextPrint()
while done==False:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done=True
screen.fill(WHITE)
textPrint.reset()
joystick_count = pygame.joystick.get_count()
for i in range(joystick_count):
joystick = pygame.joystick.Joystick(i)
joystick.init()
axes = joystick.get_numaxes()
for i in range( axes ):
axis = joystick.get_axis( i )
if i == 0:
Xaxis = axis
elif i == 1:
Yaxis = axis
textPrint.print(screen, "Axis {} value: {:>6.3f}".format(i, axis) )
textPrint.unindent()
death_zone = 0.1
if abs(Xaxis) > death_zone or abs(Yaxis) > death_zone:
colors = hsv_to_rgb(get_angle(Xaxis,Yaxis),1,1)
lst = list(map(hex,colors))
for i in range(len(lst)):
lst[i] = lst[i][2:]
if len(lst[i]) == 1:
lst[i] = "0"+str(lst[i])
print("#"+"".join(lst))
pygame.display.flip()
clock.tick(20)
pygame.quit ()