你好堆栈溢出!
我试图用 LinearGradientBrush 填充椭圆来“模拟”行星的黑暗和太阳“面”。变量 ovalCenter 是行星相对于太阳的位置的 3D 矢量 (System.Numerics)。 FBody.Unit 方法返回一个单位向量。
我计算椭圆边缘上的最暗点和(直接面向太阳)椭圆边缘上的最亮点(直接面向太阳)。这些点分别存储在 darkSidePoint 和 sunSidePoint 中。
我已经检查了这些向量的 X、Y 和 Z 值,并知道它们是正确的。
我将“暗点”的颜色设置为黑色,将“亮点”的颜色设置为行星的指定颜色。这些颜色分别存储在 darkSideColor 和 sunSideColor 中。
然后我为“暗点”和“亮点”创建了 PointF 结构(darkSide 和 sunSide)。
给定起点和终点 PointF 结构和颜色,我创建一个 LinearGradientBrush (bl)。
我在调用 Graphics.FillEllipse() 时使用 LinearGradientBrush 和 ovalRect。
这是代码:
Vector3 u = FBody.Unit(ovalCenter);
Vector3 fromBodyCenterToEdge = u * ovalRect.Width / 2.0f;
Vector3 darkSidePoint = ovalCenter + fromBodyCenterToEdge;
Vector3 sunSidePoint = ovalCenter - fromBodyCenterToEdge;
PointF darkSide = new PointF(darkSidePoint.X, darkSidePoint.Y);
PointF sunSide = new PointF(sunSidePoint.X, sunSidePoint.Y);
Color darkSideColor = Color.Black;
Color sunSideColor = penBody.Color;
LinearGradientBrush bl = new LinearGradientBrush(darkSide, sunSide, darkSideColor, sunSideColor);
g.FillEllipse(bl, ovalRect);
我的期望是椭圆形将被填充并出现渐变填充,从“暗点”处的黑色开始,平滑过渡到“主体颜色”(例如,棕色),看起来像这样:
相反,我看到这样的东西:
社区对我做错了什么有什么想法吗?
以下是变量值(来自 VS2022 中的 Watch):
我遵循了 MSDN 在线帮助中有关 LinearGradientBrush 的指导(尽我所能理解)。
从“调试”的角度来看,您需要显示正在生成的“图形值”(例如点)。不同元素的值是相关的;仅显示代码并不能提供任何见解。