------------------------------------------------------------------------------
| 1598 | |
| 1599 | //------------------------------------------------------------------------------ |
| 1600 | int vtkOBBTree::TriangleIntersectsNode( |
| 1601 | vtkOBBNode* nodeA, double p0[3], double p1[3], double p2[3], vtkMatrix4x4* XformBtoA) |
| 1602 | { |
| 1603 | vtkOBBNode* pA; |
| 1604 | double p0Xformed[3], p1Xformed[3], p2Xformed[3]; |
| 1605 | double *pB[3], in[4], out[4], v0[3], v1[3], AtoB[3], xprod[3]; |
| 1606 | double rangeAmin, rangeAmax, rangeBmin, rangeBmax, dotA, dotB; |
| 1607 | double eps; |
| 1608 | int ii, jj, kk; |
| 1609 | |
| 1610 | eps = this->Tolerance; |
| 1611 | pA = nodeA; |
| 1612 | if (XformBtoA != nullptr) |
| 1613 | { // Here we assume that XformBtoA is an orthogonal matrix |
| 1614 | pB[0] = p0Xformed; |
| 1615 | pB[1] = p1Xformed; |
| 1616 | pB[2] = p2Xformed; |
| 1617 | for (ii = 0; ii < 3; ii++) |
| 1618 | { |
| 1619 | p0Xformed[ii] = p0[ii]; |
| 1620 | p1Xformed[ii] = p1[ii]; |
| 1621 | p2Xformed[ii] = p2[ii]; |
| 1622 | } |
| 1623 | for (ii = 0; ii < 3; ii++) |
| 1624 | { |
| 1625 | in[0] = pB[ii][0]; |
| 1626 | in[1] = pB[ii][1]; |
| 1627 | in[2] = pB[ii][2]; |
| 1628 | in[3] = 1.0; |
| 1629 | XformBtoA->MultiplyPoint(in, out); |
| 1630 | pB[ii][0] = out[0] / out[3]; |
| 1631 | pB[ii][1] = out[1] / out[3]; |
| 1632 | pB[ii][2] = out[2] / out[3]; |
| 1633 | } |
| 1634 | } |
| 1635 | else |
| 1636 | { |
| 1637 | pB[0] = p0; |
| 1638 | pB[1] = p1; |
| 1639 | pB[2] = p2; |
| 1640 | } |
| 1641 | |
| 1642 | // now check for a separation plane parallel to the triangle |
| 1643 | for (ii = 0; ii < 3; ii++) |
| 1644 | { // plane is normal to the triangle |
| 1645 | v0[ii] = pB[1][ii] - pB[0][ii]; |
| 1646 | v1[ii] = pB[2][ii] - pB[0][ii]; |
| 1647 | } |
| 1648 | vtkMath::Cross(v0, v1, xprod); |
| 1649 | // computing B range is easy... |
| 1650 | rangeBmin = rangeBmax = vtkMath::Dot(pB[0], xprod); |
| 1651 | // compute A range... |
| 1652 | rangeAmin = rangeAmax = vtkMath::Dot(pA->Corner, xprod); |
| 1653 | for (jj = 0; jj < 3; jj++) |
| 1654 | { |
| 1655 | dotA = vtkMath::Dot(xprod, pA->Axes[jj]); |
| 1656 | if (dotA > 0) |
| 1657 | { |
no test coverage detected