全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3072
推到 Plurk!
推到 Facebook!

計算點到直線的距離

尚未結案
小蟲蟲
一般會員


發表:38
回覆:55
積分:23
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-07-28 12:20:59 IP:61.219.xxx.xxx 未訂閱
請教前輩: 我在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-07-28 14:34:36 IP:211.76.xxx.xxx 未訂閱
小蟲蟲 您好:    求法概述如下:(因畫圖不易所以從略) 這可以看成是一個具有條件邊界的極值求解問題。 首先寫出通過 > 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-07-30 09:32:45 IP:61.219.xxx.xxx 未訂閱
引言: 如果您對求解的推導有興趣,我再post上來。
實在感激不盡。如有可能,我想了解一下推導的過程。 或是使用到的公式。 感恩囉。
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-07-30 13:45:09 IP:211.76.xxx.xxx 未訂閱
小蟲蟲 您好:    推導過程請看下列連結: http://delphi.ktop.com.tw/loadfile.php?TOPICID=16895753&CC=377867
系統時間:2024-06-26 23:58:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!