我正在使用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是没有意义的。)

[其他编辑:我另外切换了参数,以便biWidthbiHeight分别位于x和y坐标中。无论如何,这都是绘制函数的常规方法-因此,如果您想翻转该图,则需要将其切换回去。

10-07 13:25