📄 textoutview.cpp
字号:
temparea=MyArea1[iArea];//用临时变量来存储要分开的区域
MyArea1[iArea].Cnt1=0;//清空原来的区域
for(Temp=0;Temp<temparea.Cnt1;Temp++)
{
CPoint p;
p=temparea.myLine1[Temp].GetMid1();
if(p.y-midline1.point1[0].y-midline1.Getk1()*(p.x-midline1.point1[0].x)<0)//若边界中点在中垂线负边
{//存放于原来的区域地址中
MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1]=temparea.myLine1[Temp];
MyArea1[iArea].Cnt1++;
}
else
{//其他的存放于区域数组的末尾的新区域
MyArea1[AreaCnt1].myLine1[MyArea1[AreaCnt1].Cnt1]=temparea.myLine1[Temp];
MyArea1[AreaCnt1].Cnt1++;
}
}
MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].point1[0]=p1;
MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].point1[1]=p2;
MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].LineSide1=0;
MyArea1[iArea].Cnt1++;
//加入负边中垂线到原区域
MyArea1[AreaCnt1].myLine1[MyArea1[AreaCnt1].Cnt1].point1[0]=p1;
MyArea1[AreaCnt1].myLine1[MyArea1[AreaCnt1].Cnt1].point1[1]=p2;
MyArea1[AreaCnt1].myLine1[MyArea1[AreaCnt1].Cnt1].LineSide1=1;
MyArea1[AreaCnt1].Cnt1++;
//正边中垂线加入新区域
for(Temp=0;Temp<wCnt;Temp++)
{
if(mpW[Temp].iBelong==iArea)
{
if(mpW[Temp].y-midline1.point1[0].y-midline1.Getk1()*(mpW[Temp].x-midline1.point1[0].x)>0)
{//处于正边的点放到新的区域中去
mpW[Temp].iBelong=AreaCnt1;
}
else if(mpW[Temp].y-midline1.point1[0].y-midline1.Getk1()*(mpW[Temp].x-midline1.point1[0].x)==0)
{//如果该点在中垂线上
if(minline1.point1[0].y-midline1.point1[0].y-midline1.Getk1()*(minline1.point1[0].x-midline1.point1[0].x)>0)
{//被分开的最近距离两点中的x在中垂线的正边
mpW[Temp].iBelong=AreaCnt1;//把在中垂线上的o点也分到正边,以便以后接着分
}
}
}
}
for(Temp=0;Temp<sCnt;Temp++)
{
if(mpS[Temp].iBelong==iArea)
{//处于正边的点放到新的区域中去
if(mpS[Temp].y-midline1.point1[0].y-midline1.Getk1()*(mpS[Temp].x-midline1.point1[0].x)>0)
{
mpS[Temp].iBelong=AreaCnt1;
}
else if(mpS[Temp].y-midline1.point1[0].y-midline1.Getk1()*(mpS[Temp].x-midline1.point1[0].x)==0)
{//如果该点在中垂线上
if(minline1.point1[1].y-midline1.point1[0].y-midline1.Getk1()*(minline1.point1[1].x-midline1.point1[0].x)>0)
{//被分开的最近距离两点中的o在中垂线的正边
mpS[Temp].iBelong=AreaCnt1;//把中垂线上的x点也分到正边,以便以后接着分
}
}
}
}
AreaCnt1++;//区域数加一
}
int CTextoutView::IsPure1(int iArea)
{
int iflag=0;
int Temp;
for(Temp=0;Temp<wCnt;Temp++)
{
if(mpW[Temp].iBelong==iArea)
{
iflag++;
break;
}
}
for(Temp=0;Temp<sCnt;Temp++)
{
if(mpS[Temp].iBelong==iArea)
{
iflag++;
break;
}
}
return iflag;
}
BOOL CTextoutView::SameLine1(line l1,line l2)
{
BOOL t1,t2;
t1=(l1.point1[0]==l2.point1[0]&&l1.point1[1]==l2.point1[1]);
t2=(l1.point1[0]==l2.point1[1]&&l1.point1[1]==l2.point1[0]);
if(t1||t2)
{
return 1;
}
else
return 0;
}
BOOL CTextoutView::SameArea1(int i1,int i2)
{
int f1=0;
int f2=0;
for(int Temp=0;Temp<wCnt;Temp++)
{
if(mpW[Temp].iBelong==i1)
{
f1=1;
break;
}
}
for(Temp=0;Temp<sCnt&&f1==0;Temp++)
{
if(mpS[Temp].iBelong==i1)
{
f1=2;
break;
}
}
for(Temp=0;Temp<wCnt;Temp++)
{
if(mpW[Temp].iBelong==i2)
{
f2=1;
break;
}
}
for(Temp=0;Temp<sCnt&&f2==0;Temp++)
{
if(mpS[Temp].iBelong==i2)
{
f2=2;
break;
}
}
if(f1==f2) return 1;
else return 0;
}
void CTextoutView::Result1()
{
for(int t1=0;t1<AreaCnt1;t1++)
{//依次找出相同种类区域的相同边界,然后删掉
for(int t2=t1+1;t2<AreaCnt1;t2++)
{
if(SameArea1(t1,t2))
{
for(int t3=0;t3<MyArea1[t1].Cnt1;t3++)
{
for(int t4=0;t4<MyArea1[t2].Cnt1;t4++)
if(SameLine1(MyArea1[t2].myLine1[t4],MyArea1[t1].myLine1[t3]))
{
MyArea1[t2].DelLine1(t4);
MyArea1[t1].DelLine1(t3);
}
}
}
}
}
for(t1=0;t1<AreaCnt1;t1++)
{//把结果放到一个line数组里面
for(int t2=0;t2<MyArea1[t1].Cnt1;t2++)
{
for(int t3=0;t3<iCnt1;t3++)
{
if(SameLine1(MyArea1[t1].myLine1[t2],ResultLine1[t3]))
break;//如果结果line数组里面已经有了这条线,跳出,找该区的下一条线
}
if((t3==iCnt1)&&(!MyArea1[t1].myLine1[t2].IsFrame1()))
{//把是边界的线去掉
ResultLine1[iCnt1].point1[0]=MyArea1[t1].myLine1[t2].point1[0];
ResultLine1[iCnt1].point1[1]=MyArea1[t1].myLine1[t2].point1[1];
iCnt1++;
}
}
}
}
void CTextoutView::OnStart() //分类函数
{
for(int i=0;i<wCnt;i++){
mpX[xCnt].x=mpW[i].x;
mpX[xCnt].y=mpW[i].y;
mpX[xCnt].iBelong=0;
xCnt++;
}
for(i=0;i<sCnt;i++){
mpX[xCnt].x=mpS[i].x;
mpX[xCnt].y=mpS[i].y;
mpX[xCnt].iBelong=0;
xCnt++;
}
int Temp=0;
int flag;
do
{
flag=0;
for(Temp=0;Temp<AreaCnt;Temp++)
{
if(IsPure(Temp)<=1) continue;
else
{
FindMin(Temp);
MidLine();
SplitArea(Temp);
flag=1;
}
}
}while(flag);
Result();
do
{
flag=0;
for(Temp=0;Temp<AreaCnt1;Temp++)
{
if(IsPure1(Temp)<=1) continue;
else
{
FindMin1(Temp);
midlinee();
SplitArea1(Temp);
flag=1;
}
}
}while(flag);
Result1();
CTextoutView::Invalidate(1);
}
void CTextoutView::OnRestart()
{
oCnt=0;
xCnt=0;
iCnt=0;
sCnt=0;
wCnt=0;
MyArea[0].myLine[0].point[0].x=0;
MyArea[0].myLine[0].point[0].y=0;
MyArea[0].myLine[0].point[1].x=1000;
MyArea[0].myLine[0].point[1].y=0;
MyArea[0].myLine[0].LineSide=1;
MyArea[0].myLine[1].point[0].x=0;
MyArea[0].myLine[1].point[0].y=0;
MyArea[0].myLine[1].point[1].x=0;
MyArea[0].myLine[1].point[1].y=1000;
MyArea[0].myLine[1].LineSide=1;
MyArea[0].myLine[2].point[0].x=1000;
MyArea[0].myLine[2].point[0].y=0;
MyArea[0].myLine[2].point[1].x=1000;
MyArea[0].myLine[2].point[1].y=1000;
MyArea[0].myLine[2].LineSide=0;
MyArea[0].myLine[3].point[0].x=0;
MyArea[0].myLine[3].point[0].y=1000;
MyArea[0].myLine[3].point[1].x=1000;
MyArea[0].myLine[3].point[1].y=1000;
MyArea[0].myLine[3].LineSide=0;
MyArea[0].Cnt=4;
AreaCnt=1;
for(int temp=1;temp<100;temp++)
{
MyArea[temp].Cnt=0;
}
/////
iCnt1=0;
MyArea1[0].myLine1[0].point1[0].x=0;
MyArea1[0].myLine1[0].point1[0].y=0;
MyArea1[0].myLine1[0].point1[1].x=1000;
MyArea1[0].myLine1[0].point1[1].y=0;
MyArea1[0].myLine1[0].LineSide1=1;
MyArea1[0].myLine1[1].point1[0].x=0;
MyArea1[0].myLine1[1].point1[0].y=0;
MyArea1[0].myLine1[1].point1[1].x=0;
MyArea1[0].myLine1[1].point1[1].y=1000;
MyArea1[0].myLine1[1].LineSide1=1;
MyArea1[0].myLine1[2].point1[0].x=1000;
MyArea1[0].myLine1[2].point1[0].y=0;
MyArea1[0].myLine1[2].point1[1].x=1000;
MyArea1[0].myLine1[2].point1[1].y=1000;
MyArea1[0].myLine1[2].LineSide1=0;
MyArea1[0].myLine1[3].point1[0].x=0;
MyArea1[0].myLine1[3].point1[0].y=1000;
MyArea1[0].myLine1[3].point1[1].x=1000;
MyArea1[0].myLine1[3].point1[1].y=1000;
MyArea1[0].myLine1[3].LineSide1=0;
MyArea1[0].Cnt1=4;
AreaCnt1=1;
for(temp=1;temp<100;temp++)
{
MyArea1[temp].Cnt1=0;
}
CTextoutView::Invalidate(1);
}
void CTextoutView::OnUndosort()
{
iCnt=0;
MyArea[0].myLine[0].point[0].x=0;
MyArea[0].myLine[0].point[0].y=0;
MyArea[0].myLine[0].point[1].x=1000;
MyArea[0].myLine[0].point[1].y=0;
MyArea[0].myLine[0].LineSide=1;
MyArea[0].myLine[1].point[0].x=0;
MyArea[0].myLine[1].point[0].y=0;
MyArea[0].myLine[1].point[1].x=0;
MyArea[0].myLine[1].point[1].y=1000;
MyArea[0].myLine[1].LineSide=1;
MyArea[0].myLine[2].point[0].x=1000;
MyArea[0].myLine[2].point[0].y=0;
MyArea[0].myLine[2].point[1].x=1000;
MyArea[0].myLine[2].point[1].y=1000;
MyArea[0].myLine[2].LineSide=0;
MyArea[0].myLine[3].point[0].x=0;
MyArea[0].myLine[3].point[0].y=1000;
MyArea[0].myLine[3].point[1].x=1000;
MyArea[0].myLine[3].point[1].y=1000;
MyArea[0].myLine[3].LineSide=0;
MyArea[0].Cnt=4;
AreaCnt=1;
for(int temp=1;temp<100;temp++)
{
MyArea[temp].Cnt=0;
}
for(temp=0;temp<oCnt;temp++)
{
mpO[temp].iBelong=0;
}
for(temp=0;temp<xCnt;temp++)
{
mpX[temp].iBelong=0;
}
/////
iCnt1=0;
MyArea1[0].myLine1[0].point1[0].x=0;
MyArea1[0].myLine1[0].point1[0].y=0;
MyArea1[0].myLine1[0].point1[1].x=1000;
MyArea1[0].myLine1[0].point1[1].y=0;
MyArea1[0].myLine1[0].LineSide1=1;
MyArea1[0].myLine1[1].point1[0].x=0;
MyArea1[0].myLine1[1].point1[0].y=0;
MyArea1[0].myLine1[1].point1[1].x=0;
MyArea1[0].myLine1[1].point1[1].y=1000;
MyArea1[0].myLine1[1].LineSide1=1;
MyArea1[0].myLine1[2].point1[0].x=1000;
MyArea1[0].myLine1[2].point1[0].y=0;
MyArea1[0].myLine1[2].point1[1].x=1000;
MyArea1[0].myLine1[2].point1[1].y=1000;
MyArea1[0].myLine1[2].LineSide1=0;
MyArea1[0].myLine1[3].point1[0].x=0;
MyArea1[0].myLine1[3].point1[0].y=1000;
MyArea1[0].myLine1[3].point1[1].x=1000;
MyArea1[0].myLine1[3].point1[1].y=1000;
MyArea1[0].myLine1[3].LineSide1=0;
MyArea1[0].Cnt1=4;
AreaCnt1=1;
for(temp=1;temp<100;temp++)
{
MyArea1[temp].Cnt1=0;
}
for(temp=0;temp<wCnt;temp++)
{
mpW[temp].iBelong=0;
}
for(temp=0;temp<sCnt;temp++)
{
mpS[temp].iBelong=0;
}
CTextoutView::Invalidate(1);
}
void CTextoutView::OnOne(CPoint point)
{
flag=1;
CTextoutView::Invalidate(1);
}
void CTextoutView::OnTwo(CPoint point)
{
flag=2;
CTextoutView::Invalidate(1);
}
void CTextoutView::OnThree(CPoint point)
{
flag=3;
CTextoutView::Invalidate(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -