使用System.Drawing2D LinearGradientBrush填充椭圆;意想不到的结果

问题描述 投票:0回答:1

你好堆栈溢出

我试图用 LinearGradientBrush 填充椭圆来“模拟”行星的黑暗和太阳“面”。变量 ovalCenter 是行星相对于太阳的位置的 3D 矢量 (System.Numerics)。 FBody.Unit 方法返回一个单位向量。

我计算椭圆边缘上的最暗点和(直接面向太阳)椭圆边缘上的最亮点(直接面向太阳)。这些点分别存储在 darkSidePointsunSidePoint 中。

我已经检查了这些向量的 X、Y 和 Z 值,并知道它们是正确的。

我将“暗点”的颜色设置为黑色,将“亮点”的颜色设置为行星的指定颜色。这些颜色分别存储在 darkSideColorsunSideColor 中。

然后我为“暗点”和“亮点”创建了 PointF 结构(darkSidesunSide)。

给定起点和终点 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 的指导(尽我所能理解)。

c# system.drawing lineargradientbrush
1个回答
1
投票

从“调试”的角度来看,您需要显示正在生成的“图形值”(例如点)。不同元素的值是相关的;仅显示代码并不能提供任何见解。

© www.soinside.com 2019 - 2024. All rights reserved.