Python 使用权重在更宽的区域上分布0到1之间的点
如果你知道自己在做什么,我想这并不难,但我上一次的实现并不完美,如果你在极端情况下这样做,权重就会被打破,现在我无法理解它 基本上,所有内容都有一个介于0和1之间的值,我需要将它们指定给着色器。下面是它将如何工作的基本概念Python 使用权重在更宽的区域上分布0到1之间的点,python,Python,如果你知道自己在做什么,我想这并不难,但我上一次的实现并不完美,如果你在极端情况下这样做,权重就会被打破,现在我无法理解它 基本上,所有内容都有一个介于0和1之间的值,我需要将它们指定给着色器。下面是它将如何工作的基本概念 numShaders = 20 i = 0 weight = 0.5 shader = 0 i = 0.5 weight = 0.5 shader = 10 i = 1 weight = 0.5 shader = 20 i = 1 weight = 0 shader
numShaders = 20
i = 0
weight = 0.5
shader = 0
i = 0.5
weight = 0.5
shader = 10
i = 1
weight = 0.5
shader = 20
i = 1
weight = 0
shader = 0
i = 0.5
weight = 0.75
shader = around 15
i = 1
weight = 0.75
shader = 20
权重应该是指数级的,或者理想情况下,可以选择控制其向外推的方式-例如,向外推意味着0.75权重可以产生17而不是15,但永远不会超过20,并且只有在将其设置为0或1或足够接近它时,才使用同一着色器生成所有结果
我一直在想办法,但目前运气不好,所以提前谢谢你
如果有帮助的话,这适用于0.5的权重,但不适用于其他权重,我不太确定在哪里添加power-numShaders*weight*I*2
另外,旧的实现在这里,我只是无法成功地将最初的部分转换成现在可以工作的东西,一旦我掌握了基本知识,我可能能够复制其余部分-
#colourValue = 0 to 1
#shaderAmount = number of shaders in total
#colourExponential = pushing values inwards to give solid colours at edges
#colourRatio = weight
#calculate colour to assign
colourValue = py.getAttr( cube+'.colourValue' )
colourNum = colourValue * shaderAmount - ( (colourValue * shaderAmount) - shaderAmount/2.0 ) / colourExponential
if stretchValues == True:
#stretch out the values from 0 to max
if colourNum + 1 == colourNumHalf:
factor = 0
elif colourNum + 1 < colourNumHalf:
factor = ( -colourNumMin / float( colourNum + 1 ) ) * colourNumMin
elif colourNum + 1 > colourNumHalf:
factor = ( colourNumMax / float( shaderAmount - colourNum + 1 ) ) * colourNumMax
else:
factor = 0
colourNum = int(colourNum + factor)
#fix to stop negative numbers
if colourNum < 0:
colourNum = -colourNum
#set ratio of colours
if colourRatio > 0.5:
colourNum = int( colourNum + ( shaderAmount - colourNum ) ** ( colourRatio * 2 - 1 ) )
elif colourRatio < 0.5:
colourNum = int( colourNum - colourNum ** ( 1 - colourRatio * 2 ) )
colourNum = int(round(colourNum,0))
#stop invalid values
if colourNum < 0:
colourNum = 0
elif colourNum >= shaderAmount:
colourNum = shaderAmount - 1
py.select( shaderName + str(colourNum), noExpand = True )
#check previous shader
try:
oldShader.append(shaderSelect.split('n')[-1])
except:
oldShader.append(shaderAmount - 1)
shaderSelect = py.ls( selection = True )[0]
#stop big jumps in colour
if int(shaderSelect.split('n')[-1]) < int(oldShader[-1]) - 1:
py.select( shaderName + str(int(oldShader[-1])-1), noExpand = True )
#overrides initial calculation for extra smoothness
for i in range(smoothOverride):
if len(oldShader) > (i+1):
if int(oldShader[-1]) != int(oldShader[-2-i]):
py.select( shaderName + str(int(oldShader[-1])), noExpand = True )
shaderSelect = py.ls( selection = True )[0]
编辑:正如埃弗特指出的,这实际上是正态分布,我将尝试编写类似于此图的代码,但以0.5作为中间点,0和1作为极值。如果我成功了,我将再次编辑该问题。
你能列出你迄今为止尝试过的任何东西吗?20/9*1*10**i-1。我用我现在做的旧版本更新了它,谢谢,但是9是从何而来的P9=10**1-10**0,指数0和1表示初始范围内的数字。实际上,在这种情况下,末尾的1是10**0。20码显然是你的最终射程。虽然这会扩大指数加权的范围,但这当然会导致非整数,而舍入或截断数字将导致双倍数。这取决于你想如何解决这个问题。指数型的,在两端伸展的,听起来并不是指数型的。也许你在想a,或者1-Normalx?