Понедельник, 06.05.2024, 02:16
Главная Регистрация RSS
Приветствую Вас, Гость
Меню сайта
Категории раздела
Форма входа
ДРУЗЬЯ САЙТА

Вызвать мастера в Красноярске

8 983 207 5474

8 902 918 9334

8 933 332 3164

---------------------------------

Запчасти бытткхники

  • Велес т.2935600
  • СЦ Близнецов т.2296595
  • Вираж
  • Красраб 110 т.2589503
  • Комплекстур Щорса30 т.2606797
  • Радиодетали

  • Якорный 9 т.2688317
  • Воронова 16 т.2202990
  • Красраб 125а т.2456544
  • Профи т.2702737
  • Дайте две т.+79237713323
  • Электрика

  • Электро +
  • Планета электрика
  • ЗАКЛАДКИ
    Поиск
    Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Главная » Статьи » C++ Builder » Фрактал

    Фрактал кривая Коха снежинка Коха

    Фрактал кривая Коха снежинка Коха

    Четыре реализации на c++ builder 6 

    Исходник и исполняемый файл здесь

    =

    =

    =

    =

    =

    //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop

    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
        Form1->DoubleBuffered=True;
        n=5;  k = 300;  flag=0;
         jp = new  TJPEGImage();
         jp->CompressionQuality=60;
      
    }
    //---------------------------------------------------------------------------
    //
    //            ФРАКТАЛ КРИВАЯ КОХА ИТЕРАЦИИ ПИКСЕЛЫ
    //
    //--------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {

        Image1->Canvas->FillRect(Rect (0,0,Image1->Width, Image1->Height));

         double t, x, y, p;
        long k  ;
        int mx, my, rad  ;
        long int itter=20000;
        mx = 10;
        my = 250;
        rad =850;
        Randomize;
        x=0.0;
        y=0.0;
        for(k=1; k<=itter; k++)
        {
            p = random(2);
            t = x;
            if (p <= 0.5)
            {
                x =  0.5 * x + 1/(2*pow(3,0.5)) * y;
                y =  1/(2*pow(3,0.5)) * t - 0.5 * y;
            }
            else
            {
                x =  0.5 * x - 1/(2*sqrt(3)) * y +0.5;
                y =  -1/(2*sqrt(3)) * t - 0.5 * y + 1/(2*sqrt(3));
            }

            Image1->Canvas->Pixels[mx + int(rad * x)][my - int(rad * y)]=RGB(125,25,0);
        }        
    }
    //---------------------------------------------------------------------------
    //
    //    ФРАКТАЛ КРИВАЯ КОХА РЕКУРСИЯ ПИКСЕЛЫ
    //
    //----------------------------------------------------------------------------
    void __fastcall TForm1::Coord(double x1,double y1,double x2,double y2,int n)
    {
    double dx,dy,x1n,y1n,x2n,y2n,xmid, ymid ;
     double  pi=3.141592;
       if( n > 0  ){

     dx=(x2-x1)/3; dy=(y2-y1)/3;
     x1n=x1+dx; y1n=y1+dy;
     x2n=x1+2*dx; y2n=y1+2*dy;
     xmid=dx/2-dy*sin(pi/3)+x1n;
     ymid=dy/2+dx*sin(pi/3)+y1n;

     Coord(x1,y1,x1n,y1n,n-1);
     Coord(x1n,y1n,xmid,ymid,n-1);
     Coord(xmid,ymid,x2n,y2n,n-1);
     Coord(x2n,y2n,x2,y2,n-1);
            }
     else  {
         Image1->Canvas->Pixels[x2+x1][480-(y2+y1)]=RGB(25,125,0);
          }
    }
    //--------------------------------------------------------------------------

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
        Image1->Canvas->FillRect(Rect (0,0,Image1->Width, Image1->Height));
        Coord(5,Image1->Height/4,Image1->Width/2-5,Image1->Height/4,7);
    }
    //---------------------------------------------------------------------------
    //
    //         ФРАКТАЛ КОХА КРИВАЯ И СНЕЖИНКА  ЛИНИИ ИТЕРАЦИИ
    //
    //------------КРИВАЯ1-----------------------------------------------------------------
     void __fastcall TForm1::Traf( double xA, double yA, double xB, double yB, int r)
              {
                 knx[r] = xA;   kny[r] = yA;
                 knx[r+1] = (2*xA+xB)/3; kny[r+1] = (2*yA+yB)/3;
                 knx[r+2] = (xB+xA)/2 + (yA-yB)/(2*sqrt(3.0));
                 kny[r+2] = (yB+yA)/2 + (xB-xA)/(2*sqrt(3.0));
                 knx[r+3] = (xA+2*xB)/3; kny[r+3] = (yA+2*yB)/3;
                 knx[r+4] = xB;   kny[r+4] = yB;
              }
    //--------------КРИВАЯ1 ИТЕРАЦИИ----------------------------------------------------------
     void __fastcall TForm1::Fract(void)
         {
            Traf(-1.0, 0.0, 1.0, 0.0, 0);
            for (int j=0; j<n; j++)
              {
                 double kn1x[m], kn1y[m];

                 r=pow(4.0, j+1);

                 for (int i=0; i<=r; i++)
                   { kn1x[i]=knx[i]; kn1y[i]=kny[i];}
                 for (int i=0; i<r; i++)
                   {Traf(kn1x[i],kn1y[i],kn1x[i+1],kn1y[i+1], 4*i);}
              }
          }

    //-----------------СНЕЖИНКА-ИТЕРАЦИИ----------------------------------------------------
    void __fastcall TForm1::Fractz(void)
        {
           double Ax=-0.7, Ay=-0.4, Bx=0.7, By=-0.4, Cx, Cy;
           Cx = (Bx + Ax)/2 + (Ay - By)*sqrt(3.0)/2;
           Cy = (By + Ay)/2 + (Bx - Ax)*sqrt(3.0)/2;
           Traf(Bx, By, Ax, Ay, 0);
           Traf(Ax, Ay, Cx, Cy, 4);
           Traf(Cx, Cy, Bx, By, 8);
           for (int j=0; j<n; j++)
              {
                 double kn1x[m],  kn1y[m];

                 r = 3*pow(4.0, j+1);

                 for (int i=0;  i<=r;  i++)
                   { kn1x[i] = knx[i];  kn1y[i] = kny[i]; }
                 for (int i=0;  i<r;  i++)
                   { Traf ( kn1x[i], kn1y[i], kn1x[i+1], kn1y[i+1], 4*i); }
              }
          }
    //----------------КРИВАЯ1----------------------------------------------------------
      void __fastcall TForm1::Draw(void)
              {

                  int y = 150;
                  int x = Image1->Width/2;   //410;
                  int a = 100;
                     for (int i=0; i<4*r; i++){

                           Image1->Canvas->MoveTo(knx[i]*k+x ,a-kny[i]*k+y ) ;
                           Image1->Canvas->LineTo(knx[i+1]*k+x ,a-kny[i+1]*k+y );
                                 }
              }

    //--------------КРИВАЯ1-----------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
         Image1->Canvas->FillRect(Rect (0,0,Image1->Width, Image1->Height));
         Image1->Canvas->Pen->Width = 1;
         Image1->Canvas->Pen->Color = clRed;   //clGreen;   //clBlack;
          n=UpDown1->Position;
          Label2->Caption=n;
          r=0;
          k=420;
          flag=1;
         Fract();
         Draw();
    }
    //------------------СНЕЖИНКА---------------------------------------------------------

    void __fastcall TForm1::Button4Click(TObject *Sender)
    {
        Image1->Canvas->FillRect(Rect (0,0,Image1->Width, Image1->Height));
        Image1->Canvas->Pen->Width = 1;
        Image1->Canvas->Pen->Color = clBlue; //clRed;   //clBlack;
         n=UpDown1->Position;
          Label2->Caption=n;
          r=0;
          k=250;
          flag=2;
         Fractz();
         Draw();
    }
    //-----------------КРИВАЯ1----------------------------------------------------------

    void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
    {
      if(flag==1){ Button3Click(Sender);}
      if(flag==2){ Button4Click(Sender);}
    }
    //---------------------------------------------------------------------------
    //
    //    ФРАКТАЛ КРИВАЯ КОХА ЛИНИИ РЕКУРСИЯ
    //
    //
    //-----------------КРИВАЯ2--РЕКУРСИЯ--------------------------------------------------------
    void __fastcall TForm1::Koch(float startx, float endx, float starty, float endy, int level)
    {
        float x1, x2, x3, y1, y2, y3, L, cosa, sina, h;
        if(level==1){

          Image1->Canvas->MoveTo(startx ,starty ) ;
          Image1->Canvas->LineTo(endx ,endy );
        }
        else{
        L = sqrt( (endx-startx) * (endx-startx) + (endy-starty) * (endy-starty) );
        h = L /(2 * sqrt(3));
        sina = (endy - starty)/L;
        cosa = (endx - startx)/L;
        x1 = startx + (endx - startx)/3;
        x2 = (endx + startx)/2 + h * sina;
        x3 = startx + 2 * (endx - startx)/3;

        y1 = starty + (endy - starty)/3;
        y2 = (endy + starty)/2 - h * cosa;
        y3 = starty + 2 * (endy - starty)/3;

        Koch(startx, x1, starty, y1, level-1);
        Koch(x1, x2, y1, y2, level-1);
        Koch(x2, x3, y2, y3, level-1);
        Koch(x3, endx, y3, endy, level-1);

        }
    }
    //---------------КРИВАЯ2-----------------------------------------------------------------

    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
        float x1, x2, y1, y2;
        x1 = 5;
        x2 =Image1->Width-5 ;
        y1 = Image1->Height/2+25 ;
        y2 = y1;
        int n = UpDown2->Position;
        Label5->Caption=n ;
        Image1->Canvas->Pen->Width = 1;
        Image1->Canvas->Pen->Color = clBlue; //clRed;   //clBlack;
        Image1->Canvas->FillRect(Rect (0,0,Image1->Width, Image1->Height));
        Koch(x1, x2, y1, y2, n);
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::UpDown2Click(TObject *Sender, TUDBtnType Button)
    {
      Button5Click(Sender);
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
        delete jp;     
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button6Click(TObject *Sender)
    {
         Image1->Canvas->Pen->Color=clBlack;
         Image1->Canvas->MoveTo(1,1);
         Image1->Canvas->LineTo(Image1->Width-1,1);
         Image1->Canvas->LineTo(Image1->Width-1,Image1->Height-1 );
         Image1->Canvas->LineTo(1,Image1->Height-1 );
         Image1->Canvas->LineTo(1,1 );
         Image1->Canvas->Font->Color=clBlack;//  clGreen;
        Image1->Canvas->Font->Size =  12 ;
        Image1->Canvas->Font->Style = Image1->Canvas->Font->Style << fsBold;

        Image1->Canvas->TextOutA(10 ,10 ,"Кривая Коха" );
        Image1->Canvas->TextOutA(10 ,30 ,"dokakodm.ucoz.ru" );

        Image1->Canvas->Font->Style = Image1->Canvas->Font->Style >> fsBold;
        Image1->Canvas->Font->Size = 8;
        Image1->Canvas->Font->Color=clBlack;

         AnsiString FName="Кривая Коха.jpg";
         SavePictureDialog1->FileName=FName;
    if(SavePictureDialog1->Execute()){

        FName= SavePictureDialog1->FileName;
       jp->Assign( Image1->Picture->Bitmap ) ;
       jp->SaveToFile(FName) ;
    }
    }
    //---------------------------------------------------------------------------

    =

    =

    //---------------------------------------------------------------------------

    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <math.h>
    #include <ComCtrls.hpp>
    #include <jpeg.hpp>
    #include <Dialogs.hpp>
    #include <ExtDlgs.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:    // IDE-managed Components
            TButton *Button1;
            TImage *Image1;
            TButton *Button2;
            TLabel *Label1;
            TBevel *Bevel1;
            TButton *Button3;
            TButton *Button4;
            TUpDown *UpDown1;
            TLabel *Label2;
            TBevel *Bevel2;
            TBevel *Bevel3;
            TLabel *Label3;
            TLabel *Label4;
            TButton *Button5;
            TUpDown *UpDown2;
            TLabel *Label5;
            TBevel *Bevel4;
            TLabel *Label6;
            TButton *Button6;
            TSavePictureDialog *SavePictureDialog1;
            void __fastcall Button1Click(TObject *Sender);
            void __fastcall Button2Click(TObject *Sender);
            void __fastcall Button3Click(TObject *Sender);
            void __fastcall Button4Click(TObject *Sender);
            void __fastcall UpDown1Click(TObject *Sender, TUDBtnType Button);
            void __fastcall Button5Click(TObject *Sender);
            void __fastcall UpDown2Click(TObject *Sender, TUDBtnType Button);
            void __fastcall FormDestroy(TObject *Sender);
            void __fastcall Button6Click(TObject *Sender);
    private:    // User declarations
    public:        // User declarations
    //------------------------------------------- -------------------------------
            int r, n, k, flag;
            static  const int m=16385;
            double knx[m], kny[m];
             void __fastcall Traf( double xA, double yA, double xB, double yB, int r) ;
             void __fastcall Fract(void); // кривая
             void __fastcall Fractz(void);// звезда
             void __fastcall Draw(void); //  нарисовать
    //------------------------------------------------------------------------------
            void __fastcall Coord(double x1,double y1,double x2,double y2,int n);
    //-------------------------------------------------------------------------------------------
            TJPEGImage *jp ;
             void __fastcall Koch(float startx, float endx, float starty, float endy, int level);

            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif

     

    =

    Категория: Фрактал | Добавил: doka (23.07.2020)
    Просмотров: 1753 | Рейтинг: 0.0/0
    Добавлять комментарии могут только зарегистрированные пользователи.
    [ Регистрация | Вход ]