計算點到直線的距離 |
尚未結案
|
小蟲蟲
一般會員 發表:38 回覆:55 積分:23 註冊:2002-03-13 發送簡訊給我 |
請教前輩:
我在TImage上劃一條線,並記錄這條線的啟點與終點。之後,我需要當Mouse down在Timage時,找到mousedown的點離這條線有多遠(最短距離)。我找了一下,是有這公式: 點 P(m, n)到線 y = kx b,的距離為:abs(km - n b) / sqrt(k*k 1)
不幸的,這公式有點點小問題。就是這公式是量『線(不論線有多長,只要符合y = kx b就算是了)』到點的距離。我現要只要從啟點到終點這條線段,與點的距離。若點P在端點外(即,過P點作垂直線與線段無相交),則從端點計算點到點的距離。 由於我離國中已經很久遠了,一些公式全忘光了,不曉得有沒有前輩清楚該如何計算?
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
小蟲蟲 您好: 求法概述如下:(因畫圖不易所以從略) 這可以看成是一個具有條件邊界的極值求解問題。
首先寫出通過 > class="code">
//---------------------------------------------------------------------------
float minDistance(int x1, int y1, int x2, int y2, int xp, int yp)
{ float t, x, y; t = ( (float)(x1-x2)*(x1-xp) (y1-y2)*(y1-yp) ) / ( (float)(x1-x2)*(x1-x2) (y1-y2)*(y1-y2) );
if ( t>1 )
t=1.0;
else if ( t<0 )
t = 0.0;
x = x1 t*(x2-x1);
y = y1 t*(y2-y1);
return ( sqrt( (x-xp)*(x-xp) (y-yp)*(y-yp) ) );
} void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->Canvas->MoveTo(200, 200);
Form1->Canvas->LineTo(300, 200);
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
float dist = minDistance(200,200,300,200,X,Y);
Form1->Refresh();
Form1->Canvas->MoveTo(200, 200);
Form1->Canvas->LineTo(300, 200);
Form1->Canvas->Brush->Style = bsClear;
Form1->Canvas->Ellipse(X-dist,Y-dist,X dist,Y dist);
}
//--------------------------------------------------------------------------- Delphi Code
//--------------------------------------------------------------------------- function minDistance(x1, y1, x2, y2, xp, yp : integer): single; var t, x, y : single; begin t := ( (x1-x2)*(x1-xp) (y1-y2)*(y1-yp) ) / ( (x1-x2)*(x1-x2) (y1-y2)*(y1-y2) ); if ( t>1 ) then t:=1.0 else if ( t<0 ) then t := 0.0; x := x1 t*(x2-x1); y := y1 t*(y2-y1); result := sqrt( (x-xp)*(x-xp) (y-yp)*(y-yp) ); end; procedure TForm1.Button1Click(Sender: TObject); begin Form1.Canvas.MoveTo(200, 200); Form1.Canvas.LineTo(300, 200); end; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var dist : single; begin dist := minDistance(200,200,300,200,X,Y); Form1.Refresh(); Form1.Canvas.MoveTo(200, 200); Form1.Canvas.LineTo(300, 200); Form1.Canvas.Brush.Style := bsClear; Form1.Canvas.Ellipse(round(X-dist), round(Y-dist), round(X dist), round(Y dist)); end;RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### 發表人 - richtop 於 2004/07/28 14:42:32 發表人 - richtop 於 2004/07/28 14:45:09 發表人 - richtop 於 2004/07/28 23:03:55 |
小蟲蟲
一般會員 發表:38 回覆:55 積分:23 註冊:2002-03-13 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
小蟲蟲 您好: 推導過程請看下列連結:
http://delphi.ktop.com.tw/loadfile.php?TOPICID=16895753&CC=377867
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |