How to detect something inside a mouth?

This is a discussion on How to detect something inside a mouth? within the Game Programming forums, part of the General Programming Boards category; Hi, How can i detect if say a little ball is inside something like a pacman's mouth? See diagram:...

  1. #1
    Registered User Nutshell's Avatar
    Join Date
    Jan 2002
    Posts
    1,020

    How to detect something inside a mouth?

    Hi,

    How can i detect if say a little ball is inside something like a pacman's mouth?

    See diagram:
    Attached Images Attached Images  
    Last edited by Nutshell; 09-14-2003 at 02:00 AM.

  2. #2
    carry on JaWiB's Avatar
    Join Date
    Feb 2003
    Location
    Seattle, WA
    Posts
    1,972
    Couldn't you just use some sort of coordinate system and see if the ball x and y is equal to the mouth x,y (or perhaps slightly off)
    "Think not but that I know these things; or think
    I know them not: not therefore am I short
    Of knowing what I ought."
    -John Milton, Paradise Regained (1671)

    "Work hard and it might happen."
    -XSquared

  3. #3
    Registered User Nutshell's Avatar
    Join Date
    Jan 2002
    Posts
    1,020
    The pacman-like thing should be able to move and turn 360 degrees, so it's a bit confusing for me as in how to compare the coordinates etc. Any ideas?

  4. #4
    carry on JaWiB's Avatar
    Join Date
    Feb 2003
    Location
    Seattle, WA
    Posts
    1,972
    Hm...well I think the way you want to do it would be a bit detailed. It seems like coordinates could still work, but sometimes the top or bottom of the mouth would go through a ball, rather than having the ball just go right inside the mouth...Unless you can just get the right spacing so that the opening and closing of the mouth is in sync with hitting the balls...
    "Think not but that I know these things; or think
    I know them not: not therefore am I short
    Of knowing what I ought."
    -John Milton, Paradise Regained (1671)

    "Work hard and it might happen."
    -XSquared

  5. #5
    Registered User Nutshell's Avatar
    Join Date
    Jan 2002
    Posts
    1,020
    Wat do you mean ?

  6. #6
    mov.w #$1337,D0 Jeremy G's Avatar
    Join Date
    Nov 2001
    Posts
    704
    The solution you require is finding out if a point is inside a circle. I think probably the best way to do this is:

    Assumptions:
    Pacman is its own graphic - ie: a 30x30 .bmp (pixel and file format are arbitrary - the math is the concentration)
    Pacman's radius is =~ 15 (ie the circle takes up the full bitmap
    Pacman's center is the drawing location of the bitmap plus radius
    The byte sized ball he eats is 10/10
    The byte sized ball has a radius of 5
    The byte sized ball's center is its drawn location + radius

    To find out if pacman is eating any givin ball on the screen compare the distance of pacmans center to the desired ball's center. If the distance is equal to or less than the radius of pacman, you are eating the ball.

    Code:
    // Psuedo code'ish 
    	pmanCenter.x = pman.X // where these are the coordinates on screen (pixel) you will start
    	pmanCenter.y = pman.y // drawing the bit map
    	pmanCenter.x += pmanRadius
    	pmanCenter.y += pmanRadius 
    
    	byteCenter.x = byte.x // screen coordinates you start drawing byte ball
    	byteCenter.y = byte.y 
    	byteCenter.x += byteRadius
    	byteCenter.y += byteRadius
    
    	dx = byteCenter.x - pmanCenter.x
    	dy = byteCenter.y - pmanCenter.y
    	dist = sqrt( dx*dx + dy*dy )
    
    	if( dist <= pmanRadius )
    	    // the ball was eaten!
    Last edited by dbgt goten; 09-14-2003 at 01:30 AM.
    c++->visualc++->directx->opengl->c++;
    (it should be realized my posts are all in a light hearted manner. And should not be taken offense to.)

  7. #7
    Registered User Nutshell's Avatar
    Join Date
    Jan 2002
    Posts
    1,020
    THnx, but no. I want the ball only to be eaten if it is inside the pacman's mouth, not just inside pacman's outline. I didn't say im making pacman, im just using pacman as an example, since my sprite should be able to turn and move in 360 degrees.

    thnx

  8. #8
    mov.w #$1337,D0 Jeremy G's Avatar
    Join Date
    Nov 2001
    Posts
    704
    well guess what :
    thats part of the answer still - but now its just something to eliminate potential's that arnt close enough to be eaten.

    After you've found something that is CLOSE ENOUGH to be eaten, then you find out if it is eaten. Get the enclosing points of the moth, for pacman example its 3 poitns (a triangle). (this would be much easier for a 4 point mount (rectanguler) - perhaps you could simplify the mouth and make it (progmaticly) a 4 point area - which sould be close enough really.

    Continuing on the 4 point path - all you will have to do is check to see if the byte ball center is between all four points of the mouth. (Make sure you take the 2d coordinates rotate them to find out what they are after the points are rotated to match the mouth orientation).
    But now you have an awkwardly rotated rectangle - which is still difficult to handle - what to do? Grab all the points of the mouth + the point of the bite ball center, and rotate them so teh mouth rectangle is nicely parallel witht he x -axis. (ie rotate by -mouth orientation) then check to see if the opint is in the bounding box.


    If you went the direction of a 3 point mouth, you wont have to worry about rotating the ball point and the mouth points to the - orientation for nice ness, but it has its own negative side. For all 3 sides of the 3 point triangle you have to find the slope between each vertex, and test to see if the byte ball center point is on a certan side of the line. Do this for all 3 sides, and if the ball is on the correct side of the line for each, then its in the mouth.

    A bit more math heavy there.

    Hope that helped.
    c++->visualc++->directx->opengl->c++;
    (it should be realized my posts are all in a light hearted manner. And should not be taken offense to.)

  9. #9
    Registered User Nutshell's Avatar
    Join Date
    Jan 2002
    Posts
    1,020
    Hey,

    I found out the answer . For future readers, my mouth (the pacman's) is a triangle, so we need to know if a point is inside a triangle. To do this follow these steps:
    Code:
    1) Get the formula for the area of a triangle given the three vertices.
    2) Calculate the area of the triangle.
    3) Use the point as a new vertix and calculate the areas of the three
    triangles formed by the point and the three sides of the original triangle.
    4) If the sum of the areas of those three triangles is the same as the area
    of the original triangle, then the point is within the triangle. If the sum
    is greater, the point is outside the triangle.
    bye

  10. #10
    mov.w #$1337,D0 Jeremy G's Avatar
    Join Date
    Nov 2001
    Posts
    704
    what happens if the point is on the oppisite side of the mouth ? (back of the head, it may still have the same area or smaller, but be in the wrong direction.
    c++->visualc++->directx->opengl->c++;
    (it should be realized my posts are all in a light hearted manner. And should not be taken offense to.)

  11. #11
    Registered User Nutshell's Avatar
    Join Date
    Jan 2002
    Posts
    1,020
    A point is either inside or outside. I can do the radius distance check first.

    The problem im having now is how to allow the point to pass through the outline of the pacman thing to enter the mouth...<thinkin>

  12. #12
    Confused Magos's Avatar
    Join Date
    Sep 2001
    Location
    Sweden
    Posts
    3,145
    1) Check if it's inside the circle (easy, using pythagoras)

    2) Get the angle between the food and the center of the circle. If it's between the angles of Pac-man's 'jaws', then it's in the mouth. Angles can be calculated with arctan or some other trig function.
    MagosX.com

    Give a man a fish and you feed him for a day.
    Teach a man to fish and you feed him for a lifetime.

  13. #13
    Banned
    Join Date
    Jan 2003
    Posts
    1,708
    to add to what magos said the dotproduct between two normalized vectors is the cosine of the angle between the vectors.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. declaring variables inside loops
    By samus250 in forum C Programming
    Replies: 21
    Last Post: 04-30-2008, 01:51 PM
  2. variables when declared inside or outside a function
    By jas_atwal in forum C Programming
    Replies: 6
    Last Post: 12-14-2007, 01:42 PM
  3. Still battling with Copy Control
    By Mario F. in forum C++ Programming
    Replies: 9
    Last Post: 06-23-2006, 08:04 AM
  4. Dikumud
    By maxorator in forum C++ Programming
    Replies: 1
    Last Post: 10-01-2005, 06:39 AM
  5. Replies: 5
    Last Post: 11-20-2003, 12:27 AM

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21