Haaf's Game EngineФорум

Класс проверки пересечений многоугольников в 2D (комментарии)

#0
10:06, 26 фев 2008

Класс проверки пересечений многоугольников в 2D (комментарии)

Это сообщение сгенерировано автоматически.

#1
10:06, 26 фев 2008

на иллюстрации пример с прямоугольниками.

как класс работает с ПРОИЗВОЛЬНЫМИ многоугольниками?
будет ли успешно выполняться проверка пересечения произвольного, в том числе и невыпуклого многоугольника и прямоугольника?

#2
11:46, 26 фев 2008

>как класс работает с ПРОИЗВОЛЬНЫМИ многоугольниками?
Произвольный многоугольник формируется при помощи функции AddVertice, при помощи которой задаются все вершины многоугольника (задавать необходимо по часовой стрелке).

>будет ли успешно выполняться проверка пересечения произвольного, в том числе и невыпуклого многоугольника и прямоугольника?
да, реализованный алгоритм успешно обрабатывает невыпуклые многоугольники.

#3
3:11, 9 июля 2008

этот модуль имеет какие-то общие схожие переменные со стандартным спрайтом, которые можно приравнять вместо ручного присваивания?

#4
5:26, 9 июля 2008

CrazyAX
Схожих переменных не имеет. Чтобы строить вершины многоугольника необходимо трассировать контур спрайта, а это уже непростая задача.:)

#5
12:26, 9 июля 2008

Vitorio
Ну не такая уж и сложная задача:)

#6
0:51, 11 июля 2008

задам наверно вопрос на примере:

допустим, упрощая - что машины - квадраты, тогда
//---------------------------------------------------------------------------
всё подключил
........
HGE *hge = 0;
  HEFFECT snd;
......

  VMPolygon car1, car2;

........
  float **pos;
............
void makeCarBorders(float FL)
  {
///*
    for (int i = 0; i < amountcars; i++)
    for (xy = 0; xy < 1; xy++)
      {
        car1.AddVertice(VPoint2D(pos[xy]+150,pos[xy+1]+FL));
        car1.AddVertice(VPoint2D(pos
[xy]+150+carwidth,pos[xy+1]+FL));
        car1.AddVertice(VPoint2D(pos
[xy]+150+carwidth,pos[xy+1]+carheight+FL));
        car1.AddVertice(VPoint2D(pos
[xy]+150,pos[xy+1]+carheight+FL));

        car2.AddVertice(VPoint2D(pos[xy]+150,pos[xy+1]+FL));
        car2.AddVertice(VPoint2D(pos
[xy]+150+carwidth,pos[xy+1]+FL));
        car2.AddVertice(VPoint2D(pos
[xy]+150+carwidth,pos[xy+1]+carheight+FL));
        car2.AddVertice(VPoint2D(pos
[xy]+150,pos[xy+1]+carheight+FL));
      }
//*/
  }
...................
  makeCarBorders(SpeedAlongY); 
  hge->Gfx_BeginScene();
    hge->Gfx_Clear(ARGB(255,0,0,0));//ARGB(255,55,0,100));
      if(car1.IsIntersect(&car2, true)) hge->Gfx_Clear(ARGB(255,55,0,100));

  for(int i=0;i<car1.VerticesCount()-1;i++)
    hge->Gfx_RenderLine(car1.GetVertice(i).x, car1.GetVertice(i).y, car1.GetVertice(i+1).x, car1.GetVertice(i+1).y);
  hge->Gfx_RenderLine(car1.GetVertice(car1.VerticesCount()-1).x, car1.GetVertice(car1.VerticesCount()-1).y, car1.GetVertice(0).x, car1.GetVertice(0).y);

  for(int i=0;i<car2.VerticesCount()-1;i++)
    hge->Gfx_RenderLine(car2.GetVertice(i).x, car2.GetVertice(i).y, car2.GetVertice(i+1).x, car2.GetVertice(i+1).y);

    hge->Gfx_RenderLine(car2.GetVertice(car2.VerticesCount()-1).x, car2.GetVertice(car2.VerticesCount()-1).y, car2.GetVertice(0).x, car2.GetVertice(0).y);


      for (int i = 0; i < amountcars; i++)
        for (xy = 0; xy < 1; xy++)
          {
          //car->IsIntersect;
            car->SetFlip(0,1,1);
            car->Render(pos[xy]+150,SpeedAlongY+pos[xy+1]);
}
  hge->Gfx_EndScene();

вопрос - почему не выводятся ни квадраты машин, ни фон не изменяется на фиолетовый (-а текстуры и спрайты видно, что накладываются-) ?? что я не правильно делаю

#7
1:03, 11 июля 2008

Виторио (Виктор Кондратенко)
я не сдирал - пытался адаптировал под свою среду твой класс описания столкновений и использовал функции использованные в примере к классу. всё что я использовал из твоих наработок я привел в примере выше. я начинающий, но классы читать и использовать умею. с ооп знаком.

#8
1:25, 11 июля 2008

а вот так с обыкновенной стандартной квадратной проверкой работает 

....blabla
      car->GetBoundingBox(pos[1][0],pos[1][1], &Bound1);
      car->GetBoundingBox(pos[2][0],pos[2][1], &Bound2);
      car->GetBoundingBox(pos[0][0],pos[0][1], &Bound3);


    hge->Gfx_Clear(ARGB(255,0,0,0));//ARGB(255,55,0,100));
      if(Bound1.Intersect(&Bound2)) hge->Gfx_Clear(ARGB(255,55,0,100));
      if(Bound1.Intersect(&Bound3)) hge->Gfx_Clear(ARGB(255,55,0,100));
      if(Bound2.Intersect(&Bound3)) hge->Gfx_Clear(ARGB(255,55,0,100));

но я хочу использовать твою проверку. в чем же там дело ? не разбурусь никак. помоги плиз

#9
6:02, 11 июля 2008

CrazyAX

Вот накидал примерчик, посмотри http://www.gamedev.ru/download/?id=7512

#10
3:20, 13 июля 2008

спасибо. очень помогло! =)

#11
19:28, 6 дек 2008

Чтобы узнать, пересекаются ли многоугольники, основанные на списке координат вершин, хорошо использовать метод усечения. Если один из многоугольников усечь полуплоскостями каждой из сторон второго, от него останется нечто. Если оно пустое - не пересекаются. Если оно не пустое, его полезно бывает использовать

Прошло более 12 месяцев
#12
13:42, 5 дек 2009

Перезалейте кто-нибудь, плиззз...

Прошло более 1 года
#13
9:19, 24 ноя 2011

Господа, остались у кого нибудь классы из этого топика, перезалейте пожалуйста. Некрофилы такие некрофилы. Хочется глянуть реализацию, в поисках идеального кода понимаете-ли.

Прошло более 1 года
#14
3:55, 26 мая 2013

у меня что он не работает с не выпуклым спрайтом!?

Haaf's Game EngineФорум

Тема в архиве.