示例#1
0
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;
}
示例#2
0
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.
}