我正在使用c#在wpf中创建和绘制三角形网格。我一直在努力弄清楚如何在三角形上创建一个平滑的阴影,就像经典的openGL光滑阴影三角形。
我想为每个顶点定义一个颜色,然后在脸上插入颜色,就像这样,假设红色、绿色和蓝色三种颜色。
我以为我需要用刷子,但我还不知道怎么用。因此,任何帮助将不胜感激,或任何指针的指南,以显示我如何实现这一点。
编辑:--我看过WPF3D中的三角梯度,它似乎部分地回答了这个问题,只是使用了xaml。不幸的是,它似乎需要等边三角形。
第二编辑上面的答案,使用RadialGradientBrush
。RadiusX
和RadiusY
是用来把它变成椭圆形而不是圆形的吗?
3编辑好的,我很确定我可以使用RadialGradientBrush
。我认为我能做的是,找到三角形圆周的中心,创建一个RadialGradientBrush
,RadiusX
和RadiusY
等于圆周圆的半径。然后,我将RadialGradientBrush
的焦点移动到GradientOrigin
的顶点。
GradientOrigin
以两个双倍X,Y为中心,它们都在区间0,1。据我所知,X= 0.0是左侧,X= 1.0是右边,Y= 0.0是顶部,Y= 1.0是底部。我不知道的是,这个映射是0,1x0,1到一个圆,还是一个正方形?从三角形的顶点到0,1x0,1的映射取决于这个区间所代表的形状。
发布于 2014-02-19 20:43:39
你听说过WPF的螺旋三维工具包吗?
我没有走到您想要的程度,但我想通过查看https://helixtoolkit.codeplex.com/wikipage?title=SurfaceDemo示例是可能的:
发布于 2014-02-19 20:54:57
当然有这样的图书馆,但是给出一些简单的方法,通过google,http://www.geeksforgeeks.org/check-whether-a-given-point-lies-inside-a-triangle-or-not/搜索。
计算距离的角,给出了平滑的颜色信息。检查点是否在三角形中。
float area(int x1, int y1, int x2, int y2, int x3, int y3)
{
return (float)Math.Abs((x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0);
}
bool isInside(int x1, int y1, int x2, int y2, int x3, int y3, int x, int y)
{
/* Calculate area of triangle ABC */
float A = area(x1, y1, x2, y2, x3, y3);
/* Calculate area of triangle PBC */
float A1 = area(x, y, x2, y2, x3, y3);
/* Calculate area of triangle PAC */
float A2 = area(x1, y1, x, y, x3, y3);
/* Calculate area of triangle PAB */
float A3 = area(x1, y1, x2, y2, x, y);
/* Check if sum of A1, A2 and A3 is same as A */
return (A == A1 + A2 + A3);
}
for (int ii = 5; ii < 100; ii++)
{
for (int jj = 5; jj < 100; jj++)
{
int distanceRed =0, distanceGreen =0,distanceBlue =0;
if (isInside(30, 50, 30, 90, 20, 70, ii, jj))
{
distanceRed = (int)Math.Sqrt(((ii - 30) * (ii - 30) + (jj - 50) * (jj - 50)));
distanceGreen = (int)Math.Sqrt(((ii - 30) * (ii - 30) + (jj - 90) * (jj - 90)));
distanceBlue = (int)Math.Sqrt(((ii - 20) * (ii - 20) + (jj - 70) * (jj - 70)));
}
else
{
distanceRed = 0; distanceGreen = 0; distanceBlue = 0;
}
ptr[(((int)jj) * 3) + ((int)ii) * stride] = (byte)(distanceRed % 256);
ptr[(((int)jj) * 3) + ((int)ii) * stride + 1] = (byte)(distanceGreen % 256);
ptr[(((int)jj) * 3) + ((int)ii) * stride + 2] = (byte)(distanceBlue % 256);
}
}
给出了结果:
不适合红色。也许这个模组错了。另外,sqrt效率很低。
https://stackoverflow.com/questions/21891537
复制相似问题