как найти позицию касания внутри фигуры в box2d? - PullRequest
0 голосов
/ 10 августа 2011

Пожалуйста, помогите мне

Я создал ребра в своем проекте. Я знаю, как проверить позицию касания внутри фигуры

if (fix->TestPoint(locationWorld))
    {
        CCLOG(@"****touch inside shape***");
    }

но я хочу создать шестиугольник, и мне нужно создать шар внутри шестиугольника и двигаться внутри шестиугольника.

Я сделал движение шара внутри шестиугольника, используя следующий код: b2BodyDef groundBodyDef; groundBodyDef.position.Set (0, 0); b2Body * groundBody = world-> CreateBody (& groundBodyDef);

int countVal=[pos count];
// Define the ground box shape.
b2PolygonShape groundBox;
int range=[pos count]-2;

CCLOG(@"countVal=%d,range=%d",countVal,range);

for (int i=0; i<=range; i=i+2)
{
    float x1,y1,x2,y2;

    x1=[[pos objectAtIndex:i] floatValue];
    y1=[[pos objectAtIndex:i+1] floatValue];

    if (i==range)
    {
        x2=[[pos objectAtIndex:0] floatValue];
        y2=[[pos objectAtIndex:1] floatValue];

    }
    else 
    {
        x2=[[pos objectAtIndex:i+2] floatValue];
        y2=[[pos objectAtIndex:i+3] floatValue];

    }

            CCLOG(@"x1=%f,y1=%f,x2=%f,y2=%f",x1,y1,x2,y2);

    groundBox.SetAsEdge(b2Vec2(x1/PTM_RATIO,y1/PTM_RATIO),b2Vec2(x2/PTM_RATIO,y2/PTM_RATIO));
    groundBody->CreateFixture(&groundBox, 0);

}

но я не знаю, как найти позицию касания внутри многоугольника. Я использую cocos2d с box2d

Пожалуйста, помогите мне

1 Ответ

1 голос
/ 09 ноября 2011

Наконец я получил ответ: я проверяю, находится ли точка внутри многоугольника:

int pnpoly(int npol, float *xp, float *yp, float x, float y)
{
  int i, j, c = 0;
  for (i = 0, j = npol-1; i < npol; j = i++) 
{
    if ((((yp[i] <= y) && (y < yp[j])) ||
         ((yp[j] <= y) && (y < yp[i]))) &&
        (x < (xp[j] - xp[i]) * (y - yp[i]) / (yp[j] - yp[i]) + xp[i]))
      c = !c;
  }
  return c;
}
...