単純な問題のように思えますが、頭を包むことはできません。
いくつかの関数を宣言する構成ファイルがあります。次のようになります。
"bandDefinitions" : [
{
"0": ["x^2 + 2*x + 5 - y", "ABOVE"]
},
{
"0": ["sin(6*x) - y", "UNDER"]
},
{
"0": ["tan(x) - y", "ABOVE"]
}
]
これらの関数は 3 つの画像を生成する必要があります。すべての画像は、方程式の解と指定された位置 (下または上) に応じて塗りつぶされます。座標系を画像の中心に移動する必要があるため-y
、方程式に追加しています。画像の塗りつぶすべき部分は白く、その他の部分は黒く塗りつぶす必要があります。
私が言いたいことを説明するために、二次関数と罪関数の画像を提供しています。
私がやっていることは、次のように方程式を解き、x in [-W/2, W/2]
解を配列に格納することです。
#Generates X axis dots and solves an expression which defines a band
#Coordinate system is moved to the center of the image
def __solveKernelDefinition(self, f):
xAxis = range(-kernelSize, kernelSize)
dots = []
for x in xAxis:
sol = f(x, kernelSize/2)
dots.append(sol)
print(dots)
return dots
次のように、一部のピクセルを白くする必要があるかどうかをテストしています。
def shouldPixelGetNoise(y, x, i, currentBand):
shouldGetNoise = True
for bandKey in currentBand.bandDefinition.keys():
if shouldGetNoise:
pixelSol = currentBand.bandDefinition[bandKey][2](x, y)
renderPos = currentBand.bandDefinition[bandKey][1]
bandSol = currentBand.bandDefinition[bandKey][0]
shouldGetNoise = shouldGetNoise and pixelSol <= bandSol[i] if renderPos == Position.UNDER else pixelSol >= bandSol[i]
else:
break
return shouldGetNoise
def kernelNoise(kernelSize, num_octaves, persistence, currentBand, dimensions=2):
simplex = SimplexNoise(num_octaves, persistence, dimensions)
data = []
for i in range(kernelSize):
data.append([])
i1 = i - int(kernelSize / 2)
for j in range(kernelSize):
j1 = j - int(kernelSize / 2)
if(shouldPixelGetNoise(i1, j1, i, currentBand)):
noise = normalize(simplex.fractal(i, j, hgrid=kernelSize))
data[i].append(noise * 255)
else:
data[i].append(0)
凸二次関数に対してのみ良い出力が得られます。それらを組み合わせようとすると、黒いイメージが得られます。Sin
まったく機能しません。この力ずくのアプローチではどこにも行けないことがわかったので、これらの種類の画像を生成するにはどのアルゴリズムを使用すればよいのでしょうか?