具有最小值和最大值的对数增长

时间:2018-03-12 18:37:38

标签: c# logarithm

我正在尝试"假3D"在WPF游戏中。想象一条道路,并且物体出现在遥远的某个地方。随着它们越来越近,它们看起来更大,最终它们的尺寸变得非常快。

我认为当物体出现时,它的宽度和高度接近于0。当它向玩家移动时,它变得接近其真实大小的百分之百。

我想我需要使用对数计算来解决这个问题,并且有几个线程。然而,我真正想要做的是将三个值发送到LogaritmicGrowth方法:

  • 起始Y点
  • 对象应以100%
  • 出现的点
  • 此时物体处于的y点。

因此,我想得到的是相关对象的缩放因子。因此,如果它位于起点和终点之间,那么可能会返回0.3(左右)。

我可以自己编写方法输入和输出,但需要帮助进行计算。谢谢!

2 个答案:

答案 0 :(得分:1)

我不完全确定在这里使用日志。这是一个简单的几何问题。

想一下 P D 在你面前的距离,其高度 Y (来自你的观察线) 。您的屏幕在您面前 d 距离。屏幕上 P 的光交点是 p ,这会在屏幕上显示高度 y

然后,通过考虑相似的三角形,可以证明:

y =(Y / D)d

答案 1 :(得分:1)

以防万一其他人在将来看这个问题,这里有正确答案(我自己想出来):

    /// <summary>
    ///  Method that enlargens the kind of object sent in
    /// </summary>
    public void ExponentialGrowth2(string name, float startY, float endY)
    {
        float totalDistance = endY - startY;
        float currentY = 0;

        for (int i = 0; i < Bodies.Bodylist.Count; i++)
        {
            if (Bodies.Bodylist[i].Name.StartsWith(name)) //looks for all bodies of this type
            {
                currentY = Bodies.Bodylist[i].PosY;
                float distance = currentY - startY + (float)Bodies.Bodylist[i].circle.Height;
                float fraction = distance / totalDistance; //such as 0.8

                Bodies.Bodylist[i].circle.Width = Bodies.Bodylist[i].OriginalWidth * Math.Pow(fraction, 3);
                Bodies.Bodylist[i].circle.Height = Bodies.Bodylist[i].OriginalHeight * Math.Pow(fraction, 3);

            }
        }
    }

该方法可以进一步研究,例如允许随机化的幂值(例如从1.5到4.5)。请注意,指数值越高,效果越大。