纳金网
标题:
判断一点在一个三角形内的代码
[打印本页]
作者:
烟雨
时间:
2015-12-30 23:31
标题:
判断一点在一个三角形内的代码
Vector3ForNew A(64.0f,0.0f,1.0f);//三角形定点坐标
Vector3ForNew B(0.0f,128.0f,1.0f);//三角形定点坐标
Vector3ForNew C(128.0f,128.0f,1.0f);//三角形定点坐标
for (int a=0;a<128;a++)
{
for (int b=0;b<128;b++)
{
COLORREF kcolor = GetPixel(test.GetDC(),a,b);
if (CLR_INVALID==kcolor)
{
//获取像素颜色失败
}
else
{
float af = (float)a;
float bf = (float)b;
Vector3ForNew P(af,bf,1.0f);
if (PointinTriangle(A,B,C,P))
{
test.SetPixelRGB(a,b,255,0,0);//替换红色,让三角形为红色
}
else
{
test.SetPixelRGB(a,b,0,0,0);//黑色
}
}
}
}
bool UserDefinedMenu::PointinTriangle(Vector3ForNew A, Vector3ForNew B, Vector3ForNew C, Vector3ForNew P)
{
Vector3ForNew v0 = C - A ;
Vector3ForNew v1 = B - A ;
Vector3ForNew v2 = P - A ;
float dot00 = v0.Dot(v0) ;
float dot01 = v0.Dot(v1) ;
float dot02 = v0.Dot(v2) ;
float dot11 = v1.Dot(v1) ;
float dot12 = v1.Dot(v2) ;
float inverDeno = 1 / (dot00 * dot11 - dot01 * dot01) ;
float u = (dot11 * dot02 - dot01 * dot12) * inverDeno ;
if (u < 0 || u > 1) // if u out of range, return directly
{
return false ;
}
float v = (dot00 * dot12 - dot01 * dot02) * inverDeno ;
if (v < 0 || v > 1) // if v out of range, return directly
{
return false ;
}
return u + v <= 1 ;
}
// 3D vector
class Vector3ForNew
{
public:
Vector3ForNew(float fx, float fy, float fz)
:x(fx), y(fy), z(fz)
{
}
// Subtract
Vector3ForNew operator - (const Vector3ForNew& v) const
{
return Vector3ForNew(x - v.x, y - v.y, z - v.z) ;
}
// Dot product
float Dot(const Vector3ForNew& v) const
{
return x * v.x + y * v.y + z * v.z ;
}
// Cross product
Vector3ForNew Cross(const Vector3ForNew& v) const
{
return Vector3ForNew(
y * v.z - z * v.y,
z * v.x - x * v.z,
x * v.y - y * v.x ) ;
}
public:
float x, y, z ;
};
复制代码
欢迎光临 纳金网 (http://go.narkii.com/club/)
Powered by Discuz! X2.5