diff options
author | Jan Margeta <jmargeta@gmail.com> | 2017-04-15 15:40:53 +0200 |
---|---|---|
committer | Jan Margeta <jmargeta@gmail.com> | 2017-04-15 15:40:55 +0200 |
commit | dd1676ad8a9fff65231c22c01efc4bbccc21eb05 (patch) | |
tree | 7d72c7b892958a8da8a63ade6cbdc59854f3e7a1 | |
parent | dd0abbf3072b59c8e5ec437a85ccaf01272d8043 (diff) | |
download | gerbonara-dd1676ad8a9fff65231c22c01efc4bbccc21eb05.tar.gz gerbonara-dd1676ad8a9fff65231c22c01efc4bbccc21eb05.tar.bz2 gerbonara-dd1676ad8a9fff65231c22c01efc4bbccc21eb05.zip |
Add tolerance to center finding
In some cases, the computation of valid sweep angle hit numerical limits
and no centers are found.
This commit adds a small amount of tolerance.
-rw-r--r-- | gerber/rs274x.py | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/gerber/rs274x.py b/gerber/rs274x.py index 5191fb7..fee60b3 100644 --- a/gerber/rs274x.py +++ b/gerber/rs274x.py @@ -765,14 +765,17 @@ class GerberParser(object): # Calculate the radius error sqdist_start = sq_distance(start, test_center) sqdist_end = sq_distance(end, test_center) + sqdist_diff = abs(sqdist_start - sqdist_end) # Take the option with the lowest radius error from the set of # options with a valid sweep angle - if ((abs(sqdist_start - sqdist_end) < sqdist_diff_min) - and (sweep_angle >= 0) - and (sweep_angle <= math.pi / 2.0)): + # In some rare cases, the sweep angle is numerically (10**-14) above pi/2 + # So it is safer to compare the angles with some tolerance + is_lowest_radius_error = sqdist_diff < sqdist_diff_min + is_valid_sweep_angle = sweep_angle >= 0 and sweep_angle <= math.pi / 2.0 + 1e-6 + if is_lowest_radius_error and is_valid_sweep_angle: center = test_center - sqdist_diff_min = abs(sqdist_start - sqdist_end) + sqdist_diff_min = sqdist_diff return center else: return (start[0] + offsets[0], start[1] + offsets[1]) |