[C#]計算兩物件連接線之邊緣點...

  • 2226
  • 0

摘要:[C#]計算兩物件連接線之邊緣點...

(這個標題會有人看得懂嗎)

如上圖...如果只是要畫A點至B點的連接線,那非常簡單,給兩個中心point就解決了,但如果今天如圖範例是有箭頭的線呢?不可能還是用中心點吧!箭頭會被蓋掉,更不可能線蓋圖吧~

So...其實這只是一個數學問題而以,小弟我...以前..以學長自稱時,叫個無辜數學系學弟來解決(數學系的真好用),Code如下...

private Point calpoint(FrameworkElement objs, FrameworkElement objt)
{
    Point pd = new Point(Canvas.GetLeft(objt) + objt.Width / 2, Canvas.GetTop(objt) + objt.Height / 2);
    Point ps = new Point( Canvas.GetLeft(objs) + objs.Width / 2, Canvas.GetTop(objs) + objs.Height / 2);
    Point p1 = new Point();
    Point p2 = new Point();

    double m = (double)(pd.Y - ps.Y) / (pd.X - ps.X);
    double d1, d2;
    double x1 = 0, x2 = 0, y1 = 0, y2 = 0;


    if (ps.X == pd.X)
    {
        if (ps.Y > pd.Y)
            return new Point(pd.X, Canvas.GetTop(objt) + objt.Height);
        else
            return new Point(pd.X, Canvas.GetTop(objt));
    }
    else if (ps.Y == pd.Y)
    {
        if (ps.X > pd.X)
            return new Point(Canvas.GetLeft(objt) + objt.Width, pd.Y);
        else
            return new Point(Canvas.GetLeft(objt), pd.Y);
    }
    else if (ps.X <= pd.X && ps.Y <= pd.Y)
    {
        x1 = pd.X - objt.Width / 2;
        y1 = pd.Y - (objt.Width / 2) * m;
        if (m != 0)
            x2 = pd.X - objt.Height / (2 * m);
        else
            x2 = pd.X;
        y2 = pd.Y - objt.Height / 2;

    }
    else if (ps.X >= pd.X && ps.Y <= pd.Y)
    {
        x1 = pd.X + objt.Width / 2;
        y1 = pd.Y + (objt.Width / 2) * m;
        if (m != 0)
            x2 = pd.X - objt.Height / (2 * m);
        else
            x2 = pd.X;
        y2 = pd.Y - objt.Height / 2;
    }
    else if (ps.X >= pd.X && ps.Y >= pd.Y)
    {
        x1 = pd.X + objt.Width / 2;
        y1 = pd.Y + (objt.Width / 2) * m;
        if (m != 0)
            x2 = pd.X + objt.Height / (2 * m);
        else
            x2 = pd.X;
        y2 = pd.Y + objt.Height / 2;
    }
    else if (ps.X <= pd.X && ps.Y >= pd.Y)
    {
        x1 = pd.X - objt.Width / 2;
        y1 = pd.Y - (objt.Width / 2) * m;
        if (m != 0)
            x2 = pd.X + objt.Height / (2 * m);
        else
            x2 = pd.X;
        y2 = pd.Y + objt.Height / 2;
    }

    p1.X = x1;
    p1.Y = y1;
    p2.X = x2;
    p2.Y = y2;

    d1 = (p1.X - pd.X) * (p1.X - pd.X) + (p1.Y - pd.Y) * (p1.Y - pd.Y);
    d2 = (p2.X - pd.X) * (p2.X - pd.X) + (p2.Y - pd.Y) * (p2.Y - pd.Y);
    if (d1 > d2)
        return p2;
    else
        return p1;
}

其實這個code不限定在silverlight用,只要是個userControl或是啥圖形物件(自己轉一下型別)的,只要傳入source物件與target物件,此function就會回傳target的邊緣點(矩型的)

有需要的就拿去用吧~