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:
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