查看: 684|回复: 0
打印 上一主题 下一主题

[其他] 判断一点在一个三角形内的代码

[复制链接]

9903

主题

126

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
53464
精华
316

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2015-12-30 23:31:41 |只看该作者 |倒序浏览
  1. Vector3ForNew A(64.0f,0.0f,1.0f);//三角形定点坐标
  2.    Vector3ForNew B(0.0f,128.0f,1.0f);//三角形定点坐标
  3.    Vector3ForNew C(128.0f,128.0f,1.0f);//三角形定点坐标

  4.    for (int a=0;a<128;a++)
  5.    {
  6.       for (int b=0;b<128;b++)
  7.       {
  8.          COLORREF kcolor = GetPixel(test.GetDC(),a,b);
  9.          if (CLR_INVALID==kcolor)
  10.          {
  11.                    //获取像素颜色失败
  12.          }
  13.          else
  14.          {
  15.             float af = (float)a;
  16.             float bf = (float)b;
  17.             Vector3ForNew P(af,bf,1.0f);
  18.             if (PointinTriangle(A,B,C,P))
  19.             {
  20.                                 test.SetPixelRGB(a,b,255,0,0);//替换红色,让三角形为红色
  21.             }
  22.             else
  23.             {
  24.                 test.SetPixelRGB(a,b,0,0,0);//黑色
  25.             }
  26.          }
  27.       }
  28.    }
  29. bool UserDefinedMenu::PointinTriangle(Vector3ForNew A, Vector3ForNew B, Vector3ForNew C, Vector3ForNew P)
  30. {
  31.    Vector3ForNew v0 = C - A ;
  32.    Vector3ForNew v1 = B - A ;
  33.    Vector3ForNew v2 = P - A ;

  34.    float dot00 = v0.Dot(v0) ;
  35.    float dot01 = v0.Dot(v1) ;
  36.    float dot02 = v0.Dot(v2) ;
  37.    float dot11 = v1.Dot(v1) ;
  38.    float dot12 = v1.Dot(v2) ;

  39.    float inverDeno = 1 / (dot00 * dot11 - dot01 * dot01) ;

  40.    float u = (dot11 * dot02 - dot01 * dot12) * inverDeno ;
  41.    if (u < 0 || u > 1) // if u out of range, return directly
  42.    {
  43.       return false ;
  44.    }

  45.    float v = (dot00 * dot12 - dot01 * dot02) * inverDeno ;
  46.    if (v < 0 || v > 1) // if v out of range, return directly
  47.    {
  48.       return false ;
  49.    }

  50.    return u + v <= 1 ;
  51. }
  52. // 3D vector
  53. class Vector3ForNew
  54. {
  55. public:
  56.    Vector3ForNew(float fx, float fy, float fz)
  57.       :x(fx), y(fy), z(fz)
  58.    {
  59.    }

  60.    // Subtract
  61.    Vector3ForNew operator - (const Vector3ForNew& v) const
  62.    {
  63.       return Vector3ForNew(x - v.x, y - v.y, z - v.z) ;
  64.    }

  65.    // Dot product
  66.    float Dot(const Vector3ForNew& v) const
  67.    {
  68.       return x * v.x + y * v.y + z * v.z ;
  69.    }

  70.    // Cross product
  71.    Vector3ForNew Cross(const Vector3ForNew& v) const
  72.    {
  73.       return Vector3ForNew(
  74.          y * v.z - z * v.y,
  75.          z * v.x - x * v.z,
  76.          x * v.y - y * v.x ) ;
  77.    }

  78. public:
  79.    float x, y, z ;
  80. };
复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-6-17 21:24 , Processed in 0.083001 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部