Фрактал кривая Коха снежинка Коха
Четыре реализации на 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
=
|