Exemplo n.º 1
0
std::vector<IntResult> SimpleIntersector::LineArcIntersect(FastLine* line, FastArc* arc)
{
	std::vector<IntResult> ret;

	double dx = line->B.X() - line->A.X();
	double dy = line->B.Y() - line->A.Y();
	double a = dx*dx + dy*dy;
	double b = 2 * ((line->B.X() - line->A.X()) * (line->A.X() - arc->C.X()) + (line->B.Y() - line->A.Y()) * (line->A.Y() - arc->C.Y())); 
	double c = arc->C.X() * arc->C.X() + arc->C.Y() * arc->C.Y() + line->A.X()*line->A.X() + line->A.Y()*line->A.Y() - 2*(arc->C.X() * line->A.X() + arc->C.Y() * line->A.Y()) - arc->rad * arc->rad;

	double det = b * b - 4 * a * c;
	if(det<-tol)
		return ret;

	if(det<0)
		det = 0;

	if(det > -tol && det < tol)
	{
		//single intersection
		double u = (-b + sqrt(det)) / (2 * a);
		ret.push_back(LineArcIntersect(line,arc,u));
		return ret;
	}

	//These u's are for the line
	double u1 = (-b + sqrt(det)) / (2 * a);
	double u2 = (-b - sqrt(det)) / (2 * a);

	ret.push_back(LineArcIntersect(line,arc,u1));
	ret.push_back(LineArcIntersect(line,arc,u2));

	return ret;
}
Exemplo n.º 2
0
std::vector<IntResult> SimpleIntersector::Intersects(FastCurve* curve1, FastCurve* curve2)
{
	std::vector<IntResult> ret;
	bool swap=false;
	FastLine* line1 = dynamic_cast<FastLine*>(curve1);
	if(line1)
	{
		FastLine* line2 = dynamic_cast<FastLine*>(curve2);
		if(line2)
			ret = LinesIntersect((FastLine*)curve1,(FastLine*)curve2);
		else
		{
			FastArc* arc2 = dynamic_cast<FastArc*>(curve2);
			if(arc2)
			{
				ret = LineArcIntersect(line1,arc2);
			}
		}
	}
	else
	{
		FastArc* arc1 = dynamic_cast<FastArc*>(curve1);
		if(arc1)
		{
			FastLine* line2 = dynamic_cast<FastLine*>(curve2);
			if(line2)
			{
				ret = LineArcIntersect(line2,arc1);
				swap = true;
			}
			else
			{
				FastArc* arc2 = dynamic_cast<FastArc*>(curve2);
				ret = ArcsIntersect(arc1,arc2);
			}
		}
	}

	if(swap)
	{
		for(unsigned int i=0; i < ret.size(); i++)
		{
			ret[i].Swap();
		}
	}

	return ret;
}
Exemplo n.º 3
0
static int
drcArc_callback (const BoxType * b, void *cl)
{
  ArcTypePtr arc = (ArcTypePtr) b;
  struct drc_info *i = (struct drc_info *) cl;

  if (!TEST_FLAG (FOUNDFLAG, arc) && LineArcIntersect (i->line, arc))
    longjmp (i->env, 1);
  return 1;
}
Exemplo n.º 4
0
/* ---------------------------------------------------------------------------
 * checks if an arc crosses a square
 */
bool
IsArcInRectangle (Coord X1, Coord Y1, Coord X2, Coord Y2, ArcTypePtr Arc)
{
  LineType line;

  /* construct a set of dummy lines and check each of them */
  line.Thickness = 0;
  line.Flags = NoFlags ();

  /* upper-left to upper-right corner */
  line.Point1.Y = line.Point2.Y = Y1;
  line.Point1.X = X1;
  line.Point2.X = X2;
  if (LineArcIntersect (&line, Arc))
    return (true);

  /* upper-right to lower-right corner */
  line.Point1.X = line.Point2.X = X2;
  line.Point1.Y = Y1;
  line.Point2.Y = Y2;
  if (LineArcIntersect (&line, Arc))
    return (true);

  /* lower-right to lower-left corner */
  line.Point1.Y = line.Point2.Y = Y2;
  line.Point1.X = X1;
  line.Point2.X = X2;
  if (LineArcIntersect (&line, Arc))
    return (true);

  /* lower-left to upper-left corner */
  line.Point1.X = line.Point2.X = X1;
  line.Point1.Y = Y1;
  line.Point2.Y = Y2;
  if (LineArcIntersect (&line, Arc))
    return (true);

  return (false);
}