1 幾何學中用到的一些方法

1.點到直線的距離

    /// <summary>
    /// 某個點到線段上的距離
    /// </summary>
    /// <param name="point"></param>
    /// <param name="linePointA"></param>
    /// <param name="linePointB"></param>
    /// <returns></returns>
    public static double DisPoint2Line(Vector2 point, Vector2 linePointA, Vector2 linePointB)
    {
        double dis = 0;
        if (linePointA.x == linePointB.x)
        {
            dis = Math.Abs(point.x - linePointA.x);
            return dis;
        }
        double lineK = (linePointB.y - linePointA.y) / (linePointB.x - linePointA.x);
        double lineC = (linePointB.x * linePointA.y - linePointA.x * linePointB.y) / (linePointB.x - linePointA.x);
        dis = Math.Abs(lineK * point.x - point.y + lineC) / (Math.Sqrt(lineK * lineK + 1));
        return dis;
    }

2.獲取點在直線上的垂直投影點

 /// <summary>
    /// 獲得某點在一個直線上的投影
    /// </summary>
    /// <param name="point"></param>
    /// <param name="linePoint1"></param>
    /// <param name="linePoint2"></param>
    /// <returns></returns>
    public static Vector3 GetProjectivePoint(Vector3 point, Vector3 linePoint1, Vector3 linePoint2)
    {
        Vector3 target;

        Vector3 lineDir = (linePoint2 - linePoint1).normalized;

        Vector3 projectiveDir = Quaternion.Euler(0, 90, 0) * lineDir;

        Vector3 point2 = point + projectiveDir;

        target = GetIntersectionByPoints(point, point2, linePoint1, linePoint2);

        return target;
    }

3.獲取兩直線交點

                                區(qū)分直線和線段
    /// <summary>
    /// 得到兩直線交點的方法
    /// </summary>
    /// <param name="lineFirstStart"> 第一條線的一個點 </param>
    /// <param name="lineFirstEnd"> 第一條線的另外一個點 </param>
    /// <param name="lineSecondStart"> 第二條線的一個點 </param>
    /// <param name="lineSecondEnd"> 第二條線的另外一個點 </param>
    /// <returns></returns>
    public static Vector3 GetIntersectionByPoints(Vector3 lineFirstStart, Vector3 lineFirstEnd, Vector3 lineSecondStart,
        Vector3 lineSecondEnd)
    {
        float y = lineFirstStart.y;
        double a = 0, b = 0;
        int state = 0;
        if (lineFirstStart.x != lineFirstEnd.x)
        {
            a = (lineFirstEnd.z - lineFirstStart.z) / (lineFirstEnd.x - lineFirstStart.x);
            state |= 1;
        }
        if (lineSecondStart.x != lineSecondEnd.x)
        {
            b = (lineSecondEnd.z - lineSecondStart.z) / (lineSecondEnd.x - lineSecondStart.x);
            state |= 2;
        }
        switch (state)
        {
            case 0:
                {
                    if (lineFirstStart.x == lineSecondStart.x)
                    {
                        return Vector3.zero;
                    }
                    else
                    {
                        return Vector3.zero;
                    }
                }
            case 1:
                {
                    double x = lineSecondStart.x;
                    double z = (lineFirstStart.x - x) * (-a) + lineFirstStart.z;
                    return new Vector3((float)x, y, (float)z);
                }
            case 2:
                {
                    double x = lineFirstStart.x;
                    double z = (lineSecondStart.x - x) * (-b) + lineSecondStart.z;
                    return new Vector3((float)x, y, (float)z);
                }
            case 3:
                {
                    if (Mathf.Abs((float)(a - b)) < 0.0001)
                    {
                        return Vector3.zero;
                    }
                    double x = (a * lineFirstStart.x - b * lineSecondStart.x - lineFirstStart.z + lineSecondStart.z) / (a - b);
                    double z = a * x - a * lineFirstStart.x + lineFirstStart.z;
                    return new Vector3((float)x, y, (float)z);
                }
        }
        return Vector3.zero;
    }

4.獲取線段與直線的交點

   public static Vector3? GetIntersectonBetweenLineAndSegment(Vector3 linePointA, Vector3 linePointB, Vector3 segmentPointA, Vector3 segmentPointB)
    {
        // 先求兩直線交點 再判斷交點是否在線段上
        Vector3? intersection = GetIntersectionByPoints(linePointA, linePointB, segmentPointA, segmentPointB);
        if (intersection != Vector3.zero)
        {
            //if (CheckPointInSegement(segmentPointA, segmentPointB, intersection.Value))
            //{
            //    Debug.Log(string.Format("segmentStart: {0} segmentEnd: {1} intersection:{2}", segmentPointA.ToString("f4"), segmentPointB.ToString("f4"), intersection.Value.ToString("f4")));
            //    return intersection;
            //}

            if (IsPointInsideSegment(new List<Vector2>() { segmentPointA.ToVector2XZ(), segmentPointB.ToVector2XZ() }, intersection.Value.ToVector2XZ()))
            {
                //Debug.Log(string.Format("segmentStart: {0} segmentEnd: {1} intersection:{2}", segmentPointA.ToString("f4"), segmentPointB.ToString("f4"), intersection.Value.ToString("f4")));
                return intersection;
            }
        }
        return null;
    }

5.點是否在線段上(含兩端點)

 public static bool IsPointInsideSegment(IEnumerable<Vector2> segment, Vector2 point)
    {
        // 線段頂點數(shù)目必須等于2
        if (segment.Count() != 2)
        {
            Debug.LogError(string.Format("Segment must have only 2 vertex, current segment have {0} vertex!", segment.Count()));
            return false;
        }

        if (Mathf.Approximately((point - segment.First()).magnitude + (point - segment.Last()).magnitude, (segment.First() - segment.Last()).magnitude))
            return true;
        else
            return false;
    }

6.檢測某個點是否在線段上

  public static bool CheckPointInSegement(Vector2 lineStart, Vector2 lineEnd, Vector2 point)
    {
        // 誤差范圍

        if (DisPoint2Line(point, lineStart, lineEnd) >= 0.002f)
        {
            return false;
        }

        Vector2 p2Start = (lineStart - point).normalized;
        Vector2 p2End = (lineEnd - point).normalized;

        if (Vector2.Dot(p2End, p2Start) <= 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
  1. 判斷兩線段是否相交
 //firstlineStart, firstlineEnd為一條線段兩端點 SecondlineStart, SecondlineEnd為另一條線段的兩端點 相交返回true, 不相交返回false  
    public static bool CheckTwoSegmentCrose(Vector2 firstlineStart, Vector2 firstlineEnd, Vector2 SecondlineStart, Vector2 SecondlineEnd)
    {
        if (max(firstlineStart.x, firstlineEnd.x) < min(SecondlineStart.x, SecondlineEnd.x))
        {
            return false;
        }
        if (max(firstlineStart.y, firstlineEnd.y) < min(SecondlineStart.y, SecondlineEnd.y))
        {
            return false;
        }
        if (max(SecondlineStart.x, SecondlineEnd.x) < min(firstlineStart.x, firstlineEnd.x))
        {
            return false;
        }
        if (max(SecondlineStart.y, SecondlineEnd.y) < min(firstlineStart.y, firstlineEnd.y))
        {
            return false;
        }
        if (mult(SecondlineStart, firstlineEnd, firstlineStart) * mult(firstlineEnd, SecondlineEnd, firstlineStart) < 0)
        {
            return false;
        }
        if (mult(firstlineStart, SecondlineEnd, SecondlineStart) * mult(SecondlineEnd, firstlineEnd, SecondlineStart) < 0)
        {
            return false;
        }
        return true;
    }

  1. 判斷兩個線段是否端點相連
// 判斷兩條線段是否相連
    public static bool CheckTwoSegmentSharePoint(Vector2 firstlineStart, Vector2 firstlineEnd, Vector2 SecondlineStart, Vector2 SecondlineEnd)
    {
        return firstlineStart == SecondlineStart || firstlineStart == SecondlineEnd || firstlineEnd == SecondlineStart || firstlineEnd == SecondlineEnd;
    }

9.判斷兩線段是否共線

    /// <summary>
    /// 判斷兩個線段是否共線
    /// </summary>
    /// <param name="firstWall"></param>
    /// <param name="secondWall"></param>
    /// <returns></returns>
    public static bool CheckTwoSegmentShareLine(Vector2 lineAStart, Vector2 lineAEnd, Vector2 lineBStart, Vector2 lineBEnd)
    {
        Vector2 firstWallDir = (lineAEnd - lineAStart).normalized;
        Vector2 secondWallDir = (lineBEnd - lineBStart).normalized;
        //Debug.Log(string.Format("aStart:{2] end:{3} bStart:{4} end:{5} firstWallDir:{0} secondWallDir:{1}",
        //    firstWallDir.ToString("f4"), secondWallDir.ToString("f4"), lineAStart.ToString("f4"), lineAEnd.ToString("f4"), lineBStart.ToString("f4"), lineBEnd.ToString("f4")));
        //if (DisPoint2Line(lineAStart, lineBStart, lineBEnd)>0.001f|| DisPoint2Line(lineAEnd, lineBStart, lineBEnd)>0.001f)
        //    return false;
        //// 沒有加檢測
        //return Vector3.Distance(firstWallDir, secondWallDir) < 0.001f || Vector3.Distance(firstWallDir, -secondWallDir) < 0.001f;

        return (CheckThreePointShareLine(lineAStart, lineAEnd, lineBStart)) && (CheckThreePointShareLine(lineAStart, lineAEnd, lineBEnd));
    }

10.判斷三點是否共線

   /// <summary>
    /// 判斷三點是否共線
    /// </summary>
    /// <param name="lineA"></param>
    /// <param name="lineB"></param>
    /// <param name="lineC"></param>
    /// <returns></returns>
    public static bool CheckThreePointShareLine(Vector2 lineA, Vector2 lineB, Vector2 lineC)
    {
        if (lineA != lineB && lineB != lineC && lineC != lineA)//這里修改了一下
        {
            Vector2 a2b = (lineB - lineA).normalized;
            Vector2 c2b = (lineB - lineC).normalized;

            //Debug.Log(a2b.ToString("f6") + "  " + c2b.ToString("f6"));

            return (a2b == c2b) || (a2b == -c2b);
        }
        else
        {
            return true;
        }
    }

11.判斷兩條線段是否共線且存在重疊

 /// <summary>
    /// 判斷兩條選段是否有重疊
    /// </summary>
    /// <param name="lineAStart"></param>
    /// <param name="lineAEnd"></param>
    /// <param name="lineBStart"></param>
    /// <param name="lineBEnd"></param>
    /// <returns></returns>
    public static bool CheckTwoSegmentOverlap(Vector2 lineAStart, Vector2 lineAEnd, Vector2 lineBStart, Vector2 lineBEnd)
    {
        if (CheckTwoSegmentShareLine(lineAStart, lineAEnd, lineBStart, lineBEnd))
        {
            //Debug.Log("ShareLine");
            Vector2 s2s = (lineBStart - lineAStart).normalized;
            Vector2 s2e = (lineBEnd - lineAStart).normalized;
            Vector2 e2s = (lineBStart - lineAEnd).normalized;
            Vector2 e2e = (lineBEnd - lineAEnd).normalized;

            if (s2s == s2e && s2e == e2s && e2s == e2e)
            {
                return false;
            }

            return true;
        }
        return false;
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市炮障,隨后出現(xiàn)的幾起案子衙傀,更是在濱河造成了極大的恐慌寥院,老刑警劉巖五嫂,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡帐姻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門奶段,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饥瓷,“玉大人,你說我怎么就攤上這事痹籍∧孛” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵蹲缠,是天一觀的道長棺克。 經(jīng)常有香客問我,道長线定,這世上最難降的妖魔是什么娜谊? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮斤讥,結(jié)果婚禮上纱皆,老公的妹妹穿的比我還像新娘。我一直安慰自己芭商,他們只是感情好抹剩,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蓉坎,像睡著了一般澳眷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛉艾,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天钳踊,我揣著相機與錄音衷敌,去河邊找鬼。 笑死拓瞪,一個胖子當著我的面吹牛缴罗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播祭埂,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼面氓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛆橡?” 一聲冷哼從身側(cè)響起舌界,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泰演,沒想到半個月后呻拌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡睦焕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年藐握,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垃喊。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡猾普,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出本谜,到底是詐尸還是另有隱情抬闷,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布耕突,位于F島的核電站笤成,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏眷茁。R本人自食惡果不足惜炕泳,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望上祈。 院中可真熱鬧培遵,春花似錦、人聲如沸登刺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纸俭。三九已至皇耗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揍很,已是汗流浹背郎楼。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工万伤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人呜袁。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓敌买,卻偏偏與公主長得像,于是被迫代替她去往敵國和親阶界。 傳聞我的和親對象是個殘疾皇子虹钮,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 今天開始2017第一次代購生涯,感恩信任我下單的顧客膘融! 年前的規(guī)劃想今年減少代購次數(shù)提高生活質(zhì)量芙粱,但是看著那么多顧...
    belivePossible閱讀 148評論 0 0
  • 么么噠
    婉林閱讀 193評論 0 0
  • 風想要帶走花瓣卻被拒絕了 記憶拿著放大鏡觀察著你的氣息 燦爛的陽光浪漫了歲月的溫情 期盼在門外遲遲不肯敲門我看到了...
    心花園子閱讀 229評論 0 3
  • 原文 【43.6】愛因未會先生知行合一之訓,與宗賢托启、惟賢往復辯論宅倒,未能決攘宙,以問于先生屯耸。先生曰:“試舉看”。愛曰:“...
    鴻圖大展閱讀 797評論 0 0