1

I am making a little ant colony simulation in Processing (4). I have an Ant class, with a sense() , a move()and a render() function.

I also have a Food class with only a position PVector. My sense class loops through all Foods in a given radius, and it is meant to only 'see' the ones inside a given view angle.

In my render() function I have an arc to visualise this (I do some division and addition so the arc centres in front of the rectangle):

void render() {
    // Draw a rectangl rotated in the direction of velocity
    float theta = velocity.heading() + radians(90);
    if(detectFood) // a Boolean set in sense()
      fill(0,173,67); // turns green
    else {
      stroke(255);
      pushMatrix();
      translate(position.x, position.y);
      fill(200, 100);
      rotate(theta); // I copied the rotation code from somewhere :)
      rect(0-r/2,0-r,r,r*2); // r is a float used to control size

      arc(0, 0, viewRadius * 2, viewRadius * 2, radians(270 - viewAngle/2), radians(270 + viewAngle/2)); // viewRadius is a float set in the constructor

      popMatrix();
    }
  }

This ends up looking like this:

image

My sense() code uses trigonometry to calculate the angle and the distance (I am using my own calculations because wasn't sure the inbuilt ones did what I thought they did):

void sense() {
    if (!detectFood) {
      float closest = viewRadius;
      Food selected = null;
      for (Food fd : foods){
        float foodDist = position.dist(fd.position);
          if(foodDist <= viewRadius) {
            float xs = position.x-fd.position.x;
            float ys = position.y-fd.position.y;

            float Angle = atan2(abs(ys), abs(xs));
            
            float begin = radians(270 - viewAngle/2);
            float end = radians(270 + viewAngle/2);
            
            if(begin < Angle && Angle < end && foodDist < closest){
              selected = fd;
              closest = foodDist;
              println("found food");
            }
        }
      }  
       if (selected != null){
         detectFood = true;
         foodFocused = selected;
       }
    } else {
      if(position.dist(foodFocused.position) < r) {
        takeFood();
        detectFood = false;
      }
    }
  }

The problem is that because I rotate the shape (and the arc with it), my sensing code basically never works. Is there a way to account for rotation in trigonometry or maybe an easier way of doing this? Any help would be apreciated

Turing85
  • 18,217
  • 7
  • 33
  • 58
Dr Tipmack
  • 26
  • 4

0 Answers0