碰撞檢測新思路

最近做一個彈珠游戲菠发,核心就是碰撞檢測,網(wǎng)上也看了一些資料贺嫂,無奈悟性太低滓鸠,理解不了什么投影法等,靜下心來第喳,自己也琢磨了一個思路糜俗。

游戲的場景是這樣:在一個平面上有一個矩形框,框內有一個圓形彈珠曲饱,還有任意多邊形悠抹,如圖
1.png

要檢測一個多邊形與該小球是否碰撞,我的思路是:

  1. 對于多邊形每一條邊扩淀,通過小球的圓心做垂直線楔敌,如果垂直線的長度小于或等于小球的半徑則認為小球與該邊碰撞
  2. 對于多邊形每一個頂點,與小球的圓心的距離小于或等于小球的半徑則認為小球與該邊碰撞
    邊界的碰撞檢測是非常簡單的驻谆,判斷小球的左右上下是否等于邊框的或左或右或上或下

下面細說代碼

  1. 通過圓心求任意直線的垂直線的交點
public static Point getVerticalPoint(Point o, Point a, Point b) {
        double a1 = a.x;
        double b1 = a.y;
        double a2 = b.x;
        double b2 = b.y;

        System.out.println("線段從(" + a1 + "," + b1 + ")至(" + a2 + "," + b2 + ")");
//        double k = (b2 - b1) / (a2 - a1);
//        System.out.println("線段的斜率k=" + k);
        double c1 = o.x;
        double d1 = o.y;
        System.out.print("則從點(" + c1 + "," + d1 + ")引該線段的垂直線卵凑,其垂直點為:");
        double c2, d2;
        //特殊情況1,a.x==b.x
        if (a1 == a2) {
            c2 = a1;
            d2 = d1;
        }
        //特殊情況2胜臊,a.y==b.y
        else if (b1 == b2) {
            c2 = c1;
            d2 = b1;
        } else {
            d2 = (b1 * (a2 - a1) * (a2 - a1) + d1 * (b2 - b1) * (b2 - b1) + (c1 - a1) * (a2 - a1) * (b2 - b1))
                    / ((b2 - b1) * (b2 - b1) + (a2 - a1) * (a2 - a1));
            c2 = (c1 * (a2 - a1) - (b2 - b1) * (d2 - d1)) / (a2 - a1);
        }
        System.out.println("(" + c2 + ", " + d2 + ")");
        return new Point((int) c2, (int) d2);
    }
  1. 已知交點勺卢,求交點是否在該線段上
 /**
     * 已知t在a與b確定的直線上
     * 檢測t點是否在a與b組成的線段上
     *
     * @param t 監(jiān)測目標
     * @param a 點a
     * @param b 點b
     * @return true如果t在點a和點b組成的線段上
     */
    public static boolean isInSegment(Point t, Point a, Point b) {
        return (t.x > a.x && t.x < b.x || t.x < a.x && t.x > b.x)
                && (t.y > a.y && t.y < b.y || t.y < a.y && t.y < b.y);
    }

3.再求兩點之間的距離

public static int getDistance(Point a, Point b) {
        return (int) Math.sqrt((b.y - a.y) * (b.y - a.y) + (b.x - a.x) * (b.x - a.x));
    }

4.判斷一個多邊形是否與小球碰撞,以三角形為例区端,代碼中Block是阻礙物的抽象接口

public class Triangle implements Block {
    private final Point a;
    private final Point b;
    private final Point c;

    public Triangle(Point a, Point b, Point c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    @Override
    public boolean isImpact(Ball ball) {
        Point o = ball.getCenterPoint();
        Point t = GeometryUtil.getVerticalPoint(o, a, b);
        if (GeometryUtil.isInSegment(t, a, b)) {
            if (GeometryUtil.getDistance(t, o) <= (int) ball.getRadio()) {
                return true;
            }
        }
        t = GeometryUtil.getVerticalPoint(o, a, c);
        if (GeometryUtil.isInSegment(t, a, c)) {
            if (GeometryUtil.getDistance(t, o) <= (int) ball.getRadio()) {
                return true;
            }
        }
        t = GeometryUtil.getVerticalPoint(o, b, c);
        if (GeometryUtil.isInSegment(t, b, c)) {
            if (GeometryUtil.getDistance(t, o) <= (int) ball.getRadio()) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void location(int left, int top) {
        a.offset(left, top);
        b.offset(left, top);
        c.offset(left, top);
    }

    @Override
    public void draw(Canvas canvas, Paint paint) {
        canvas.drawLines(new float[]{a.x, a.y, b.x, b.y, a.x, a.y, c.x, c.y, b.x, b.y, c.x, c.y}, paint);
    }
}

不對之處值漫,請大家指正!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末织盼,一起剝皮案震驚了整個濱河市杨何,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沥邻,老刑警劉巖危虱,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異唐全,居然都是意外死亡埃跷,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門邮利,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弥雹,“玉大人,你說我怎么就攤上這事延届〖粑穑” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵方庭,是天一觀的道長厕吉。 經(jīng)常有香客問我酱固,道長,這世上最難降的妖魔是什么头朱? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任运悲,我火速辦了婚禮,結果婚禮上项钮,老公的妹妹穿的比我還像新娘班眯。我一直安慰自己,他們只是感情好烁巫,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布鳖敷。 她就那樣靜靜地躺著,像睡著了一般程拭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棍潘,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天恃鞋,我揣著相機與錄音,去河邊找鬼亦歉。 笑死恤浪,一個胖子當著我的面吹牛,可吹牛的內容都是我干的肴楷。 我是一名探鬼主播水由,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赛蔫!你這毒婦竟也來了砂客?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤呵恢,失蹤者是張志新(化名)和其女友劉穎鞠值,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渗钉,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡彤恶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鳄橘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片声离。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瘫怜,靈堂內的尸體忽然破棺而出术徊,到底是詐尸還是另有隱情,我是刑警寧澤宝磨,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布弧关,位于F島的核電站盅安,受9級特大地震影響,放射性物質發(fā)生泄漏世囊。R本人自食惡果不足惜别瞭,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望株憾。 院中可真熱鬧蝙寨,春花似錦、人聲如沸嗤瞎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贝奇。三九已至虹菲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掉瞳,已是汗流浹背毕源。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留陕习,地道東北人霎褐。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像该镣,于是被迫代替她去往敵國和親冻璃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容

  • 基于學生學習共同體培育語文生態(tài)課堂文化的研究 近年來损合,隨著現(xiàn)代教育理念的不斷深入與...
    火車頭123閱讀 1,976評論 0 8
  • 1省艳、一元一次方程根的情況 △=b2-4ac 當△>0時,一元二次方程有2個不相等的實數(shù)根嫁审; 當△=0時拍埠,一元二次方...
    abbatuu閱讀 3,717評論 1 21
  • 身在傳說中別人家的公司,幸福感爆棚土居。在大風中結束了丁酉年最后一個工作日枣购,明天開始正式進入假期模式,先睡個自然醒擦耀,然...
    依諾2008閱讀 132評論 0 0
  • 4:20自然醒來眷蜓,洗漱后分瘾,燒開水備用,煮紅薯然后貞爸蹲著30分鐘讀經(jīng)典《易經(jīng)》55豐卦~59渙卦吁系;《黃帝內經(jīng)》玉版...
    育心經(jīng)典包志剛閱讀 555評論 0 3
  • 如果余生是你,那么我希望余生快點到來 有一天讀到英國傳記作家概括最理想的婚姻:“我見到她之前上岗,從未想到要結婚福荸;我娶...
    陳麗燕閱讀 1,308評論 0 2