Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №38 / Laba3 / cOtrezok
.cpp#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