Класс проверки пересечений многоугольников в 2D (комментарии)
Это сообщение сгенерировано автоматически.
на иллюстрации пример с прямоугольниками.
как класс работает с ПРОИЗВОЛЬНЫМИ многоугольниками?
будет ли успешно выполняться проверка пересечения произвольного, в том числе и невыпуклого многоугольника и прямоугольника?
>как класс работает с ПРОИЗВОЛЬНЫМИ многоугольниками?
Произвольный многоугольник формируется при помощи функции AddVertice, при помощи которой задаются все вершины многоугольника (задавать необходимо по часовой стрелке).
>будет ли успешно выполняться проверка пересечения произвольного, в том числе и невыпуклого многоугольника и прямоугольника?
да, реализованный алгоритм успешно обрабатывает невыпуклые многоугольники.
этот модуль имеет какие-то общие схожие переменные со стандартным спрайтом, которые можно приравнять вместо ручного присваивания?
CrazyAX
Схожих переменных не имеет. Чтобы строить вершины многоугольника необходимо трассировать контур спрайта, а это уже непростая задача.:)
Vitorio
Ну не такая уж и сложная задача:)
задам наверно вопрос на примере:
допустим, упрощая - что машины - квадраты, тогда
//---------------------------------------------------------------------------
всё подключил
........
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();
вопрос - почему не выводятся ни квадраты машин, ни фон не изменяется на фиолетовый (-а текстуры и спрайты видно, что накладываются-) ?? что я не правильно делаю
Виторио (Виктор Кондратенко)
я не сдирал - пытался адаптировал под свою среду твой класс описания столкновений и использовал функции использованные в примере к классу. всё что я использовал из твоих наработок я привел в примере выше. я начинающий, но классы читать и использовать умею. с ооп знаком.
а вот так с обыкновенной стандартной квадратной проверкой работает
....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));
но я хочу использовать твою проверку. в чем же там дело ? не разбурусь никак. помоги плиз
CrazyAX
Вот накидал примерчик, посмотри http://www.gamedev.ru/download/?id=7512
спасибо. очень помогло! =)
Чтобы узнать, пересекаются ли многоугольники, основанные на списке координат вершин, хорошо использовать метод усечения. Если один из многоугольников усечь полуплоскостями каждой из сторон второго, от него останется нечто. Если оно пустое - не пересекаются. Если оно не пустое, его полезно бывает использовать
Перезалейте кто-нибудь, плиззз...
Господа, остались у кого нибудь классы из этого топика, перезалейте пожалуйста. Некрофилы такие некрофилы. Хочется глянуть реализацию, в поисках идеального кода понимаете-ли.
у меня что он не работает с не выпуклым спрайтом!?
Тема в архиве.
Онлайн-казино Слотокинг с бонусами Онлайн-казино Слотокинг с бонусами obzor365.com |