Haaf's Game Engine Community
GameDev.ru / Сообщества / Haaf's Game Engine / Форум / Класс проверки пересечений многоугольников в 2D (комментарии)

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

VitorioПостоялецwww26 фев. 200810:06#0
Класс проверки пересечений многоугольников в 2D (комментарии)

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

progmanПостоялецwww26 фев. 200810:06#1
на иллюстрации пример с прямоугольниками.

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

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

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

CrazyAXПостоялецwww9 июля 20083:11#3
этот модуль имеет какие-то общие схожие переменные со стандартным спрайтом, которые можно приравнять вместо ручного присваивания?
VitorioПостоялецwww9 июля 20085:26#4
CrazyAX
Схожих переменных не имеет. Чтобы строить вершины многоугольника необходимо трассировать контур спрайта, а это уже непростая задача.:)
__SaM__Постоялецwww9 июля 200812:26#5
Vitorio
Ну не такая уж и сложная задача:)
CrazyAXПостоялецwww11 июля 20080:51#6
задам наверно вопрос на примере:

допустим, упрощая - что машины - квадраты, тогда
//---------------------------------------------------------------------------
всё подключил
........
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();

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

CrazyAXПостоялецwww11 июля 20081:03#7
Виторио (Виктор Кондратенко)
я не сдирал - пытался адаптировал под свою среду твой класс описания столкновений и использовал функции использованные в примере к классу. всё что я использовал из твоих наработок я привел в примере выше. я начинающий, но классы читать и использовать умею. с ооп знаком.
CrazyAXПостоялецwww11 июля 20081:25#8
а вот так с обыкновенной стандартной квадратной проверкой работает 

....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));

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

VitorioПостоялецwww11 июля 20086:02#9
CrazyAX

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

CrazyAXПостоялецwww13 июля 20083:20#10
спасибо. очень помогло! =)
Polly5315Постоялецwww6 дек. 200819:28#11
Чтобы узнать, пересекаются ли многоугольники, основанные на списке координат вершин, хорошо использовать метод усечения. Если один из многоугольников усечь полуплоскостями каждой из сторон второго, от него останется нечто. Если оно пустое - не пересекаются. Если оно не пустое, его полезно бывает использовать
SiNn3RПостоялецwww5 дек. 200913:42#12
Перезалейте кто-нибудь, плиззз...
Andron_GamerНовичокwww24 ноя. 20119:19#13
Господа, остались у кого нибудь классы из этого топика, перезалейте пожалуйста. Некрофилы такие некрофилы. Хочется глянуть реализацию, в поисках идеального кода понимаете-ли.
werasaimonПостоялецwww26 мая 20133:55#14
у меня что он не работает с не выпуклым спрайтом!?

/ Форум / HGE: Haaf's Game Engine

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

2001—2018 © GameDev.ru — Разработка игр