スプレーペイントタイプのプログラムを書こうとしていますが、数学をすべて忘れてしまいました。
ユーザーがクリックした場所の近くのピクセルを選択するには、ある種の確率方程式が必要です。したがって、確率は中心近くで高くなり、中心からの距離が高くなるにつれて減少し、特定の距離に達すると確率はゼロになります。また、中心の確率は滑らかな曲線である必要があります(私が何を意味するかを知っている場合)
スプレーペイントタイプのプログラムを書こうとしていますが、数学をすべて忘れてしまいました。
ユーザーがクリックした場所の近くのピクセルを選択するには、ある種の確率方程式が必要です。したがって、確率は中心近くで高くなり、中心からの距離が高くなるにつれて減少し、特定の距離に達すると確率はゼロになります。また、中心の確率は滑らかな曲線である必要があります(私が何を意味するかを知っている場合)
コーディングしている言語がわからないので、ここにいくつかの擬似コードがあります。コーディングしている言語の対応する構文を知っていると仮定します。
// Parameters:
// Radius is the radius of the brush in pixels
// Strength is a double ranging 0.0 to 1.0 and multiplies the probability of a pixel being painted
function spraypaint(int radius, double strength) {
strength = (strength * 2) - 1; //Change strength from 0.0->1.0 to -1.0->1.0 for logical application
// For each pixel within the square...
for(int x = -radius; x < radius; x++) {
for(int y = -radius; y < radius; y++) {
double distance = sqrt(x*x + y*y); // Get distance from center pixel
double angle = 90*(distance/radius); // Get angle of "bell curve"
double probability = sine(angle); // Determine probability of filling in this pixel
// Apply additional probability based on strength parameter
if(strength >= 0.0)
probability += ((1-probability) * strength);
else
probability += probability * strength;
if(distance > radius) {
continue; // Skip this pixel if it's out of the circle's radius
}
if(random(0.0 to 1.0) < probability) { // If we random a decimal lower than our probability
setPixel(mouse.x + x, mouse.y + y, "Black"); // Draw this pixel
}
}
}
}
基本的な考え方は次のとおりです。
Iterate through each pixel and...
1. Find its distance from the center pixel (The clicked pixel).
2. Get distance/radius (0.0 to 1.0) and find the corresponding sine, creating a
smooth probability curve.
3. Apply the supplied strength to the probability.
4. Pull a random double 0.0 to 1.0 and draw the pixel if it's within our probability.