摘要:[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的邊緣點(矩型的)
有需要的就拿去用吧~