Úvod HTML CSS PHP MySQL JavaScript
kolize2d

Kolize obdelníku s bodem

obdelník.Contains(bod)

např. kolize obdelníka s myší:
       
 if (new Rectangle(pozice.X,pozice.Y,width,Height).Contains(new Point(mys.X, mys.Y)))
       

Kolize obdelníku s obdelníkem

obdelník.Contains(obdelník)

kolize obdelníka s obdelníkem pomocí Contains jeden obdelník musí být uvnitř druhého :
       
 if (new Rectangle(pozice.X,pozice.Y,width,Height).Contains(new Rectangle(pozice.X,pozice.Y,width,Height)))
       

Kolize obdelníku s obdelníkem

obdelník.Intersects(obdelník)

kolize dvou obdelníků při doteku :
       
 if (new Rectangle(pozice.X,pozice.Y,width,Height).Intersects(new Rectangle(pozice.X1,pozice.Y1,width1,Height1))
       

Kolize dvou kruhů

Vector2.Distance(střed1,střed2) < poloměr1 + poloměr2

 if (Vector2.Distance(kruh1, kruh2) > ball1.Width / 2 + ball2.Width / 2)
            {
                kruh1.X += 5;
                kruh2.X -= 5;
            }         
         

Kolize obdelníku a kruhu

najít nejbližší bod od středu kruhu k obdelníku
Vector2 nejbližšíBod = Vector2.Clamp(středKruhu,levýHorníRohObdelníku,pravýDolníRohObdelníku)

Vector2.Distance(středKruhu,nejbližšíBod) < kruh.Width / 2

  stred.X += kruh.Width / 2;
  stred.Y += kruh.Height / 2;
  Vector2 nejblizsiBod = Vector2.Clamp(stred, new Vector2(retCtverec.X, retCtverec.Y), new Vector2(retCtverec.X + retCtverec.Width, retCtverec.Y + retCtverec.Height));
            if (Vector2.Distance(nejblizsiBod, stred) > kruh.Width / 2)//kruh.Width / 2  je poloměr kruhu                            
            {
                kruh.X -= 5;
            }     
         
         

Kolize pootočeného obdelníku a kruhu

Vytvoří nepootočený obdelník s bodem otáčení na pozici 0,0 a trasformuje k němu kruh (rotaci a pozici) pro použití jako v předchozím příkladu.
  public bool kolizeKruhObdelnik(Vector2 stredKruhu, float polomer)
        {
            Vector2 min = -bodOtaceniObdelníku * scale;
        
            Vector2 max = min + new Vector2(obdelnik.Width,obdelnik.Height) * scale;

            Matrix rotace = Matrix.CreateRotationZ(-otoceniObdelnika);
            Matrix transformace = Matrix.CreateTranslation(new Vector3(-obdelnikPoz, 0f));

            Vector2 novyStred = Vector2.Transform(stredKruhu, transformace * rotace);
            Vector2 nejblizsiBod = Vector2.Clamp(novyStred, min, max);

            return Vector2.Distance(novyStred, nejblizsiBod) <= polomer;
        }    
                 
                 
                 

Pokud je u kruhu použito vykreslení
spriteBatch.Draw(textura, pozice, null, Color.White, rotation, střed otáčení, scale, SpriteEffects.None, 0)
a střed otáčení je ve středu textury je střed kruhu u kolizi roven pozici kruhu a poloměr se dá násobit scalem.

pravy Ascii tabulka
Barvy
Klávesové zkratky


©2013-2021 Trojklik.8u.cz Autor: Vašek D.