具有最小值和最大值的对数增长
Logarithmic growth with min and max values
我正在尝试 "fake 3D" 在 WPF 游戏中。想想一条路,物体出现在远处的某个地方。当它们靠近时,它们看起来更大,最终它们的尺寸增长得非常快。
我在想当物体出现时,它的宽度和高度接近于0。当它向玩家移动时,它会变得接近其真实大小的百分之一。
我想我将需要使用对数计算来解决这个问题,并且有几个主题。然而,我真正想做的是将三个值发送到 LogaritmicGrowth 方法:
- 起始Y点
- 对象应该出现在 100% 的点
- 此时对象所在的 y 点。
因此,我想在 return 中得到的是相关对象的比例因子。因此,如果它位于起点和终点之间的中间位置,那么可能应该 returned.
0.3(左右)
我可以自己编写方法输入和输出,但需要帮助进行计算。谢谢!
我不太确定这里使用日志。这是一个简单的几何问题。
考虑一个点 P,它在你面前 D 距离,高度为 Y(从你的观察线)。您的屏幕在您面前 d 距离。来自P的光线在屏幕上的交点为p,使得高度为y屏幕.
那么,考虑相似三角形,可以证明:
y = (Y/D) d
以防万一以后有人在看这个问题,这里是正确的回复(我自己想出来的):
/// <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);
}
}
}
该方法可以进一步改进,例如允许随机 power-to 值(比如从 1.5 到 4.5)。请注意,指数值越高,影响越大。
我正在尝试 "fake 3D" 在 WPF 游戏中。想想一条路,物体出现在远处的某个地方。当它们靠近时,它们看起来更大,最终它们的尺寸增长得非常快。
我在想当物体出现时,它的宽度和高度接近于0。当它向玩家移动时,它会变得接近其真实大小的百分之一。
我想我将需要使用对数计算来解决这个问题,并且有几个主题。然而,我真正想做的是将三个值发送到 LogaritmicGrowth 方法:
- 起始Y点
- 对象应该出现在 100% 的点
- 此时对象所在的 y 点。
因此,我想在 return 中得到的是相关对象的比例因子。因此,如果它位于起点和终点之间的中间位置,那么可能应该 returned.
0.3(左右)我可以自己编写方法输入和输出,但需要帮助进行计算。谢谢!
我不太确定这里使用日志。这是一个简单的几何问题。
考虑一个点 P,它在你面前 D 距离,高度为 Y(从你的观察线)。您的屏幕在您面前 d 距离。来自P的光线在屏幕上的交点为p,使得高度为y屏幕.
那么,考虑相似三角形,可以证明:
y = (Y/D) d
以防万一以后有人在看这个问题,这里是正确的回复(我自己想出来的):
/// <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);
}
}
}
该方法可以进一步改进,例如允许随机 power-to 值(比如从 1.5 到 4.5)。请注意,指数值越高,影响越大。