我正在使用Microsoft Visual Studio 2010。
公式为y = 1/(1+exp(-e))
在值范围内,其中bih.biWidth是要迭代的范围。
但是,当我尝试在代码中实现时却无效,为什么?任何专家都可以指导我前进,谢谢。
for(int y=0; y<bih.biHeight; y++)
{
for(int x=0; x<bih.biWidth; x++)
{
SetPixel(hdc, (double)1/((double)1+exp(double(-x)))*bih.biWidth,
bih.biHeight-x, red);
}
}
线条几乎从图像的右下角开始,并在图像的右上角以稍微弯曲结束它的结尾。为什么呢?
最佳答案
因为0是S形曲线的中心。您的x
从0开始;如果要对称地绘制曲线,则需要计算一个关于0对称的参数:
for(int x=0; x<bih.biWidth; x++)
{
double a= x - 0.5*bih.biWidth;
SetPixel(hdc, bih.biWidth-x, 1.0/(1.0+exp(-a)) * bih.biHeight, red);
}
将
a
缩放一个常数因子将调整S型函数的斜率。(我还怀疑您的原始代码已经切换了SetPixel()参数中使用的缩放比例,因此我已修复了该问题。当它从0到
x
时,从bih.biHeight
中减去bih.biWidth
是没有意义的。)[其他编辑:我另外切换了参数,以便
biWidth
和biHeight
分别位于x和y坐标中。无论如何,这都是绘制函数的常规方法-因此,如果您想翻转该图,则需要将其切换回去。