求三个三角形相交
inline bool inside(const Vector2 & a, const Vector2 & b)
{
return (a.x*b.y - a.y*b.x) >= 0;
}
//分割定理求两个2d三角形相交
bool triangle2DIntersect(Vector2 triA[3], Vector2 triB[3])
{
bool signA = inside( triA[1] - triA[0], triA[2] - triA[0] );
bool signB = inside( triB[1] - triB[0], triB[2] - triB[0] );
Vector2 segmentA, segmentB;
for (int i1 = 0, i2 = 2; i1 <= 2; i2 = i1, i1++)
{
segmentA = triA[i1] - triA[i2];
//线段A可以将两个三角形分割开,则不相交
if (inside( segmentA, triB[0] - triA[i2] ) != signA &&
inside( segmentA, triB[1] - triA[i2] ) != signA &&
inside( segmentA, triB[2] - triA[i2] ) != signA)
{
return false;
}
segmentB = triB[i1] - triB[i2];
if (inside( segmentB, triA[0] - triB[i2] ) != signB &&
inside( segmentB, triA[1] - triB[i2] ) != signB &&
inside( segmentB, triA[2] - triB[i2] ) != signB)
{
return false;
}
}
return true;
}
输入输出
std::ostream & operator<<(std::ostream & out, const Vector3 & v)
{
out<<"(" <<v.x <<", " <<v.y <<", " <<v.z <<")";
return out;
}
std::istream & operator>>(std::istream & in, Vector3 & v)
{
char ch;
do
{
in >> ch;
}while(ch != '(');
in>>v.x>>ch >>v.y>>ch >>v.z>>ch;
return in;
}
void Vector3::projectTo2D(Vector2 & p) const
{
float maxD = fabs(x);
p.init(y, z);
float t = fabs(y);
if (maxD < t)
{
maxD = t;
p.init(x, z);
}
t = fabs(z);
if (maxD < t)
{
p.init(x, y);
}
}
void Vector3::projectTo2D(int & u, int & v) const
{
float maxD = fabs(x);
u = AXIS_Y;
v = AXIS_Z;
float t = fabs(y);
if (maxD < t)
{
maxD = t;
u = AXIS_X;
v = AXIS_Z;
}
t = fabs(z);
if (maxD < t)
{
u = AXIS_X;
v = AXIS_Y;
}
}
int Vector3::maxAxis() const
{
float maxD = fabs(x);
int axis = AXIS_X;
float t = fabs(y);
if (maxD < t)
{
maxD = t;
axis = AXIS_Y;
}
t = fabs(z);
if (maxD < t)
{
axis = AXIS_Z;
}
return axis;
}