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

畫箭頭的問題

缺席
gemini07
一般會員


發表:29
回覆:18
積分:14
註冊:2003-04-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-29 11:59:44 IP:210.66.xxx.xxx 未訂閱
大家好,我現在在寫一個可以畫箭頭的函式 以下是我的函式內容,但是畫出來箭頭的方向都不是很正確 請問我這個函式要如何修正呢    //- p1, p2為構成箭頭線條的兩點 void __fastcall TForm1::DrawArrow( TCanvas* canvas, TPoint p1, TPoint p2 ) {     if( canvas == NULL )     return;        canvas->Pen->Color = clBlack;   canvas->Brush->Color = clBlack;   canvas->Brush->Style = bsSolid;      canvas->MoveTo( p1.x, p1.y );         canvas->LineTo( p2.x, p2.y );      //- 畫箭頭   double slope;   if( p2.x - p1.x == 0 )     slope = 1;   else     slope = double( p2.y - p1.y ) / ( p2.x - p1.x );      double angle = atan( slope ) * 180 / M_PI;          TPoint points[3];   points[0] = Point( p2.x, p2.y );      points[1] = Point( p2.x + (int)( (20)*cos(angle) - (5)*sin(angle) ),                      p2.y + (int)( (20)*sin(angle) + (5)*cos(angle) ) );         points[2] = Point( p2.x + (int)( (20)*cos(angle) - (-5)*sin(angle) ),                      p2.y + (int)( (20)*sin(angle) + (-5)*cos(angle) ) );                canvas->Polygon( points, 2 ); }    
sew
一般會員


發表:2
回覆:54
積分:21
註冊:2003-08-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-29 12:32:57 IP:220.130.xxx.xxx 未訂閱
有沒有試過把 slope = double( p2.y - p1.y ) / ( p2.x - p1.x ); 改成 slope = double( p2.x - p1.x ) / ( p2.y - p1.y ); 你的問題應該是角度沒對應到 加油!
------
加油!
gemini07
一般會員


發表:29
回覆:18
積分:14
註冊:2003-04-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-29 13:01:04 IP:210.66.xxx.xxx 未訂閱
sew你好, 我試過你的方法,還是會有一樣的問題耶
sew
一般會員


發表:2
回覆:54
積分:21
註冊:2003-08-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-29 13:40:38 IP:220.130.xxx.xxx 未訂閱
不好意思,公司沒有bcb可以試,只好請您再試一個 points[0] = Point( p2.x, p2.y ); points[1] = Point( p2.x + (int)( (20)*cos(angle) - (5)*sin(angle) ), p2.y + (int)( (20)*sin(angle) + (5)*cos(angle) ) );    points[2] = Point( p2.x + (int)( (20)*cos(angle) - (-5)*sin(angle) ), p2.y + (int)( (20)*sin(angle) + (-5)*cos(angle) ) ); 部份改成 points[0] = Point( p2.x (int)( (20)*cos(angle), p2.y (int)( (20)*sin(angle) ); points[1] = Point( p2.x (int)( (20)*cos(angle) - (5)*cos(固定角度) ), p2.y (int)( (20)*sin(angle) (5)*sin(固定角度) ) ); points[2] = Point( p2.x (int)( (20)*cos(angle) - (-5)*cos(固定角度) ), p2.y (int)( (20)*sin(angle) (-5)*sin(固定角度) ) ); 再試試囉 我想您的三個
------
加油!
gemini07
一般會員


發表:29
回覆:18
積分:14
註冊:2003-04-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-29 14:37:09 IP:210.66.xxx.xxx 未訂閱
sew你好,謝謝你這麼熱心的回答,不過剛剛我發現問題的原因了 以下是我修改後的程式碼 void __fastcall TForm1::DrawArrow( TCanvas* canvas, TPoint p1, TPoint p2 ) {  if( canvas == NULL ) return;    canvas->Pen->Color = clBlack; canvas->Brush->Color = clBlack; canvas->Brush->Style = bsSolid;    canvas->MoveTo( p1.x, p1.y );  canvas->LineTo( p2.x, p2.y );    //- 畫箭頭 double slope; if( p2.x - p1.x == 0 ) slope = 1; else slope = double( p2.y - p1.y ) / ( p2.x - p1.x );    -->問題出在這一行,把它改成這樣就可以了 double angle = atan( slope ); TPoint points[3]; points[0] = Point( p2.x, p2.y ); points[1] = Point( p2.x (int)( (20)*cos(angle) - (5)*sin(angle) ), p2.y (int)( (20)*sin(angle) (5)*cos(angle) ) ); points[2] = Point( p2.x (int)( (20)*cos(angle) - (-5)*sin(angle) ), p2.y (int)( (20)*sin(angle) (-5)*cos(angle) ) ); canvas->Polygon( points, 2 ); }
sew
一般會員


發表:2
回覆:54
積分:21
註冊:2003-08-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-29 15:07:53 IP:220.130.xxx.xxx 未訂閱
不好意思,也沒幫到忙 加油!
------
加油!
系統時間:2024-05-02 12:20:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!