計算直線上距離某座標最近的一個投影點

計算直線上距離某座標最近的一個投影點

0x01 調用方式

        var p = GetProjectivePoint(new Point(0,0), new Point(300,300), new Point(100,150));
        Console.WriteLine(p);

0x02 源碼

        /// <summary>
        /// 計算直線上距離某座標最近的一個投影點
        /// </summary>
        /// <param name="P1">直線的座標1</param>
        /// <param name="P2">直線的座標2</param>
        /// <param name="pOut">直線外的座標</param>
        /// <returns></returns>
        protected Point GetProjectivePoint(Point P1, Point P2, Point pOut)
        {
            Point pLine = P1;
            if (P1.X == P2.X && P1.Y == P2.Y)
            {
                return P1;
            }
            if (P1.X == P2.X)
            {
                return new Point(pLine.X, pOut.Y);
            }
            else if (P1.Y == P2.Y) //垂線斜率不存在情況
            {
                return new Point(pOut.X, pLine.Y);
            }
            //計算線的斜率
            Double k = ((Double)(P1.Y - P2.Y)) / (P1.X - P2.X);
            var X = (float)((k * pLine.X + pOut.X / k + pOut.Y - pLine.Y) / (1 / k + k));
            var Y = (float)(-1 / k * (X - pOut.X) + pOut.Y);
            return new Point(X,Y);
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章