我想画一个代表月亮的圆,在这个圆上画一个弧,代表太阳的照度,每个照度百分比。虽然这个月亮的图像是在2D中,我需要弧有一个“现实主义”的曲率。我想一个函数,接收一个参数作为照度的百分比(例如:27%)并返回具有正确曲率的弧的绘图。
kwvwclae1#
月球终止器是一个椭圆弧,* 垂直 * 轴恒定(等于月球直径),而 * 水平 * 轴随月球phase线性变化,即
phase
0 - New Moon 0.25 - First Quarter 0.50 - Full Moon 0.75 - Last Quarter
位图创建以显示创意:
private static Bitmap DrawMoon(int radius, float phase) { phase = (phase % 1 + 1) % 1; Bitmap image = new Bitmap(2 * radius, 2 * radius); var rect = new Rectangle(10, 10, 2 * radius - 20, 2 * radius - 20); float w = Math.Abs(rect.Width - rect.Width * (4 * phase % 2)); // Terminator is elliptical, verical axis is constant // While horizontal change as linear function from phase var term = new RectangleF( rect.Left + (rect.Width - w) / 2, rect.Top, w, rect.Height); // Width == 10 to exagerate the lines, to show they are elliptical using var pen = new Pen(Brushes.Yellow, 10); using (Graphics gs = Graphics.FromImage(image)) { gs.FillRectangle(Brushes.Black, new Rectangle(0, 0, image.Width, image.Height)); if (phase > 0.5f) gs.DrawArc(pen, rect, 90, 180); else gs.DrawArc(pen, rect, -90, 180); if (phase < 0.25f || phase > 0.5 && phase < 0.75) gs.DrawArc(pen, term, -90, 180); else gs.DrawArc(pen, term, 90, 180); } return image; }
几个月相(0.12、0.27、0.54、0.95):
如果你坚持 * %的照度 *,你应该解一个 * 方程 *。月球照度是月球的一半加上或减去椭圆的一半的面积,例如对于相位[0..0.25]
[0..0.25]
illumination = pi * R * R / 2 - pi * R * R * (0.5 - 2 * phase)
因此,对于新月,我们有illumination == 0,对于第一季度,我们有illumination == pi * R * R / 2
illumination == 0
illumination == pi * R * R / 2
1条答案
按热度按时间kwvwclae1#
月球终止器是一个椭圆弧,* 垂直 * 轴恒定(等于月球直径),而 * 水平 * 轴随月球
phase
线性变化,即位图创建以显示创意:
几个月相(0.12、0.27、0.54、0.95):
如果你坚持 * %的照度 *,你应该解一个 * 方程 *。月球照度是月球的一半加上或减去椭圆的一半的面积,例如对于相位
[0..0.25]
因此,对于新月,我们有
illumination == 0
,对于第一季度,我们有illumination == pi * R * R / 2