В интерактивном режиме вывести куб без удаления невидимых линий в параллельной проекции. Программирование на Си/С, исходник
Код на C++ //--------------------------------------------------------------------------- #define SIDE 120 #include <stdio.h> #include <vcl.h> #pragma hdrstop #include "Main.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TfrmMain *frmMain; bool NoReDraw = false; //----Програмирование на Си/С, struct TVector { float x; float y; float z; } u, u1, u2, r0; // умножение векторов исходник TVector VMulVectors(TVector v1, TVector v2) { TVector v; v.x = v1.y * v2.z - v1.z * v2.y; v.y = v1.z * v2.x - v1.x * v2.z; v.z = v1.x * v2.y - v1.y * v2.x; return v; } //-вывести куб без удаления невидимых линий // умножение векторов исходник float MulVectors(TVector v1, TVector v2, TVector v3) { return v1.x * v2.y * v3.z + v1.y * v2.z * v3.x + v2.x * v3.y * v1.z - v3.x * v2.y * v1.z - v2.x * v1.y * v3.z - v3.y * v2.z * v1.x; } //куб без удаления невидимых линий в параллельной проекции //--------------------------------------------------------------------------- TVector SubVectors(TVector v1, TVector v2) { TVector v; v.x = v1.x - v2.x; v.y = v1.y - v2.y; v.z = v1.z - v2.z; return v; } //-куб без удаления невидимых линий //-получение точки TPoint GetPoint(int x, int y, int z) { TPoint pt; TVector r, r1; float s1, s2, s3, s4; r.x = x; r.y = y; r.z = z; s1 = MulVectors(u1, u2, u); r1 = SubVectors(r, r0); s3 = MulVectors(r1, u2, u); s4 = MulVectors(r1, u1, u); pt.x = s3 / s1; pt.y = - s4 / s1; return pt; } //--------------------------------------------------------------------------- //куб без удаления невидимых линий в параллельной проекции TPoint ToScreen(TPoint pt) { pt.x = frmMain->pbMain->Width / 2 + pt.x; pt.y = frmMain->pbMain->Height / 2 - pt.y; return pt; } //--------------------------------------------------------------------------- void UpdateSettings() { NoReDraw = true; frmMain->edtUx->Text = Format("%.3f", ARRAYOFCONST((u.x))); frmMain->edtUy->Text = Format("%.3f", ARRAYOFCONST((u.y))); frmMain->edtUz->Text = Format("%.3f", ARRAYOFCONST((u.z))); frmMain->edtU1x->Text = Format("%.3f", ARRAYOFCONST((u1.x))); frmMain->edtU1y->Text = Format("%.3f", ARRAYOFCONST((u1.y))); frmMain->edtU1z->Text = Format("%.3f", ARRAYOFCONST((u1.z))); frmMain->edtU2x->Text = Format("%.3f", ARRAYOFCONST((u2.x))); frmMain->edtU2y->Text = Format("%.3f", ARRAYOFCONST((u2.y))); frmMain->edtU2z->Text = Format("%.3f", ARRAYOFCONST((u2.z))); frmMain->edtR0x->Text = Format("%.3f", ARRAYOFCONST((r0.x))); frmMain->edtR0y->Text = Format("%.3f", ARRAYOFCONST((r0.y))); frmMain->edtR0z->Text = Format("%.3f", ARRAYOFCONST((r0.z))); NoReDraw = false; } //------------вывести куб без удаления невидимых линий void DrawBox() { TVector v; frmMain->pbMain->Canvas->Brush = frmMain->Brush; frmMain->pbMain->Canvas->Rectangle ( 0, 0, frmMain->pbMain->Width, frmMain->pbMain->Height ); try { u.x = frmMain->edtUx->Text.ToDouble(); u.y = frmMain->edtUy->Text.ToDouble(); u.z = frmMain->edtUz->Text.ToDouble(); u1.x = frmMain->edtU1x->Text.ToDouble(); u1.y = frmMain->edtU1y->Text.ToDouble(); u1.z = frmMain->edtU1z->Text.ToDouble(); u2.x = frmMain->edtU2x->Text.ToDouble(); u2.y = frmMain->edtU2y->Text.ToDouble(); u2.z = frmMain->edtU2z->Text.ToDouble(); r0.x = frmMain->edtR0x->Text.ToDouble(); r0.y = frmMain->edtR0y->Text.ToDouble(); r0.z = frmMain->edtR0z->Text.ToDouble(); } catch(...) {}; v = VMulVectors(u1, u2); if (v.x == 0 && v.y == 0 && v.z == 0) { MessageBox(NULL, "Векторы u1 и u2 параллельны!", "Ошибка", MB_ICONERROR); return; } if (MulVectors(u1, u2, u) == 0) return; TPoint *pts = new TPoint[8]; pts[0] = ToScreen(GetPoint(0, 0, 0)); pts[1] = ToScreen(GetPoint(SIDE, 0, 0)); pts[2] = ToScreen(GetPoint(0, SIDE,0)); pts[3] = ToScreen(GetPoint(SIDE,SIDE,0)); pts[4] = ToScreen(GetPoint(SIDE/2, SIDE/2, SIDE)); frmMain->pbMain->Canvas->MoveTo(pts[0].x, pts[0].y); frmMain->pbMain->Canvas->LineTo(pts[1].x, pts[1].y); frmMain->pbMain->Canvas->MoveTo(pts[0].x, pts[0].y); frmMain->pbMain->Canvas->LineTo(pts[2].x, pts[2].y); frmMain->pbMain->Canvas->MoveTo(pts[2].x, pts[2].y); frmMain->pbMain->Canvas->LineTo(pts[3].x, pts[3].y); frmMain->pbMain->Canvas->MoveTo(pts[1].x, pts[1].y); frmMain->pbMain->Canvas->LineTo(pts[3].x, pts[3].y); frmMain->pbMain->Canvas->MoveTo(pts[0].x, pts[0].y); frmMain->pbMain->Canvas->LineTo(pts[4].x, pts[4].y); frmMain->pbMain->Canvas->MoveTo(pts[1].x, pts[1].y); frmMain->pbMain->Canvas->LineTo(pts[4].x, pts[4].y); frmMain->pbMain->Canvas->MoveTo(pts[2].x, pts[2].y); frmMain->pbMain->Canvas->LineTo(pts[4].x, pts[4].y); frmMain->pbMain->Canvas->MoveTo(pts[3].x, pts[3].y); frmMain->pbMain->Canvas->LineTo(pts[4].x, pts[4].y); delete[] pts; } //--------------------------------------------------------------------------- __fastcall TfrmMain::TfrmMain(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TfrmMain::ValChange(TObject *Sender) { if (!NoReDraw) DrawBox(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::btnOpenClick(TObject *Sender) { frmMain->odMain->Execute(); FILE *f; if ((f = fopen(frmMain->odMain->FileName.c_str(), "r")) == NULL) return; fscanf(f, "%f\n", &u.x); fscanf(f, "%f\n", &u.y); fscanf(f, "%f\n", &u.z); fscanf(f, "%f\n", &u1.x); fscanf(f, "%f\n", &u1.y); fscanf(f, "%f\n", &u1.z); fscanf(f, "%f\n", &u2.x); fscanf(f, "%f\n", &u2.y); fscanf(f, "%f\n", &u2.z); fscanf(f, "%f\n", &r0.x); fscanf(f, "%f\n", &r0.y); fscanf(f, "%f\n", &r0.z); fclose(f); UpdateSettings(); DrawBox(); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::btnSaveClick(TObject *Sender) { frmMain->sdMain->Execute(); FILE *f; if ((f = fopen(frmMain->sdMain->FileName.c_str(), "w")) == NULL) return; fprintf(f, "%f\n", u.x); fprintf(f, "%f\n", u.y); fprintf(f, "%f\n", u.z); fprintf(f, "%f\n", u1.x); fprintf(f, "%f\n", u1.y); fprintf(f, "%f\n", u1.z); fprintf(f, "%f\n", u2.x); fprintf(f, "%f\n", u2.y); fprintf(f, "%f\n", u2.z); fprintf(f, "%f\n", r0.x); fprintf(f, "%f\n", r0.y); fprintf(f, "%f\n", r0.z); fclose(f); } //--------------------------------------------------------------------------- void __fastcall TfrmMain::btnExitClick(TObject *Sender) { frmMain->Close(); } //---------------------------------------------------------------------------
Вопросы и задачи к работе
- Определение фрактала, размерности Хаусдорфа - Безиковича и топологической размерности.
- Пример. Множество Кантора и его топологическая размерность.
- Размерность Хаусдорфа - Безиковича кривой Коха.
- Классификация фракталов.
- Фракталы Ньютона.
- Вычислить фрактальную размерность ковра Серпинского.
- Вычислить фрактальную размерность кривой Серпинского.
- Квадрат разбивается на p^2 одинаковых квадратов, из которых выбрасываются q квадратов, где p , q - положительные , целые числа. Этот процесс рекурсивно применяется к каждому из оставшихся квадратов. Найти фрактальную размерность полученного в пределе множества. В каком случае она равна 1.
- Куб разбивается на 27 одинаковых кубов. Затем удаляется средний куб и процесс рекурсивно применяется к каждому из оставшихся кубов. Найти фрактальную размерность предельного множества
|