我一直在绞尽脑汁试图找出如何制作动画效果。这与我在 math.stackexchange.com 上提出的一个问题有关。
https://math.stackexchange.com/questions/91120/equal-division-of-rectangles-to-make-total/
顺便说一句,我没有实现上述问题中定义的绘图算法,而是使用我自己的算法来改变视角,使其看起来更加简洁。
我已经能够绘制静止的 3D 风格效果,但我无法将我的大脑围绕逻辑进行思考,以使下面的线条看起来像是朝您走来。
我的代码如下,
List<double> sizes = new List<double>();
private void Form1_Load(object sender, EventArgs e)
{
for (int y = 1; y < 10; y++)
{
double s = ((240 / 2) / y) / 4;
sizes.Add(s);
}
sizes.Add(0);
}
int offset = 0;
private void button1_Click(object sender, EventArgs e)
{
Bitmap b = new Bitmap(320, 480);
Graphics g = Graphics.FromImage(b);
Color firstColor = Color.DarkGray;
Color secondColor = Color.Gray;
Color c = firstColor;
int yOffset = 0;
for(int i = 0; i < sizes.Count; i++)
{
c = (i % 2 == 0) ? firstColor : secondColor;
int y = (int)Math.Round(b.Height - yOffset - sizes[i]);
int height = (int)Math.Round(sizes[i]);
g.FillRectangle(new SolidBrush(c), new Rectangle(0, y + offset, b.Width, height + offset));
yOffset += (int)sizes[i];
}
this.BackgroundImage = b;
offset+=1;
}
每次单击按钮都会导致矩形调整大小并靠近。但是,我的矩形没有按应有的方式增长。我的逻辑画得很好,但就移动而言根本行不通。
所以我的问题是:
是否存在我不知道的这种效果的现有算法,或者这是我想太多的非常简单的东西?任何帮助纠正我的逻辑或为我指明正确方向的帮助都将非常感激。
最佳答案
有趣...
(此处的答案视频:http://youtu.be/estq62yz7v0)
我会这样做:
首先,删除所有矩形绘图并逐行绘制效果。就像这样:
for (int y=start;y<end;y++)
{
color = DetermineColorFor(y-start);
DrawLine(left, y, right, y, color);
}
这当然是伪代码,不会受到 GDI+ 或其他东西的困扰。
这里一切都很清楚,除了如何编写 DetermineColorFor()
方法。该方法必须返回指定投影高度处线条的颜色。
现在,在图片上,您有:
- 您的观点 (X) - 不知道如何画眼睛
- 红线(即您的屏幕 - 投影平面)
- 您的背景(底部交替条纹)
- 以及一些可以帮助您设计
DetermineColorFor()
方法的投影线
提示 - 使用三角形相似度从屏幕坐标转到“条形”坐标。
下一个提示 - 当您处于“条”坐标时,使用模运算符来确定颜色。
如果需要,我会添加更多提示,但如果您自己解决这个问题,那就太好了。
我受到这个问题的启发,并为解决方案创建了代码。这是:
int _offset = 0;
double period = 20.0;
private void timer1_Tick(object sender, EventArgs e)
{
for (int y = Height / 3; y < Height; y++)
{
using (Graphics g = CreateGraphics())
{
Pen p = new Pen(GetColorFor(y - Height / 3));
g.DrawLine(p, 0, y, Width, y);
p.Dispose();
}
}
_offset++;
}
private Color GetColorFor(int y)
{
double d = 10.0;
double h = 20.0;
double z = 0.0;
if (y != 0)
{
z = d * h / (double)y + _offset;
}
double l = 128 + 127 * Math.Sin(z * 2.0 * Math.PI / period);
return Color.FromArgb((int)l, (int)l, (int)l);
}
实验:
d
- 眼睛到投影屏幕的距离h
- 眼睛距“栏”的高度句点
- “栏”上的条纹宽度
我在表单上有一个计时器,并且事件已正确连接。定时器持续时间为 20ms。
关于c# - 绘制 3D 风格效果时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8506788/