[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
Re: gEDA-user: Strange PCB warning
On Thu, 2009-11-12 at 17:16 +0000, Ineiev wrote:
> Sorry, forgot to scale atan2 result:
Is this patch still needed if the bounding-boxes were correct?
Why does the arc intersection test use the bounding boxes anyway.. is it
just a short-cut to avoid computing a more expensive geometric test in
case the supposed circle intersection was outside the other arc's
bounding box?
Does your patch explicitly allow for the thickness of the drawn arc?
> diff --git a/src/find.c b/src/find.c
> index b24512a..62f5df0 100644
> --- a/src/find.c
> +++ b/src/find.c
> @@ -1327,6 +1327,24 @@ PVTouchesLine (LineTypePtr line)
> return (False);
> }
>
> +static int
> +radius_crosses_arc (float x, float y, ArcTypePtr arc)
> +{
> + float alpha = atan2 (y - arc->Y, x - arc->X) * 180 / M_PI, start, delta;
> +
> + start = (float) fmod (arc->StartAngle, 360);
> + delta = arc->Delta;
> + if (alpha < 0)
> + alpha += 360;
> + if (start < 0)
> + start += 360;
> + if (delta < 0)
> + {
> + start += delta;
> + delta = -delta;
> + }
> + return (start < alpha && start + delta > alpha);
> +}
> /* ---------------------------------------------------------------------------
> * check if two arcs intersect
> * first we check for circle intersections,
> @@ -1424,7 +1442,9 @@ ArcArcIntersect (ArcTypePtr Arc1, ArcTypePtr Arc2)
> && x + dy >= Arc2->BoundingBox.X1
> && x + dy <= Arc2->BoundingBox.X2
> && y - dx >= Arc2->BoundingBox.Y1 && y - dx <= Arc2->BoundingBox.Y2)
> - return (True);
> + if (radius_crosses_arc (x + dy, y - dx, Arc1)
> + && radius_crosses_arc (x + dy, y - dx, Arc2))
> + return (True);
>
> if (x - dy >= Arc1->BoundingBox.X1
> && x - dy <= Arc1->BoundingBox.X2
> @@ -1433,7 +1453,9 @@ ArcArcIntersect (ArcTypePtr Arc1, ArcTypePtr Arc2)
> && x - dy >= Arc2->BoundingBox.X1
> && x - dy <= Arc2->BoundingBox.X2
> && y + dx >= Arc2->BoundingBox.Y1 && y + dx <= Arc2->BoundingBox.Y2)
> - return (True);
> + if (radius_crosses_arc (x - dy, y + dx, Arc1)
> + && radius_crosses_arc (x - dy, y + dx, Arc2))
> + return (True);
>
> /* try the end points in case the ends don't actually pierce the
> outer radii */
> box = GetArcEnds (Arc1);
>
>
> _______________________________________________
> geda-user mailing list
> geda-user@xxxxxxxxxxxxxx
> http://www.seul.org/cgi-bin/mailman/listinfo/geda-user
_______________________________________________
geda-user mailing list
geda-user@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user