線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2013
推到 Plurk!
推到 Facebook!

有關畫圖的問題

尚未結案
unungigi3000
一般會員


發表:20
回覆:14
積分:6
註冊:2005-07-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-27 16:13:22 IP:140.124.xxx.xxx 未訂閱
不好意思,我想請教一下為什麼我的程式,沒辦法連成曲線呢?? 反而是一條一條的! 該如何做呢?? 請大家指導一下,謝謝!!
// #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
  int a[10]={58,5,104,6,7,75,4,28,6,69};
  int b[10]={78,5,99,5,67,4,705,3,5,96};
  for (int i=0 ;i<11 ;i  )
  {
    Image1->Canvas->MoveTo(0,0);
    Image1->Canvas->LineTo(a[i],b[i]);
  }
}
pireer
初階會員


發表:73
回覆:80
積分:30
註冊:2004-12-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-27 16:30:52 IP:61.220.xxx.xxx 未訂閱
hi unungigi3000: 因為你這段CODE 開始的點都是X0.Y0...所以當然每條線都是從X0.Y0位置開始畫..    Image1->Canvas->MoveTo(0,0);    如果你要連接.應該第二條線的起始點是第一條的結束點.    例:將你的CODE改了一下  
  int       x,y;      int a[10]={5,10,20,30,40,50,60,70,80,90};
  int b[10]={120,110,100,90,120,140,110,70,50,90};      x=0,y=0;      for (int i=0 ;i<10 ;i  )
  {
    Image1->Canvas->MoveTo(x,y);
    Image1->Canvas->LineTo(a[i],b[i]);
    x = a[i];
    y = b[i];
  }     
發表人 - pireer 於 2005/09/27 16:39:20
unungigi3000
一般會員


發表:20
回覆:14
積分:6
註冊:2005-07-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-27 17:06:29 IP:140.124.xxx.xxx 未訂閱
引言: 不好意思,我想請教一下為什麼我的程式,沒辦法連成曲線呢?? 反而是一條一條的! 該如何做呢?? 請大家指導一下,謝謝!!
// #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
  int a[10]={58,5,104,6,7,75,4,28,6,69};
  int b[10]={78,5,99,5,67,4,705,3,5,96};
  for (int i=0 ;i<11 ;i  )
  {
    Image1->Canvas->MoveTo(0,0);
    Image1->Canvas->LineTo(a[i],b[i]);
  }
}
真的是很謝謝你!! 我了解了! 但小弟還有一個問題!! 執行後畫出的圖似乎原點是在左上角,有沒有辦法是讓原點在左下角呢?? 就是一般的X-Y座標!! 在此先謝謝您了!!
pireer
初階會員


發表:73
回覆:80
積分:30
註冊:2004-12-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-27 17:35:52 IP:61.220.xxx.xxx 未訂閱
你用下面程式試試.只要將x=0,y=0; 這段改成你要的起始座標就可以了.
int       x,y;      int a[10]={5,10,20,30,40,50,60,70,80,90};
  int b[10]={120,110,100,90,120,140,110,70,50,90};      x=0,y=0;       for (int i=0 ;i<10 ;i  )
  {
    Image1->Canvas->MoveTo(x,y);
    Image1->Canvas->LineTo(a[i],b[i]);
    x = a[i];
    y = b[i];
  }
  
unungigi3000
一般會員


發表:20
回覆:14
積分:6
註冊:2005-07-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-27 18:07:31 IP:140.124.xxx.xxx 未訂閱
引言: 你用下面程式試試.只要將x=0,y=0; 這段改成你要的起始座標就可以了.
int       x,y;      int a[10]={5,10,20,30,40,50,60,70,80,90};
  int b[10]={120,110,100,90,120,140,110,70,50,90};      x=0,y=0;       for (int i=0 ;i<10 ;i  )
  {
    Image1->Canvas->MoveTo(x,y);
    Image1->Canvas->LineTo(a[i],b[i]);
    x = a[i];
    y = b[i];
  }
  
不好意思,pireer前輩,小弟的意思是 X軸是以右為正 Y軸是以上為正 但小弟改了XY的值並沒有讓座標轉換Y軸還是以下為正 只能決定起點的位置耶!! 還是說BCB本身設定就是這樣呢?? 那有沒有辦法改變呢? 再謝謝pireer前輩的幫忙!
unungigi3000
一般會員


發表:20
回覆:14
積分:6
註冊:2005-07-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-28 12:16:01 IP:140.124.xxx.xxx 未訂閱
引言:
引言: 你用下面程式試試.只要將x=0,y=0; 這段改成你要的起始座標就可以了.
int       x,y;      int a[10]={5,10,20,30,40,50,60,70,80,90};
  int b[10]={120,110,100,90,120,140,110,70,50,90};      x=0,y=0;       for (int i=0 ;i<10 ;i  )
  {
    Image1->Canvas->MoveTo(x,y);
    Image1->Canvas->LineTo(a[i],b[i]);
    x = a[i];
    y = b[i];
  }
  
不好意思,pireer前輩,小弟的意思是 X軸是以右為正 Y軸是以上為正 但小弟改了XY的值並沒有讓座標轉換Y軸還是以下為正 只能決定起點的位置耶!! 還是說BCB本身設定就是這樣呢?? 那有沒有辦法改變呢? 再謝謝pireer前輩的幫忙!
恩~~是沒辦法做到嗎?? 那可以在Image上自訂座標嗎? 或者是在form上也可以!! 小弟不想用chart物件來幫忙,只希望用程式來畫圖 不知有沒有辦法呢??
pireer
初階會員


發表:73
回覆:80
積分:30
註冊:2004-12-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-28 13:58:11 IP:61.220.xxx.xxx 未訂閱
hi unungigi3000: 看不太懂你說的X以右為正.Y以上為正. 如果你要畫連續線條的話. 給你看的範例:下面範例繪畫出一個"ㄇ"形狀出來..m.y隨意設個座標. ACanvas->MoveTo( m, y); ACanvas->LineTo( m, y - 40); ACanvas->LineTo( m k , y - 40); ACanvas->LineTo( m k , y); 在上段程式碼中...MoveTo表示起始點的座標. LineTo表示要畫到哪個座標.如果要畫連續不同座標的線條. 可類似範例中加了兩個LineTo來畫出"ㄇ"型... 至於你說的自訂座標是指你要隨意給他一個座標然後畫出來嗎? 你可以參考範例達成你要的效果.. 至於座標最左上角都是由X0.Y0開始. 往右是X 往左是X- 往上是Y- 往下是Y 或是你直接把要完成的圖形貼出來比較快.
unungigi3000
一般會員


發表:20
回覆:14
積分:6
註冊:2005-07-20

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-28 17:07:41 IP:140.124.xxx.xxx 未訂閱
引言: hi unungigi3000: 看不太懂你說的X以右為正.Y以上為正. 如果你要畫連續線條的話. 給你看的範例:下面範例繪畫出一個"ㄇ"形狀出來..m.y隨意設個座標. ACanvas->MoveTo( m, y); ACanvas->LineTo( m, y - 40); ACanvas->LineTo( m + k , y - 40); ACanvas->LineTo( m + k , y); 在上段程式碼中...MoveTo表示起始點的座標. LineTo表示要畫到哪個座標.如果要畫連續不同座標的線條. 可類似範例中加了兩個LineTo來畫出"ㄇ"型... 至於你說的自訂座標是指你要隨意給他一個座標然後畫出來嗎? 你可以參考範例達成你要的效果.. 至於座標最左上角都是由X0.Y0開始. 往右是X+ 往左是X- 往上是Y- 往下是Y+ 或是你直接把要完成的圖形貼出來比較快.
不好意思,小弟表達的不太清楚!! 所以貼了一個我想寫出的的圖檔!! 我不知道他是如何做出來的,我所說的X向右為正,Y向上為正,就是這樣的情形!! 如果Y向下為正的話,曲線不就就顛倒了嗎?? 小弟實在不解,該如何寫這樣子的程式呢?? 再謝謝pireer大大幫忙!!
pireer
初階會員


發表:73
回覆:80
積分:30
註冊:2004-12-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-28 19:03:34 IP:61.220.xxx.xxx 未訂閱
如下圖...按下Button1會畫出如圖的畫面. 請參考程式碼改成你要的就可以了.    
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void  __fastcall  TForm1::Ruler()      //畫表格
{
  int               i, j ,k,XWidth,num;
  float             x,y,n;          j=10;          XWidth = 20;          num = 50;          x = XWidth;
      //垂直
      for( i=0; iCanvas->MoveTo( x, y);
        Image1->Canvas->LineTo( x+20,y);            Image1->Canvas->TextOutA( 0 ,y ,IntToStr(num));            num = num - 10 ;            if (i == 6)
        {                Image1->Canvas->MoveTo( XWidth, 250);
            Image1->Canvas->LineTo( 520, 250);
        }            if (y >= 450) break;            for(k=0;k<5;k++)
        {
            Image1->Canvas->MoveTo( x, y);
            Image1->Canvas->LineTo( x+10,y);
            y=y+10;
        }          }          y = y + 50;          x = x + 50;              //水平
      for( i=0; iCanvas->MoveTo( x, y);
        Image1->Canvas->LineTo( x, y-20);            Image1->Canvas->TextOutA( x ,510 ,IntToStr(num+10));            num = num + 10 ;            if (i == 6)
        {                Image1->Canvas->MoveTo( 270, 0);
            Image1->Canvas->LineTo( 270, 500);
        }            if (x >= 520) break;            for(k=0;k<5;k++)
        {
                Image1->Canvas->MoveTo( x, y);
                Image1->Canvas->LineTo( x,y-10);
                x=x+10;
        }          }              Image1->Canvas->MoveTo( XWidth, 0);
      Image1->Canvas->LineTo( XWidth,500);
      Image1->Canvas->LineTo( 520,500);
      Image1->Canvas->TextOutA( 0 ,510 ,"-50");          Curve();    }
//---------------------------------------------------------------------------
void  __fastcall  TForm1::Curve()        //畫波形
{
    int         m,y,k;        m = 20;
    y = 400;
    k = 200;        Image1->Canvas->Pen->Color = clRed;
    Image1->Canvas->MoveTo( m, y);
    Image1->Canvas->LineTo( m+50, y);
    Image1->Canvas->LineTo( m+50, y - 200);
    Image1->Canvas->LineTo( m + k , y - 200);
    Image1->Canvas->LineTo( m + k , y);
    Image1->Canvas->LineTo( m+k+300, y);    }
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Ruler();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Image1->Width = 550;
    Image1->Height = 550;
}
//---------------------------------------------------------------------------  
unungigi3000
一般會員


發表:20
回覆:14
積分:6
註冊:2005-07-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-28 20:58:07 IP:140.124.xxx.xxx 未訂閱
引言: hi unungigi3000: 看不太懂你說的X以右為正.Y以上為正. 如果你要畫連續線條的話. 給你看的範例:下面範例繪畫出一個"ㄇ"形狀出來..m.y隨意設個座標. ACanvas->MoveTo( m, y); ACanvas->LineTo( m, y - 40); ACanvas->LineTo( m k , y - 40); ACanvas->LineTo( m k , y); 在上段程式碼中...MoveTo表示起始點的座標. LineTo表示要畫到哪個座標.如果要畫連續不同座標的線條. 可類似範例中加了兩個LineTo來畫出"ㄇ"型... 至於你說的自訂座標是指你要隨意給他一個座標然後畫出來嗎? 你可以參考範例達成你要的效果.. 至於座標最左上角都是由X0.Y0開始. 往右是X 往左是X- 往上是Y- 往下是Y 或是你直接把要完成的圖形貼出來比較快.
先謝謝pireer前輩,幫我寫出了參考的code,怪我的表達不好!! 因為畫曲線的數據是由txt讀出來的,數據不是固定的!! 所以小弟是想將數據讀取後放在陣列裡,再使用MoveTo跟LineTo來做連接數據的工作!! 但Image的座標與小弟想要的x往右為正,Y往上為正顛倒,使得若是變動的數據畫得圖就可能不對了!! 該如何是好呢?? 小弟覺得是不是要先定義Image的座標呢??
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-09-29 16:43:01 IP:59.115.xxx.xxx 未訂閱
unungigi3000 您好:    看來您需要的是先將 Image1 上的 Y 軸 0 點位置設定好,例如 int Y0 = Image1->Height/2; 或是 int Y0 = (Image1->Height/3)*2;,然後在繪製的時候用前述的 Y0 減掉取出的 Y 值即可,如此一來;正負值會顛倒過來,正值會小於 Y0 (往上繪製),而負值則會大於 Y0 (往下繪製)。      7 天天敲鍵盤 v 時時按滑鼠 8
unungigi3000
一般會員


發表:20
回覆:14
積分:6
註冊:2005-07-20

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-09-29 17:22:25 IP:140.124.xxx.xxx 未訂閱
引言: unungigi3000 您好: 看來您需要的是先將 Image1 上的 Y 軸 0 點位置設定好,例如 int Y0 = Image1->Height/2; 或是 int Y0 = (Image1->Height/3)*2;,然後在繪製的時候用前述的 Y0 減掉取出的 Y 值即可,如此一來;正負值會顛倒過來,正值會小於 Y0 (往上繪製),而負值則會大於 Y0 (往下繪製)。 7 天天敲鍵盤 v 時時按滑鼠 8
謝謝RedSnow大大,小弟剛剛也想出來了!! 真是十分的感謝您! 也謝謝pireer大大,真是麻煩您了!!都怪小弟太笨了!! 但pireer大大先回答了小弟的第一個問題,所以分數只能給pireer大大了!! 對RedSnow大大很抱歉喔!!
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-09-29 18:11:31 IP:61.230.xxx.xxx 未訂閱
unungigi3000 您好:
引言:謝謝RedSnow大大,小弟剛剛也想出來了!! 真是十分的感謝您! 也謝謝pireer大大,真是麻煩您了!!都怪小弟太笨了!! 但pireer大大先回答了小弟的第一個問題,所以分數只能給pireer大大了!! 對RedSnow大大很抱歉喔!!
不用客氣,我只是提醒一下而已,沒出什麼力,將分數給 pireer 是應該的。 7 天天敲鍵盤 v 時時按滑鼠 8
系統時間:2024-06-29 16:28:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!