首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >共混/平滑遮阳材料

共混/平滑遮阳材料
EN

Stack Overflow用户
提问于 2014-02-19 20:20:08
回答 2查看 985关注 0票数 3

我正在使用c#在wpf中创建和绘制三角形网格。我一直在努力弄清楚如何在三角形上创建一个平滑的阴影,就像经典的openGL光滑阴影三角形。

我想为每个顶点定义一个颜色,然后在脸上插入颜色,就像这样,假设红色、绿色和蓝色三种颜色。

我以为我需要用刷子,但我还不知道怎么用。因此,任何帮助将不胜感激,或任何指针的指南,以显示我如何实现这一点。

编辑:--我看过WPF3D中的三角梯度,它似乎部分地回答了这个问题,只是使用了xaml。不幸的是,它似乎需要等边三角形。

第二编辑上面的答案,使用RadialGradientBrushRadiusXRadiusY是用来把它变成椭圆形而不是圆形的吗?

3编辑好的,我很确定我可以使用RadialGradientBrush。我认为我能做的是,找到三角形圆周的中心,创建一个RadialGradientBrushRadiusXRadiusY等于圆周圆的半径。然后,我将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的映射取决于这个区间所代表的形状。

EN

回答 2

Stack Overflow用户

发布于 2014-02-19 20:43:39

你听说过WPF的螺旋三维工具包吗?

我没有走到您想要的程度,但我想通过查看https://helixtoolkit.codeplex.com/wikipage?title=SurfaceDemo示例是可能的:

票数 1
EN

Stack Overflow用户

发布于 2014-02-19 20:54:57

当然有这样的图书馆,但是给出一些简单的方法,通过google,http://www.geeksforgeeks.org/check-whether-a-given-point-lies-inside-a-triangle-or-not/搜索。

计算距离的角,给出了平滑的颜色信息。检查点是否在三角形中。

代码语言:javascript
代码运行次数:0
运行
复制
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效率很低。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21891537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档