Blog Home | marisi @ cxx0 | dotbtk.org

Eau de WC-lette

Toilet Perfume from Hell!


Wednesday, December 07, 2011

Circles of Confusion

Ketika ditanya dulu, aku kurang yakin apakah aku menjawabnya dengan benar atau tidak (mungkin benar 60%-70%? Entahlah karena dulunya lebih fokus bermain-main dengan jari-jari lingkaran saja). Dulu menjawabnya pakai C seadanya. Jadi ceritanya ada 2 buah lingkaran. Yang jadi pertanyaan, apakah 2 buah lingkaran tersebut bersentuhan [atau mungkin beririsan?]. Ya, semacam collision detection. Bedanya, dalam hal ini, lingkarannya tidak bergerak. Jadi belum bisa dikatakan collision detection. Setelah lihat-lihat lagi, Internet menyediakan beberapa solusi dan referensi (nanti linknya ada dibawah). Melalui tulisan kali ini, aku menulisnya [kembali] dengan Python. Kali ini hanya sekedar konversi sedikit. Entahlah, mungkin itu cara termudah bagiku untuk belajar suatu bahasa pemrograman yang baru disela-sela waktuku _yang berharga_ .

#!/opt/sw/bin/python
import math
class Point2D(object):
    def __init__(self, x, y):
        self.x = float(x)
        self.y = float(y)
    
class Circle(object):
    def __init__(self, point2d, radius):
        self.midpoint = point2d
        self.radius = float(radius)
        
    def intersectionStatus(self, circle):
        dx = float(self.midpoint.x - circle.midpoint.x)
        dy = float(self.midpoint.y - circle.midpoint.y)
        
        d = math.sqrt((dy * dy) + (dx * dx)) # distance between midpoints of circle0 and circle1
        # d = math.sqrt((math.pow(dy, 2)) + (math.pow(dx, 2)))
        
        if d > self.radius + circle.radius or d < math.fabs(self.radius - circle.radius):
            print 'Nope! Not Intersecting nor Touching. Maybe, Overlapping.'
        else:
            # x = (d^2 - r^2 + R^2) / (2d)
            x = (math.pow(self.radius, 2) - math.pow(circle.radius, 2) + math.pow(d, 2)) / (2.0 * d)
            # point 3
            ix3 = self.midpoint.x + (dx * (x/d))
            iy3 = self.midpoint.y + (dy * (x/d))
            # y^2 = R^2 - x^2
            y = math.sqrt(math.pow(self.radius, 2)) - (math.pow(x, 2))
        
            rx = -dy * (y/d)
            ry = dx * (y/d)
            ix1 = ix3 + rx
            iy1 = iy3 + ry
        
            ix2 = ix3 - rx
            iy2 = iy3 - ry
        
            if math.fabs(ix1 - ix2) + math.fabs(iy1 - iy2) < 1e-4:
                print 'Touching!'
            else:
                print 'Intersecting!'
# TODO: Test...

Referensi:
  • http://mathworld.wolfram.com/Circle-CircleIntersection.html
  • http://paulbourke.net/geometry/2circle/
Setelah ini bakal ada lagu juga. Meskipun mungkin liriknya tidak memiliki pattern sama sekali dengan tulisan ini atau tulisan yang lain :-D

Labels: howto, nggakjelas, python

posted by: marisi @ 10:18 PM


<< Home

Profile

About Me

My Photo
Name: marisi
Location: Indonesia

View my complete profile



Previous Post

  • Europe - The Final Countdown
  • Penutup Akhir Pekan
  • Bird - Still Throwing Your Shoe ("Scorpions - Stil...
  • Cyndi Lauper - Time After Time
  • Fastball - The Way
  • Balada Sebuah Titik Dalam Segitiga
  • Rod Stewart - Have You Ever Seen The Rain ("CCR - ...
  • Tolu Hali Diribak Hamu Rohangki
  • Toto - I Will Remember
  • Survivor - Eye of The Tiger


Fave Links

  • rotten dot com


Friends/Links

  • Duaon Simandalahi


Archives

  • May 2006
  • June 2006
  • July 2006
  • August 2006
  • September 2006
  • October 2006
  • November 2006
  • December 2006
  • January 2007
  • August 2009
  • September 2009
  • October 2009
  • November 2009
  • December 2009
  • January 2010
  • February 2010
  • April 2010
  • July 2010
  • August 2010
  • November 2010
  • December 2010
  • November 2011
  • December 2011
  • January 2012


Miscs

Follow marisitorus on Twitter

Credits

  • Blogger.com
  • Simple-Blogskins
AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789-=\!@#$%^&*()_+|[]{};':",./<>?`~