You are right! Your algorithm is actually a bit faster :-D At first it seems you've added some extra loops but when looking closer I saw that you're code check edges first instead of roaming thourgh the pixels top to bottom.
Well done! I would like to include your algorithm in the PixelPerfect example if its ok with you? Best Regards /John tis 2007-01-30 klockan 20:28 +0530 skrev V. Karthik Kumar: > Hi John, > > The code that was given is a modified version of PixelPerfect. Please > look into it. :) > > I noticed that the code that i posted is probably doing redundant > comparisons for odd pixel width/height collision rectangles (when > reduced to 1 x h ow w x 1 ), which I'll modify. > > Regards > > John Eriksson wrote: > > Hi, > > > > If you're looking for a pixel perfect collision detection algorithm, > > there is a project at pygame which contains an even faster one. > > > > PixelPerfect - http://www.pygame.org/projects/9/207/ > > > > It also contains some replacements methods for spritecollide, > > groupcollide and spritecollideany and an example to show how to use it. > > > > The algorithm was used in one of the Second Pyweek Challenge winners! > > > > Trip on the Funny Boat - http://www.pygame.org/projects/20/235/ > > > > Best Regards > > /John Eriksson > > > > > > > tis 2007-01-30 klockan 06:30 -0800 skrev Kamilche: > > > >> V. Karthik Kumar wrote: > >> > >>> I happened to read the changes list a day ago. I saw the code, I thought > >>> that this change might help detect regular pp cols faster. > >>> > >>> This version keeps checking pixels from the outer rectangle of the > >>> colliding area to the inner. It works considerably faster when objects > >>> are regular and convex, which is often the case. > >>> > >>> This isn't a patch as such, I'd recommend people try it out and report > >>> the results and then decide. > >>> > >>> Regards, > >>> Karthik > >>> > >>> > >>> ------------------------------------------------------------------------ > >>> > >>> def pp_collide(obj1,obj2): > >>> """If the function finds a collision it will return True > >>> if not it will return False. > >>> """ > >>> rect1, rect2, hm1, hm2 = obj1.rect, obj2.rect, obj1.hitmask, > >>> obj2.hitmask > >>> if not rect1.colliderect(rect2): > >>> return False > >>> rect = rect1.clip(rect2) > >>> > >>> w, h, x1, y1, x2, y2 = rect.width, rect.height, rect.x-rect1.x, > >>> rect.y-rect1.y, rect.x-rect2.x, rect.y-rect2.y > >>> > >>> while w > 0 and h > 0: > >>> for x in range(w): > >>> if hm1[x1+x][y1] and hm2[x2+x][y2]: > >>> return True > >>> if hm1[x1+x][y1+h-1] and hm2[x2+x][y2+h-1]: > >>> return True > >>> for y in range(1, h-1): > >>> if hm1[x1][y1+y] and hm2[x2][y2+y]: > >>> return True > >>> if hm1[x1+w-1][y1+y] and hm2[x2+w-1][y2+y]: > >>> return True > >>> w, h, x1, y1, x2, y2 = w-2, h-2, x1+1, y1+1, x2+1, y2+1 > >>> return False > >>> > >> Is it faster than pygame's builtin rect.collidepoint method? > >> > > > > > >