Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma
Ú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.