Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
15
Добавлен:
01.05.2014
Размер:
4.77 Кб
Скачать
#include "StdAfx.h"
#include ".\cotrezok.h"
#include "Laba3.h"
#include "cLomanaya.h"
#include "cZmkLomanaya.h"
#include "cTochka.h"

cOtrezok::cOtrezok(void)
{
	Tchk1.X = 0;
	Tchk1.Y = 0;
	Tchk2.X = 0;
	Tchk2.Y = 0;
}

cOtrezok::~cOtrezok(void)
{
}

float cOtrezok::Dlina(void)
{
	return Tchk1.Rastoyanie(this->Tchk2);
}

cOtrezok::cOtrezok(cTochka& Tk1, cTochka& Tk2)
{
	Tchk1.X = Tk1.X;
	Tchk1.Y = Tk1.Y;
	Tchk2.X = Tk2.X;
	Tchk2.Y = Tk2.Y;
}

cTochka cOtrezok::Peresechenie(cOtrezok& Otrzk)
{
	float k1, k2;
	float b1, b2;

	if(this->Tchk1.X == this->Tchk2.X)
	{
		if(Otrzk.Tchk1.X == Otrzk.Tchk2.X)
			return cTochka();
		else
		{
			if(((Otrzk.Tchk1.X<=this->Tchk1.X)&&(Otrzk.Tchk2.X>=this->Tchk1.X)) || ((Otrzk.Tchk1.X>=this->Tchk1.X)&&(Otrzk.Tchk2.X<=this->Tchk1.X)))
			{
				cTochka Tchk;	
				k2 = (Otrzk.Tchk2.Y-Otrzk.Tchk1.Y)/(Otrzk.Tchk2.X-Otrzk.Tchk1.X);
				b2 = Otrzk.Tchk1.Y-k2*Otrzk.Tchk1.X;
				Tchk.X = this->Tchk1.X;
				Tchk.Y = k2*this->Tchk1.X+b2; 
				if(((this->Tchk1.Y>Tchk.Y)&&(this->Tchk2.Y>Tchk.Y)) || ((this->Tchk1.Y<Tchk.Y)&&(this->Tchk2.Y<Tchk.Y)))
					return cTochka();
				return Tchk;
			}
			else
				return cTochka();
		}
	}
	else
	{
		if(Otrzk.Tchk1.X == Otrzk.Tchk2.X)
		{
			if(((this->Tchk1.X<=Otrzk.Tchk1.X)&&(this->Tchk2.X>=Otrzk.Tchk1.X)) || ((this->Tchk1.X>=Otrzk.Tchk1.X)&&(this->Tchk2.X<=Otrzk.Tchk1.X)))
			{
				cTochka Tchk;	
				k1 = (this->Tchk2.Y-this->Tchk1.Y)/(this->Tchk2.X-this->Tchk1.X);
				b1 = this->Tchk1.Y-k1*this->Tchk1.X;
				Tchk.X = Otrzk.Tchk1.X;
				Tchk.Y = k1*Otrzk.Tchk1.X+b1; 
				if(((Otrzk.Tchk1.Y>Tchk.Y)&&(Otrzk.Tchk2.Y>Tchk.Y)) || ((Otrzk.Tchk1.Y<Tchk.Y)&&(Otrzk.Tchk2.Y<Tchk.Y)))
					return cTochka();
				return Tchk;
			}
			else
				return cTochka();
		}
		else
		{
			cTochka Tchk;

			k1 = (this->Tchk2.Y-this->Tchk1.Y)/(this->Tchk2.X-this->Tchk1.X);
			b1 = this->Tchk1.Y-k1*this->Tchk1.X;
			k2 = (Otrzk.Tchk2.Y-Otrzk.Tchk1.Y)/(Otrzk.Tchk2.X-Otrzk.Tchk1.X);
			b2 = Otrzk.Tchk1.Y-k2*Otrzk.Tchk1.X;
			if(k1 == k2)
				return cTochka();
			
			Tchk.X = (b2-b1)/(k1-k2);
			Tchk.Y = k1*Tchk.X+b1;

			if(((Tchk.X<this->Tchk1.X)&&(Tchk.X<this->Tchk2.X)) || ((Tchk.X>this->Tchk1.X)&&(Tchk.X>this->Tchk2.X)))
				return cTochka();
			if(((Tchk.X<Otrzk.Tchk1.X)&&(Tchk.X<Otrzk.Tchk2.X)) || ((Tchk.X>Otrzk.Tchk1.X)&&(Tchk.X>Otrzk.Tchk2.X)))
				return cTochka();
			return Tchk;
		}
	}

	return cTochka();
}

int cOtrezok::Clear(void)
{
	Tchk1.X = 0;
	Tchk1.Y = 0;
	Tchk2.X = 0;
	Tchk2.Y = 0;

	return 0;
}

int cOtrezok::CreateLomanuyu(void)
{
	list<cTochka>::iterator i;
	list<cTochka>::iterator j;
	float MinX;
	cOtrezok Otrzk;
	cOtrezok OtrTmp;
	cTochka TchkTmp;
	int StartType = OUT_LOMANAYA;

	i=theApp.ZmkLmn.Lmn.begin();
	MinX = (*i).X;
	for(;i!=theApp.ZmkLmn.Lmn.end();i++)
	{
		if((*i).X < MinX)
			MinX = (*i).X;
	}
	
	Otrzk.Tchk1.X = MinX-10;
	Otrzk.Tchk1.Y = 0;
	Otrzk.Tchk2.X = theApp.Otrezok.Tchk1.X;
	Otrzk.Tchk2.Y = theApp.Otrezok.Tchk1.Y;

	i=theApp.ZmkLmn.Lmn.begin();
	i++;
	j=theApp.ZmkLmn.Lmn.begin();
	for(;i!=theApp.ZmkLmn.Lmn.end();i++,j++)
	{
		OtrTmp.Tchk1.X = (*j).X;
		OtrTmp.Tchk1.Y = (*j).Y;
		OtrTmp.Tchk2.X = (*i).X;
		OtrTmp.Tchk2.Y = (*i).Y;
		TchkTmp = Otrzk.Peresechenie(OtrTmp);
		if((TchkTmp.X != 0) || (TchkTmp.Y != 0))
		{
			if(StartType == OUT_LOMANAYA)
				StartType = IN_LOMANAYA;
			else
				StartType = OUT_LOMANAYA;
		}
	}
	i=theApp.ZmkLmn.Lmn.begin();
	OtrTmp.Tchk1.X = (*j).X;
	OtrTmp.Tchk1.Y = (*j).Y;
	OtrTmp.Tchk2.X = (*i).X;
	OtrTmp.Tchk2.Y = (*i).Y;
	TchkTmp = Otrzk.Peresechenie(OtrTmp);
	if((TchkTmp.X != 0) || (TchkTmp.Y != 0))
	{
		if(StartType == OUT_LOMANAYA)
			StartType = IN_LOMANAYA;
		else
			StartType = OUT_LOMANAYA;
	}
	theApp.StartType = StartType;

	theApp.Lomanaya.DobavitTochku(theApp.Otrezok.Tchk1);
	i=theApp.ZmkLmn.Lmn.begin();
	i++;
	j=theApp.ZmkLmn.Lmn.begin();
	for(;i!=theApp.ZmkLmn.Lmn.end();i++,j++)
	{
		OtrTmp.Tchk1.X = (*j).X;
		OtrTmp.Tchk1.Y = (*j).Y;
		OtrTmp.Tchk2.X = (*i).X;
		OtrTmp.Tchk2.Y = (*i).Y;
		TchkTmp = theApp.Otrezok.Peresechenie(OtrTmp);
		if((TchkTmp.X != 0) || (TchkTmp.Y != 0))
		{
			theApp.Lomanaya.DobavitTochkuSort(TchkTmp);
		}
	}
	i=theApp.ZmkLmn.Lmn.begin();
	OtrTmp.Tchk1.X = (*j).X;
	OtrTmp.Tchk1.Y = (*j).Y;
	OtrTmp.Tchk2.X = (*i).X;
	OtrTmp.Tchk2.Y = (*i).Y;
	TchkTmp = theApp.Otrezok.Peresechenie(OtrTmp);
	if((TchkTmp.X != 0) || (TchkTmp.Y != 0))
	{
		theApp.Lomanaya.DobavitTochkuSort(TchkTmp);
	}
	i=theApp.Lomanaya.Lmn.end();
	if((theApp.Otrezok.Tchk2.X!=(*i).X) || (theApp.Otrezok.Tchk2.Y!=(*i).Y))
		theApp.Lomanaya.DobavitTochku(theApp.Otrezok.Tchk2);

	return 0;
}
Соседние файлы в папке Laba3