SORU
2 Temmuz 2009, PERŞEMBE


Hat kesimi çarpışma algılama algoritması Daire?

A noktasından B noktasına bir çizgi ve bir daire C yarıçap R ile konumlandırılmış

Image

Çizgi çemberi kestiği olup olmadığını kontrol etmek için kullanmak için iyi bir algoritma nedir? Ve çember kenarı koordinat boyunca ne oldu?

CEVAP
5 Temmuz 2009, Pazar


Alıyor

  1. Eışının başlangıç noktası
  2. Lsonunda ray, nokta
  3. Colup kürenin merkezi karşı deniyorsun
  4. rbu kürenin yarıçapı

Hesaplamak:
d= L - E ( sonuna kadar baştan ışını Yönü vektör )
f= E - C ( ray başlatmak için merkezi küre Vektör )

Sonra kavşak.. tarafından bulundu
Takmak:
P = E t * d
Bu parametrik bir denklem
Px= Extdx
Py= Eytdy
içine
(x - y)2(y - k)2r . = ^sup>2
= dairenin merkezi (h,k).

2D burada sorun basitleştirdik, çözüm 3D de geçerlidir . not:

almak için:

  1. Genişletin
    x2- 2xh h2y2- 2yk k2- r2= 0
  2. Tak
    x = extdx
    = e yytdy
    ( extdx)2- 2( extdxh. h2 ( eytdy)2- 2( eytdyk )k)2- r2= 0
  3. Patlayabilir
    ex22extdxt2dx2- 2exh - 2tdxh h2 ey22eytdyt2dy2- 2eyk - 2tdyk k2- r2= 0
  4. Grup
    t2( dx2dy2) 2t( exdxeydy- dxh - dyk ) ex2ey2- 2exh - 2eyk h2k2- r2= 0
  5. Son olarak
    t2( _d * _d ) 2t( _e * _d - _d * _c ) _e * _e - 2( _e*_c ) _c * _c - r2= 0
    _d vektörü d ve * bulunduğu nokta ürünü*. *
  6. Ve sonra,
    t2( _d * _d ) ( _d * ( _e - _c ) ) ( _e - _c ) 2t * ( _e - _c ) - r2= 0
  7. _f = _e - _c izin
    t2( _d * _d ) 2t( _d * _f ) _f * _f - r2= 0

Böylece:
t2* (d NOKTA d) 2t*( f NOKTA d ) ( f NOKTA f - r2) = 0
Yani ikinci dereceden denklem çözme:

float a = d.Dot( d ) ;
float b = 2*f.Dot( d ) ;
float c = f.Dot( f ) - r*r ;

float discriminant = b*b-4*a*c;
if( discriminant < 0 )
{
  // no intersection
}
else
{
  // ray didn't totally miss sphere,
  // so there is a solution to
  // the equation.

  discriminant = sqrt( discriminant );

  // either solution may be on or off the ray so need to test both
  // t1 is always the smaller value, because BOTH discriminant and
  // a are nonnegative.
  float t1 = (-b - discriminant)/(2*a);
  float t2 = (-b   discriminant)/(2*a);

  // 3x HIT cases:
  //          -o->             --|-->  |            |  --|->
  // Impale(t1 hit,t2 hit), Poke(t1 hit,t2>1), ExitWound(t1<0, t2 hit), 

  // 3x MISS cases:
  //       ->  o                     o ->              | -> |
  // FallShort (t1>1,t2>1), Past (t1<0,t2<0), CompletelyInside(t1<0, t2>1)

  if( t1 >= 0 && t1 <= 1 )
  {
    // t1 is the intersection, and it's closer than t2
    // (since t1 uses -b - discriminant)
    // Impale, Poke
    return true ;
  }

  // here t1 didn't intersect so we are either started
  // inside the sphere or completely past it
  if( t2 >= 0 && t2 <= 1 )
  {
    // ExitWound
    return true ;
  }

  // no intn: FallShort, Past, CompletelyInside
  return false ;
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • alexis gillis

    alexis gilli

    23 HAZİRAN 2011
  • DJAndrewRyan

    DJAndrewRyan

    22 Ocak 2007
  • ParryGripp

    ParryGripp

    12 AĞUSTOS 2006