Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ООП / ООП / new_lab3_2 / unit_main

.cpp
Скачиваний:
8
Добавлен:
18.02.2017
Размер:
6.43 Кб
Скачать
//---------------------------------------------------------------------------

#include <vcl.h>
#include <cmath>
#pragma hdrstop

#include "unit_main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;

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

void __fastcall TfrmMain::Clear(){
	tmrMain->Enabled = false;
	paused = false;
	txtSpeedX->Enabled = true;
	txtSpeedY->Enabled = true;

	(dynamic_cast<CBall*>(arr[6]))->center = DPoint(50, 50);
	(dynamic_cast<CBall*>(arr[6]))->v = DPoint(0., 0);


	DrawAll(imgMain->Canvas, arr);
}

//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
	: TForm(Owner)
{
	SetWindowLong(txtSpeedX->Handle, GWL_STYLE, GetWindowLong(txtSpeedX->Handle, GWL_STYLE) | ES_RIGHT);
	SetWindowLong(txtSpeedY->Handle, GWL_STYLE, GetWindowLong(txtSpeedY->Handle, GWL_STYLE) | ES_RIGHT);

	frmMain->KeyPreview = true;

	rotation = false;
	paused = false;

	arr.reserve(7);
	AddBorder(arr, DPoint(0., 0.), DPoint(static_cast<double>(imgMain->Width),
										  static_cast<double>(imgMain->Height)));
	AddTarget(arr, DPoint(650.,150.), DPoint(700., 400.), 5);
	AddSupport(arr, DPoint(140, 300), 110, 110, 3*M_PI/3);
	AddBall(arr, DPoint(50,50), 10);

	trbSemiAxisA->Position = 100;
	trbSemiAxisB->Position = 150;
	trbLength->Position = 40;

	DrawAll(imgMain->Canvas, arr);

}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::imgMainMouseDown(TObject *Sender, TMouseButton Button,
	  TShiftState Shift, int X, int Y)
{
	switch(Button){
		case mbLeft : {
			old_p = TPoint(X, Y);
			m = FindItem(imgMain->Canvas, TPoint(X, Y), arr);
			if(dynamic_cast<CBall*>(m) != NULL){
				tmrMain->Enabled = false;
				paused = true;
			}
			break;
		}
		case mbRight : {
			old_p = TPoint(X, Y);
			m = FindItem(imgMain->Canvas, TPoint(X, Y), arr);
			if(dynamic_cast<CSupport*>(m)) rotation = true;
			else m = NULL;
			break;
		}
	}
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::imgMainMouseUp(TObject *Sender, TMouseButton Button,
	  TShiftState Shift, int X, int Y)
{
	if(paused){
		if(dynamic_cast<CBall*>(m) != NULL) tmrMain->Enabled = true;
		paused = false;
	}
	m = NULL;
	rotation = false;
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::imgMainMouseMove(TObject *Sender, TShiftState Shift,
	  int X, int Y)
{
	if(m){
		if(rotation){
			CSupport *support = dynamic_cast<CSupport*>(m);
			support->Rotate(atan2(static_cast<double>(- Y + old_p.y), static_cast<double>(X - old_p.x)));
			DrawAll(imgMain->Canvas, arr);
		}
		else{
			MoveItem(m, TPoint(X - old_p.x, Y - old_p.y));
			old_p = TPoint(X, Y);
			DrawAll(imgMain->Canvas, arr);
		}
	}
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::FormDestroy(TObject *Sender)
{
	for(vector<Elements*>:: iterator p = arr.begin(); p < arr.end(); ++p)
		delete (*p);
}
//---------------------------------------------------------------------------


void __fastcall TfrmMain::bttPauseClick(TObject *Sender)
{
	tmrMain->Enabled = false;
	paused = true;
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::btnStartClick(TObject *Sender)
{
	if(!paused){
	try{
		(dynamic_cast<CBall*>(arr[6]))->v = DPoint(StrToFloat(txtSpeedX->Text), StrToFloat(txtSpeedY->Text));
	}
	catch(exception &e){
		(dynamic_cast<CBall*>(arr[6]))->v = DPoint(0., 0.);
		txtSpeedX->Text = "";
		txtSpeedY->Text = "";
	}
	}
	txtSpeedX->Enabled = false;
	txtSpeedY->Enabled = false;
	tmrMain->Enabled = true;

	paused = false;
}
//---------------------------------------------------------------------------


void __fastcall TfrmMain::tmrMainTimer(TObject *Sender)
{
	try{
		MoveIt(imgMain->Canvas, dynamic_cast<CBall*>(arr[6]), arr,
								static_cast<double>(trbGravity->Position) * 0.01,
								static_cast<double>(trbBounce->Position) * 0.01,
								1 - static_cast<double>(trbFriction->Position) * 0.01);
	}
	catch(int points){
		tmrMain->Enabled = false;
		ShowMessage("<< " + IntToStr(points) + " >>");
		Clear();
	}
}
//---------------------------------------------------------------------------


void __fastcall TfrmMain::btnStopClick(TObject *Sender)
{
	Clear();
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::trbSemiAxisBChange(TObject *Sender)
{
	dynamic_cast<CSupport*>(arr[5])->Resize(static_cast<double>(trbSemiAxisA->Position),
											static_cast<double>(trbSemiAxisB->Position),
											static_cast<double>(trbLength->Position) * M_PI / 50.);
	DrawAll(imgMain->Canvas, arr);
}
//---------------------------------------------------------------------------


void __fastcall TfrmMain::trbSemiAxisAChange(TObject *Sender)
{
	dynamic_cast<CSupport*>(arr[5])->Resize(static_cast<double>(trbSemiAxisA->Position),
											static_cast<double>(trbSemiAxisB->Position),
											static_cast<double>(trbLength->Position) * M_PI / 50.);
	DrawAll(imgMain->Canvas, arr);
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::trbLengthChange(TObject *Sender)
{
	dynamic_cast<CSupport*>(arr[5])->Resize(static_cast<double>(trbSemiAxisA->Position),
											static_cast<double>(trbSemiAxisB->Position),
											static_cast<double>(trbLength->Position) * M_PI / 50.);
	DrawAll(imgMain->Canvas, arr);
}
//---------------------------------------------------------------------------

void __fastcall TfrmMain::txtVKeyPress(TObject *Sender, char &Key)
{
	if(((Key < '0') || (Key > '9')) && (Key != DecimalSeparator) && (Key != '-') && (Key != VK_BACK) && (Key != VK_DELETE)) Key = NULL;
	else{
		if(Key == '.'){
			if(dynamic_cast<TEdit*>(Sender)->Text.Pos(DecimalSeparator)) Key = NULL;
		}
		if(dynamic_cast<TEdit*>(Sender)->Text == "") dynamic_cast<TEdit*>(Sender)->Text = "0";
	}
}
//---------------------------------------------------------------------------


Соседние файлы в папке new_lab3_2