471,353 Members | 1,730 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,353 software developers and data experts.

Cutting in a circle/ellipse (PIL)

Hello, I wonder how to 'cut' or erase some parts of a image/circle that i've done in PIL.

Let say that I have two circles that intersects with eachother, I know the two points where they intersect and now I want to cut/erase the circle thats left.

Let me show you a image how I want it to look like, that I made in paint:



I really hope you understand and if not, tell me! /flaerpen
Jul 4 '07 #1
3 2934
I have a possible answer. Instead of writing a ellipse/circle you write an Chord(?). but how do I use my points with the chord-function in PIL?

from http://www.pythonware.com/library/pi.../imagedraw.htm
chord

draw.chord(xy, start, end, options)

Same as arc, but connects the end points with a straight line.

The outline option gives the colour to use for the chord outline. The fill option gives the colour to use for the chord interior.
EDIT: Or maybe this is not the solution, because if there is more than one intersection with another circle how do you do that?
Jul 4 '07 #2
I now know (i think) that i'll use the chord-function, but have to ask how to calculate the start and end angle in a general formula.

I made a picture so it can be easier to show you what I really want:



Is there anyone who can help me to create a general forumula for the two green lines?

/flaerpen
Jul 9 '07 #3
bvdet
2,851 Expert Mod 2GB
I now know (i think) that i'll use the chord-function, but have to ask how to calculate the start and end angle in a general formula.

I made a picture so it can be easier to show you what I really want:



Is there anyone who can help me to create a general forumula for the two green lines?

/flaerpen
flaerpen - This class will calculate the angles in radians with respect to circle 1 center point and the circle intersection points:
Expand|Select|Wrap|Line Numbers
  1. class CircleCircleIntersection(object):
  2.     def __init__(self, p1, p2, r1, r2):
  3.         '''
  4.         Given circle center points p1 and p2 and circle radii r1 and r2
  5.         Calculate intersection points of circles
  6.         This only works in the X-Y plane at the present time
  7.         '''
  8.         self.p1 = p1
  9.         self.p2 = p2
  10.         self.r1 = r1
  11.         self.r2 = r2
  12.         self.d = p1.dist(p2)
  13.         if self.d > r1+r2:
  14.             self.Pa = None
  15.             self.Pb = None
  16.         elif self.d < abs(r1-r2):
  17.             self.Pa = None
  18.             self.Pb = None
  19.         else:
  20.             self.a = (r1**2-r2**2+self.d**2)/(2*self.d)
  21.             self.b = self.d-self.a
  22.             self.P0 = polarPt(p1, p2, self.a, p1)
  23.             self.h = (r1**2-self.a**2)**0.5
  24.             self.intPts()
  25.  
  26.     def intPts(self):
  27.         self.Pa = Point()
  28.         self.Pb = Point()
  29.         self.Pa.x = self.P0.x + (self.h * (self.p2.y - self.p1.y) / self.d)
  30.         self.Pb.x = self.P0.x - (self.h * (self.p2.y - self.p1.y) / self.d)
  31.         self.Pa.y = self.P0.y - (self.h * (self.p2.x - self.p1.x) / self.d)
  32.         self.Pb.y = self.P0.y + (self.h * (self.p2.x - self.p1.x) / self.d)
  33.         self.theta0 = math.atan2(self.p2.y+self.p1.y, self.p2.x+self.p1.x)
  34.         self.theta1 = self.theta0 - math.atan2(self.h, self.a)
  35.         self.theta2 = self.theta0 + math.atan2(self.h, self.a)
Here is function 'polarPt':
Expand|Select|Wrap|Line Numbers
  1. def polarPt (p1, p2, d, p3=False):
  2.     '''
  3.     Calculate the vector p1-->p2
  4.     Translate distance 'd' parallel to vector p1-->p2 from point 'p3'
  5.     Return the new point
  6.     'p3' defaults to 'p2'
  7.     >>> polarPt(p1,p2,10,p3)
  8.     Point(4.651484, 24.128709, 8.825742)
  9.     >>> polarPt(p1,p2,10)
  10.     Point(10.651484, 19.128709, 7.825742)
  11.     >>> 
  12.     '''
  13.     return (p3 or p2)+(p2-p1).uv()*d
You will need a point object with 'x' and 'y' attributes, a unit vector (uv()) method, a distance (dist()) method, and + - * overloads. The angles calculated are counter-clockwise.
Expand|Select|Wrap|Line Numbers
  1. >>> a = CircleCircleIntersection(Point(), Point(-2,5.5,0), 3.5, 3.0)
  2. >>> a.theta0
  3. 1.9195673303788037
  4. >>> a.theta1
  5. 1.5052297601267781
  6. >>> a.theta2
  7. 2.3339049006308294
  8. >>> a.h
  9. 1.4090427459286017
  10. >>> a.a
  11. 3.2038412164378536
  12. >>> a.P0
  13. Point(-1.094891, 3.010949, 0.000000)
  14. >>> a.Pa
  15. Point(0.229319, 3.492479, 0.000000)
  16. >>> a.Pb
  17. Point(-2.419100, 2.529418, 0.000000)
  18. >>> 
I used Paul Bourke's website for reference. LINK
Jul 9 '07 #4

Post your reply

Sign in to post your reply or Sign up for a free account.

Similar topics

2 posts views Thread by Brian Basquille | last post: by
20 posts views Thread by chump1708 | last post: by
4 posts views Thread by Matt Haggard | last post: by
11 posts views Thread by Christopher Ireland | last post: by
3 posts views Thread by surbhi bhargava | last post: by
reply views Thread by Tem | last post: by
reply views Thread by =?Utf-8?B?UGFua2FqR2F1cg==?= | last post: by
reply views Thread by XIAOLAOHU | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.