int crossTest(Point &point, Polygon &polygon) { double xMin = polygon.getPoints()[0].getX(); double xMax = xMin; double distance; int quantity = 0; for (int i = 1; i < polygon.getSize(); i++) { if (polygon.getPoints()[i].getX() < xMin) xMin = polygon.getPoints()[i].getX(); if (polygon.getPoints()[i].getX() > xMax) xMax = polygon.getPoints()[i].getX(); } if ((abs(point.getX() - xMin) > abs(point.getX() - xMax))) distance = abs(point.getX() - xMin); else distance = abs(point.getX() - xMax); Point *dest = new Point(point.getX() + distance + 1, point.getY()); Edge *vector = new Edge(point, *dest); int size = polygon.getSize(); for (int i = 0; i < size; i++) { double d; int num; Edge *need = new Edge(polygon.getPoints()[i], polygon.getPoints()[i]); num = vector->cross(*need, d); if (num == COLLINEAR) { if (i == 0) { if (diffSides(*vector, polygon.getPoints()[size - 1], polygon.getPoints()[1])) quantity++; } else if (i == size - 1) { if (diffSides(*vector, polygon.getPoints()[size - 2], polygon.getPoints()[0])) quantity++; } else if (diffSides(*vector, polygon.getPoints()[i - 1], polygon.getPoints()[i + 1])) quantity++; } } if (quantity == 0) { for (int i = 0; i < polygon.getSize(); i++) { double d; int num; Edge *need; if (i == polygon.getSize() - 1) need = new Edge(polygon.getPoints()[i], polygon.getPoints()[0]); else need = new Edge(polygon.getPoints()[i], polygon.getPoints()[i + 1]); num = vector->cross(*need, d); if (num == SKEW_CROSS) quantity++; } } return quantity; }
Plane findPlane(Axis a, BoundingVolume const &bv) { int off{ 0 }; int smallest{ std::numeric_limits<int>::max() }; Vec3 min{ bv.min() }; Vec3 max{ bv.min() + bv.extent() }; // move candidate plane along axis switch (a) { case Axis::X: { svt::accum_delta next_offset(min.x, svt::delta.x); int pp{ next_offset() }; while (pp < max.x) { int diff{ diffSides( min, { min.x+pp, max.y, max.z }, { min.x+pp, min.y, min.z }, max ) }; std::cout << "X pp: " << pp << " diff: " << diff << "\n-----\n" ; //TODO: handle diff==smallest separately if (diff <= smallest) { smallest = diff; off = pp; } pp = next_offset(); } //for return Plane{ { min.x + off, min.y, min.z }, { min.x + off, max.y, max.z } }; } case Axis::Y: { svt::accum_delta next_offset(min.y, svt::delta.y); int pp{ next_offset() }; while(pp < max.y) { int diff{ diffSides( min, { max.x, min.y+pp, max.z }, { min.x, min.y+pp, min.z }, max ) }; std::cout << "Y pp: " << pp << " diff: " << diff << "\n-----\n" ; //TODO: handle diff==smallest separately if (diff <= smallest) { smallest = diff; off = pp; } pp = next_offset(); } //for return Plane{ { min.x, min.y + off, min.z }, { max.x, min.y + off, max.z } }; } case Axis::Z: { svt::accum_delta next_offset(min.z, svt::delta.z); int pp{ next_offset() }; while (pp < max.z) { int diff{ diffSides( min, { max.x, max.y, min.z+pp }, { min.x, min.y, min.z+pp }, max ) }; std::cout << "Z pp: " << pp << " diff: " << diff << "\n-----\n" ; //TODO: handle diff==smallest separately if (diff <= smallest) { smallest = diff; off = pp; } pp = next_offset(); } //for return Plane{ { min.x, min.y, min.z + off }, { max.x, max.y, min.z + off } }; } default: break; } return Plane{ { -1,-1,-1 }, { -1,-1,-1 } }; // The most interesting case. }