Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Jester01

    veterán

    válasz shev7 #919 üzenetére

    Szerintem viszont nem ennyire egyszerû.
    Azt kell megvizsgálni, hogy a labda (a körvonal) érintkezik-e az ütõvel.
    Ha csak vízszintesen mozoghatna, akkor lehetne shev7 megoldását alkalmazni, annyi kiegészítéssel, hogy (x-r-1 = xl) or (x+r+1 =xl) kell.
    Favágó módszer, de elsõ közelítésnek ez talán jó:

    var
    nx, cy, r2: Integer;
    tmp: longint;
    hit: boolean;

    ...

    r:=10;
    r2:=sqr(r+1);

    ...

    hit := false;
    if jobbra then nx := x + 1 else nx := x - 1;
    tmp := r2 - sqr(xl - nx);
    if tmp > 0 then begin
    cy := yl;
    while not hit and (cy <= zl) do begin
    hit := sqr(cy - y) < tmp;
    Inc(cy);
    end;
    if hit then jobbra := not jobbra;
    end;

    if not hit then begin
    if jobbra then inc(x) else dec(x);
    if le then inc(y) else dec(y);
    end;


    Ez megnézi, hogy a következõ iteráció során lenne-e olyan pontja az ütõnek ami közelebb lenne a labda közeppontjához annak sugaránál, és ha igen, akkor megfordítja az x irányú sebességvektort, de nem lép. Nem kezeli viszont ha a labda az ütõ alját vagy tetejét éri.

    Egyébként javaslom, hogy a jobbra és le változók helyett ténylegesen sebességvektort használj, átláthatóbb lesz.

Új hozzászólás Aktív témák