winforms 如何计算圆绕球面的曲率(弧)?

aelbi1ox  于 2023-01-17  发布在  其他
关注(0)|答案(1)|浏览(131)

我想画一个代表月亮的圆,在这个圆上画一个弧,代表太阳的照度,每个照度百分比。虽然这个月亮的图像是在2D中,我需要弧有一个“现实主义”的曲率。我想一个函数,接收一个参数作为照度的百分比(例如:27%)并返回具有正确曲率的弧的绘图。

kwvwclae

kwvwclae1#

月球终止器是一个椭圆弧,* 垂直 * 轴恒定(等于月球直径),而 * 水平 * 轴随月球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.120.270.540.95):

如果你坚持 * %的照度 *,你应该解一个 * 方程 *。月球照度是月球的一半加上或减去椭圆的一半的面积,例如对于相位[0..0.25]

illumination = pi * R * R / 2 - pi * R * R * (0.5 - 2 * phase)

因此,对于新月,我们有illumination == 0,对于第一季度,我们有illumination == pi * R * R / 2

相关问题