Re: [pygame] Pixel Perfect collision suggestion.

2007-01-31 Thread V. Karthik Kumar

Sure, John!

We could also submit this patch to pygame, thereby making the basic 
collision system faster. What say we make a patch?


Regards,
Karthik

John Eriksson wrote:

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
  




Re: [pygame] Pixel Perfect collision suggestion.

2007-01-31 Thread V. Karthik Kumar

@John
No, there isn't any.

@Kamilche:
Rectangular/polygon collision is much faster than pixel perfect 
collision. But ppcol is a viable alternative in  certain games such as 
street fighter or mk (the older ones)


Just an idea here. It would be nice if we did have different coll-d 
algorithms in pygame; because people do a variety of games. Especially 
rectangular, circular, convex-polygon and ppcol methods.


Regards

John Eriksson wrote:

I didn't now there where any pixel perfect collision code in pygame?

/John


ons 2007-01-31 klockan 15:13 +0530 skrev V. Karthik Kumar:
  

Sure, John!

We could also submit this patch to pygame, thereby making the basic 
collision system faster. What say we make a patch?


Regards,
Karthik

John Eriksson wrote:


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
  
  



  




Re: [pygame] Pixel Perfect collision suggestion.

2007-01-31 Thread V. Karthik Kumar
Okay, I modified the code a little bit more. This takes care of the odd 
number of rows/columns in the intersection window.


I guess there shouldn't me any more changes in this.

Regards
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

 if w%2:
for y in range(h):
   if hm1[x1+w-1][y1+y] and hm2[x2+w-1][y2+y]:
   return True
w=w-1

 if h%2:
for x in range(w):
   if hm1[x1+x][y1+h-1] and hm2[x2+x][y2+h-1]:
   return True
h=h-1

 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

Re: [pygame] Pixel Perfect collision suggestion.

2007-01-30 Thread 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?


Re: [pygame] Pixel Perfect collision suggestion.

2007-01-30 Thread John Eriksson
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?



Re: [pygame] Pixel Perfect collision suggestion.

2007-01-30 Thread John Eriksson
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?