public void Solve3()
{
w1.Set(m_v1.W);
w2.Set(m_v2.W);
w3.Set(m_v3.W);
// Edge12
// [1 1 ][a1] = [1]
// [w1.e12 w2.e12][a2] = [0]
// a3 = 0
e12.Set(w2).SubLocal(w1);
float w1e12 = Vec2.Dot(w1, e12);
float w2e12 = Vec2.Dot(w2, e12);
float d12_1 = w2e12;
float d12_2 = -w1e12;
// Edge13
// [1 1 ][a1] = [1]
// [w1.e13 w3.e13][a3] = [0]
// a2 = 0
e13.Set(w3).SubLocal(w1);
float w1e13 = Vec2.Dot(w1, e13);
float w3e13 = Vec2.Dot(w3, e13);
float d13_1 = w3e13;
float d13_2 = -w1e13;
// Edge23
// [1 1 ][a2] = [1]
// [w2.e23 w3.e23][a3] = [0]
// a1 = 0
e23.Set(w3).SubLocal(w2);
float w2e23 = Vec2.Dot(w2, e23);
float w3e23 = Vec2.Dot(w3, e23);
float d23_1 = w3e23;
float d23_2 = -w2e23;
// Triangle123
float n123 = Vec2.Cross(e12, e13);
float d123_1 = n123 * Vec2.Cross(w2, w3);
float d123_2 = n123 * Vec2.Cross(w3, w1);
float d123_3 = n123 * Vec2.Cross(w1, w2);
// w1 region
if (d12_2 <= 0.0f && d13_2 <= 0.0f)
{
m_v1.A = 1.0f;
Count = 1;
return;
}
// e12
if (d12_1 > 0.0f && d12_2 > 0.0f && d123_3 <= 0.0f)
{
float inv_d12 = 1.0f / (d12_1 + d12_2);
m_v1.A = d12_1 * inv_d12;
m_v2.A = d12_2 * inv_d12;
Count = 2;
return;
}
// e13
if (d13_1 > 0.0f && d13_2 > 0.0f && d123_2 <= 0.0f)
{
float inv_d13 = 1.0f / (d13_1 + d13_2);
m_v1.A = d13_1 * inv_d13;
m_v3.A = d13_2 * inv_d13;
Count = 2;
m_v2.Set(m_v3);
return;
}
// w2 region
if (d12_1 <= 0.0f && d23_2 <= 0.0f)
{
m_v2.A = 1.0f;
Count = 1;
m_v1.Set(m_v2);
return;
}
// w3 region
if (d13_1 <= 0.0f && d23_1 <= 0.0f)
{
m_v3.A = 1.0f;
Count = 1;
m_v1.Set(m_v3);
return;
}
// e23
if (d23_1 > 0.0f && d23_2 > 0.0f && d123_1 <= 0.0f)
{
float inv_d23 = 1.0f / (d23_1 + d23_2);
m_v2.A = d23_1 * inv_d23;
m_v3.A = d23_2 * inv_d23;
Count = 2;
m_v1.Set(m_v3);
return;
}
// Must be in triangle123
float inv_d123 = 1.0f / (d123_1 + d123_2 + d123_3);
m_v1.A = d123_1 * inv_d123;
m_v2.A = d123_2 * inv_d123;
m_v3.A = d123_3 * inv_d123;
Count = 3;
}