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

請問如何將去定義B-spline的控制點移動?

尚未結案
macgrady
一般會員


發表:7
回覆:6
積分:2
註冊:2005-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-26 15:22:46 IP:140.134.xxx.xxx 未訂閱
參考之前http://delphi.ktop.com.tw/topic.php?topic_id=59273 裡面的程式  小弟我也Follow做了一個同樣的  只是改成在Image上面把圖畫出來 且可以Save和Open圖,但是想要把此程式再改成,可以定義控制點的移動軌跡,進而改變整個圖的輪廓呢?       發表人 - macgrady 於 2005/09/26 16:57:57
#include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int md;
TPoint p[10];
Graphics:: TBitmap *OriginalBitmap1= new Graphics :: TBitmap();
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
struct Vertex
{
  int x, y;
  void set(int nx, int ny)
  {
   x=nx;
   y=ny;
  }
  void set(float nx, float ny)
  {
   x=nx;
   y=ny;
  }
};    bool getVertex = false;
bool pressing  = false;
int upx, upy, dnx, dny;    class BSpline
{ protected:
    int    mPoints;
    float  t[4], n[4];
    Vertex *mVertex;
  public:
    BSpline() { mVertex = NULL; }
    void setLength(int len) { mPoints = len; }
    void computeN();
    void computeT(float param);
    void assign(Vertex * av, int points) { mVertex=av; mPoints=points; }
    void draw(TCanvas *canvas);
};    void BSpline::draw(TCanvas *canvas)
{
  float s, x, y;
  int k, p, c;      canvas->Pen->Mode = pmNot;
  for (p=0; pMoveTo(x, y);
       for (s=0.1; s<=1.05; s+=0.05)
          {
            computeT(s);
            computeN();
            x=y=0.0;
            for (k=0; k<4; k++)
               { x += n[k]*mVertex[p+k].x;
                 y += n[k]*mVertex[p+k].y;
               }
            canvas->LineTo(x, y);
          }
     }
  //--畫圖--//
  for (c=0; c<3; c++)
     {
       x = (mVertex[(p)%mPoints].x+4*mVertex[(p+1)%mPoints].x+mVertex[(p+2)%mPoints].x)/6.;
       y = (mVertex[(p)%mPoints].y+4*mVertex[(p+1)%mPoints].y+mVertex[(p+2)%mPoints].y)/6.;
       canvas->MoveTo(x, y);
     for (s=0.1; s<=1.05; s+=0.05)
          {
            computeT(s);
            computeN();
            x=y=0.0;
            for (k=0; k<4; k++)
               {
                 x += n[k]*mVertex[(p+k)%mPoints].x;
                 y += n[k]*mVertex[(p+k)%mPoints].y;
               }
            canvas->LineTo(x, y);
          }
        p++;
     }
}    void BSpline::computeT(float param)
{
  t[0] = 1.0;
  t[1] = param;
  t[2] = param*param;
  t[3] = t[2]*param;
}
void BSpline::computeN()
{
  n[3] = t[3]/6.;
  n[2] = t[3]*(-0.5) + (t[2]+t[1])*0.5 + 1./6.;
  n[1] = t[3]*0.5 - t[2] + 4./6.;
  n[0] = (-t[3]+3*(t[2]-t[1])+1)/6.;
}    const int Points = 10;
BSpline bs;
Vertex vt[Points];
int index=0;        //---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
 if(!getVertex)
 {
   getVertex = true;
   index = 0;
   Button1->Caption = "Stop";
 }
 else
 {
  getVertex = false;
  Button1->Caption = "get points";
 }
}    //---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
 if(getVertex = true)
  {
   p[md]=Point(X,Y);
   Image1->Canvas->Ellipse(X-1,Y-1,X+1,Y+1);
   md++;
  }     if ( getVertex )
     {
      if ( indexBrush->Style = bsSolid;
           Canvas->Pen->Mode = pmNot;
           Canvas->Ellipse(X-2, Y-2, X+2, Y+2);
           index++;
           if ( index >= Points )
             {
               getVertex = false;
               Button1->Caption = "Get points";
               return;
             }
         }
     }
}    //---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 bs.assign(vt, index);
 bs.draw(Image1->Canvas);
}    //---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
  pressing = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  if (SavePictureDialog1->Execute())
  {
   Image1->Picture->SaveToFile(SavePictureDialog1->FileName);
  }
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
 Label3->Caption=X;
 Label4->Caption=Y;
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button5Click(TObject *Sender)
{
 if(OpenPictureDialog1->Execute())
 {
  Image1->AutoSize=true;
  Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
 }
} 
發表人 - macgrady 於 2005/09/26 17:38:52
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-26 15:48:03 IP:210.68.xxx.xxx 未訂閱
您好:    PO程式碼的方式與版規說明請參考下面連結,煩請修改謝謝您的配合 >
系統時間:2024-04-27 23:59:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!