On 2/4/2010 7:05 AM, Shashwat Anand wrote:

        I want to calculate areas.
        like for two circles (0, 0) and (0, 1) : the output is '1.228370'

        similarly my aim is to take 'n' co-ordinates, all of radius '1' and
        calculate the area common to all.
        The best I got was monte-carlo methods which is inefficient. Is
        there
        any other approach possible.



A brute force approach - create a grid of small squares and calculate which squares are in all circles. I don't know whether it is any better than monte-carlo: for two circles, delta=0.001 takes about a minute and delta=0.0001 is still running after 30 minutes :-)

1.22
1.2281
1.22834799999


------------------------------------------------------------------
import math

class Circle:

    def __init__(self, x, y, r=1):
        self.x = float(x)
        self.y = float(y)
        self.r = float(r)

    def contains(self, a, b):
        return math.sqrt((self.x-a)**2 + (self.y-b)**2) <= self.r

class Grid:

    def __init__(self, circles):
        self.X1 = min(c.x-c.r for c in circles)
        self.Y1 = max(c.y+c.r for c in circles)
        self.X2 = max(c.x+c.r for c in circles)
        self.Y2 = min(c.y-c.r for c in circles)
        self.circles = circles

    def iter_boxes(self, delta):
        X2 = self.X2
        Y2 = self.Y2
        a = self.X1
        while a < X2:
            a += delta
            b = self.Y1
            while b > Y2:
                b -= delta
                #print a, b
                yield a, b

    def intersection(self, delta=0.1):
        S = 0
        s = delta**2 #box area
        circles = self.circles
        for a, b in self.iter_boxes(delta):
            if all(c.contains(a, b) for c in circles):
                S += s
        return S


c = Circle(0, 1)

assert c.contains(0, 1)
assert c.contains(0, 1.5)
assert c.contains(math.sqrt(2)/2, math.sqrt(2)/2)
assert c.contains(0, 2)
assert not c.contains(0, 2.01)
assert not c.contains(0, 2.1)
assert not c.contains(0, 3)

circles = [
        Circle(0, 0),
        Circle(0, 1),
]

g = Grid(circles)

print '-'*30
print g.intersection()
print g.intersection(0.01)
print g.intersection(0.001)
print g.intersection(0.0001)

------------------------------------------------------------------

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to