#82: ___問


sa411022 (sa411022)


請問這題的範例第一個為什麼是true

秒數允許小數嗎?

#86: Re:問


looser (looser)


請問這題的範例第一個為什麼是true

秒數允許小數嗎?



秒數是整數...第一個會true表示子彈打到玩家  0 3 0 -2 這個子彈會打到玩加 因為2秒後將從(0,3)移到(0,-1).
#2671: Re:問


xatier (一串電研的阿飄先生)


請問這題的範例第一個為什麼是true

秒數允許小數嗎?


我也因為這樣算錯了...

所以我後來就不管秒數

只用" 點和線 的關係來判斷" 就AC了~

#2672: Re:問


xatier (一串電研的阿飄先生)


請問這題的範例第一個為什麼是true

秒數允許小數嗎?


我也因為這樣算錯了...

所以我後來就不管秒數

只用" 點和線 的關係來判斷" 就AC了~


詳細的判斷式

            if (((y - py) * vx) ==  ((x - px) * vy)) {
                if (abs(x - px) <= abs(t * vx)) {
                    if (abs(y - py) <= abs(t * vy)) {
                        if(
                            (
                                ( dis(x, y, px, py) +
                                  dis(px, py, (x + t * vx), (y + t * vy))
                                ) - dis(0, 0, (t * vx), (t * vy))
                            ) <= TINY
                          ) {
                                hit  = 1;    //碰! 撞到了
                        }
                    }
                }
            }

 

說明如下:

/*
    斜率相同 在同一直線上
   
     y - py      vy
    -------  == -----
     x - px      vx

    避免除法,交叉相成
   
    ((y - py) * vx) ==  ((x - px) * vy)                ..................條件一

 
    子彈到人的dalta X  <= 子彈飛行 t 秒的dalta X
    abs(x - px) <= abs(t * vx)                        ..................條件二


    子彈到人的dalta Y  <= 子彈飛行 t 秒的dalta Y
    abs(y - py) <= abs(t * vy)                        ..................條件三
   

    終極手段
   
    (distance(起點, 人) + distance(人, 終點))    -----------(1)
   
    distance(起點, 終點)                        -----------(2)
   
    (1) == (2)
   
    修正浮點數誤差
   
    (1) - (2) <= TINY                                 ..................條件四

*/

 

#2673: Re:問


xatier (一串電研的阿飄先生)


請問這題的範例第一個為什麼是true

秒數允許小數嗎?


我也因為這樣算錯了...

所以我後來就不管秒數

只用" 點和線 的關係來判斷" 就AC了~


詳細的判斷式

            if (((y - py) * vx) ==  ((x - px) * vy)) {
                if (abs(x - px) <= abs(t * vx)) {
                    if (abs(y - py) <= abs(t * vy)) {
                        if(
                            (
                                ( dis(x, y, px, py) +
                                  dis(px, py, (x + t * vx), (y + t * vy))
                                ) - dis(0, 0, (t * vx), (t * vy))
                            ) <= TINY
                          ) {
                                hit  = 1;    //碰! 撞到了
                        }
                    }
                }
            }

 

說明如下:

/*
    斜率相同 在同一直線上
   
     y - py      vy
    -------  == -----
     x - px      vx

    避免除法,交叉相成
   
    ((y - py) * vx) ==  ((x - px) * vy)                ..................條件一

 
    子彈到人的dalta X  <= 子彈飛行 t 秒的dalta X
    abs(x - px) <= abs(t * vx)                        ..................條件二


    子彈到人的dalta Y  <= 子彈飛行 t 秒的dalta Y
    abs(y - py) <= abs(t * vy)                        ..................條件三
   

    終極手段
   
    (distance(起點, 人) + distance(人, 終點))    -----------(1)
   
    distance(起點, 終點)                        -----------(2)
   
    (1) == (2)
   
    修正浮點數誤差
   
    (1) - (2) <= TINY                                 ..................條件四

*/

 

#2674: Re:問


xatier (一串電研的阿飄先生)


請問這題的範例第一個為什麼是true

秒數允許小數嗎?


我也因為這樣算錯了...

所以我後來就不管秒數

只用" 點和線 的關係來判斷" 就AC了~


#7164: Re:問


jimmyee (LEVEL_UP)


這題並不是什麼浮點數誤差喔

 題目本來就有說一定是整數

不過這題按照上面提供的解法會出現錯誤的原因是:

當子彈方向和人與子彈在反方向時就會GG

所以再加個判斷方向的條件即可