📄 textoutview.cpp
字号:
for(Temp=0;Temp<MyArea[iArea].Cnt&&flag<2;Temp++)
{
k2=MyArea[iArea].myLine[Temp].Getk();
x2=MyArea[iArea].myLine[Temp].point[0].x;
y2=MyArea[iArea].myLine[Temp].point[0].y;
if(k1-k2>=-0.001&&k1-k2<=0.001) continue;//两条线不能太平行,交点太远,一定不符合要求
x=(int)((y2-y1+k1*x1-k2*x2)/(k1-k2)); //算出中垂线与区域边界的交点
if(k2==10000&&x!=x2) x++; //补回取整的损失
y=(int)((k1*k2*(x2-x1)+k2*y1-k1*y2)/(k2-k1));//算出中垂线与区域边界的交点
if(k2==0&&y!=y2) y++; //不会取整的损失
if(((x-x2)*(x-MyArea[iArea].myLine[Temp].point[1].x)<=0)&&((y-y2)*(y-MyArea[iArea].myLine[Temp].point[1].y)<=0))
{//看该交点是不是在该边界线段内
if(flag==0)//找第一个线段内的交点
{
p1.x=x;
p1.y=y;
for(int s1=0;s1<AreaCnt;s1++)
{
if(s1!=iArea)
{
for(int s2=0;s2<MyArea[s1].Cnt;s2++)
{//把所有拥有这个边界的区域的相应边界分开
if(SameLine(MyArea[iArea].myLine[Temp],MyArea[s1].myLine[s2]))
{
MyArea[s1].myLine[MyArea[s1].Cnt].point[0]=MyArea[s1].myLine[s2].point[1];
MyArea[s1].myLine[s2].point[1]=p1;
MyArea[s1].myLine[MyArea[s1].Cnt].point[1]=p1;
MyArea[s1].Cnt++;
}
}
}
}
//把该边界的末头付给新边界的开头
MyArea[iArea].myLine[MyArea[iArea].Cnt].point[0]=MyArea[iArea].myLine[Temp].point[1];
MyArea[iArea].myLine[Temp].point[1]=p1;
MyArea[iArea].myLine[MyArea[iArea].Cnt].point[1]=p1;
//并把交点付给新旧边界的末头
MyArea[iArea].Cnt++;//边界数加一
flag++;//去找第二个交点
continue;
}
if(flag==1)//找线段内的第二个交点
{
p2.x=x;
p2.y=y;
if(Distance(p1,p2)<=1) continue;//如果是两个边界的交点,就接着找下一个边界.
for(int s1=0;s1<AreaCnt;s1++)
{
if(s1!=iArea)
{
for(int s2=0;s2<MyArea[s1].Cnt;s2++)
{//把所有拥有这个边界的区域的相应边界分开
if(SameLine(MyArea[iArea].myLine[Temp],MyArea[s1].myLine[s2]))
{
MyArea[s1].myLine[MyArea[s1].Cnt].point[0]=MyArea[s1].myLine[s2].point[1];
MyArea[s1].myLine[s2].point[1]=p2;
MyArea[s1].myLine[MyArea[s1].Cnt].point[1]=p2;
MyArea[s1].Cnt++;
}
}
}
}
MyArea[iArea].myLine[MyArea[iArea].Cnt].point[0]=MyArea[iArea].myLine[Temp].point[1];
MyArea[iArea].myLine[Temp].point[1]=p2;
MyArea[iArea].myLine[MyArea[iArea].Cnt].point[1]=p2;
MyArea[iArea].Cnt++;
flag++;//两个交点全找到,跳出循环
}
}
}
if(flag<=1)
{
AfxMessageBox("您把两个不同的样本重叠在一起了,无法分开!");
::PostQuitMessage(1);
}
area temparea;
temparea=MyArea[iArea];//用临时变量来存储要分开的区域
MyArea[iArea].Cnt=0;//清空原来的区域
for(Temp=0;Temp<temparea.Cnt;Temp++)
{
CPoint p;
p=temparea.myLine[Temp].GetMid();
if(p.y-midline.point[0].y-midline.Getk()*(p.x-midline.point[0].x)<0)//若边界中点在中垂线负边
{//存放于原来的区域地址中
MyArea[iArea].myLine[MyArea[iArea].Cnt]=temparea.myLine[Temp];
MyArea[iArea].Cnt++;
}
else
{//其他的存放于区域数组的末尾的新区域
MyArea[AreaCnt].myLine[MyArea[AreaCnt].Cnt]=temparea.myLine[Temp];
MyArea[AreaCnt].Cnt++;
}
}
MyArea[iArea].myLine[MyArea[iArea].Cnt].point[0]=p1;
MyArea[iArea].myLine[MyArea[iArea].Cnt].point[1]=p2;
MyArea[iArea].myLine[MyArea[iArea].Cnt].LineSide=0;
MyArea[iArea].Cnt++;
//加入负边中垂线到原区域
MyArea[AreaCnt].myLine[MyArea[AreaCnt].Cnt].point[0]=p1;
MyArea[AreaCnt].myLine[MyArea[AreaCnt].Cnt].point[1]=p2;
MyArea[AreaCnt].myLine[MyArea[AreaCnt].Cnt].LineSide=1;
MyArea[AreaCnt].Cnt++;
//正边中垂线加入新区域
for(Temp=0;Temp<oCnt;Temp++)
{
if(mpO[Temp].iBelong==iArea)
{
if(mpO[Temp].y-midline.point[0].y-midline.Getk()*(mpO[Temp].x-midline.point[0].x)>0)
{//处于正边的点放到新的区域中去
mpO[Temp].iBelong=AreaCnt;
}
else if(mpO[Temp].y-midline.point[0].y-midline.Getk()*(mpO[Temp].x-midline.point[0].x)==0)
{//如果该点在中垂线上
if(minline.point[0].y-midline.point[0].y-midline.Getk()*(minline.point[0].x-midline.point[0].x)>0)
{//被分开的最近距离两点中的x在中垂线的正边
mpO[Temp].iBelong=AreaCnt;//把在中垂线上的o点也分到正边,以便以后接着分
}
}
}
}
for(Temp=0;Temp<xCnt;Temp++)
{
if(mpX[Temp].iBelong==iArea)
{//处于正边的点放到新的区域中去
if(mpX[Temp].y-midline.point[0].y-midline.Getk()*(mpX[Temp].x-midline.point[0].x)>0)
{
mpX[Temp].iBelong=AreaCnt;
}
else if(mpX[Temp].y-midline.point[0].y-midline.Getk()*(mpX[Temp].x-midline.point[0].x)==0)
{//如果该点在中垂线上
if(minline.point[1].y-midline.point[0].y-midline.Getk()*(minline.point[1].x-midline.point[0].x)>0)
{//被分开的最近距离两点中的o在中垂线的正边
mpX[Temp].iBelong=AreaCnt;//把中垂线上的x点也分到正边,以便以后接着分
}
}
}
}
AreaCnt++;//区域数加一
}
int CTextoutView::IsPure(int iArea)
{
int iflag=0;
int Temp;
for(Temp=0;Temp<oCnt;Temp++)
{
if(mpO[Temp].iBelong==iArea)
{
iflag++;
break;
}
}
for(Temp=0;Temp<xCnt;Temp++)
{
if(mpX[Temp].iBelong==iArea)
{
iflag++;
break;
}
}
return iflag;
}
BOOL CTextoutView::SameLine(line l1,line l2)
{
BOOL t1,t2;
t1=(l1.point[0]==l2.point[0]&&l1.point[1]==l2.point[1]);
t2=(l1.point[0]==l2.point[1]&&l1.point[1]==l2.point[0]);
if(t1||t2)
{
return 1;
}
else
return 0;
}
BOOL CTextoutView::SameArea(int i1,int i2)
{
int f1=0;
int f2=0;
for(int Temp=0;Temp<oCnt;Temp++)
{
if(mpO[Temp].iBelong==i1)
{
f1=1;
break;
}
}
for(Temp=0;Temp<xCnt&&f1==0;Temp++)
{
if(mpX[Temp].iBelong==i1)
{
f1=2;
break;
}
}
for(Temp=0;Temp<oCnt;Temp++)
{
if(mpO[Temp].iBelong==i2)
{
f2=1;
break;
}
}
for(Temp=0;Temp<xCnt&&f2==0;Temp++)
{
if(mpX[Temp].iBelong==i2)
{
f2=2;
break;
}
}
if(f1==f2) return 1;
else return 0;
}
void CTextoutView::Result()
{
for(int t1=0;t1<AreaCnt;t1++)
{//依次找出相同种类区域的相同边界,然后删掉
for(int t2=t1+1;t2<AreaCnt;t2++)
{
if(SameArea(t1,t2))
{
for(int t3=0;t3<MyArea[t1].Cnt;t3++)
{
for(int t4=0;t4<MyArea[t2].Cnt;t4++)
if(SameLine(MyArea[t2].myLine[t4],MyArea[t1].myLine[t3]))
{
MyArea[t2].DelLine(t4);
MyArea[t1].DelLine(t3);
}
}
}
}
}
for(t1=0;t1<AreaCnt;t1++)
{//把结果放到一个line数组里面
for(int t2=0;t2<MyArea[t1].Cnt;t2++)
{
for(int t3=0;t3<iCnt;t3++)
{
if(SameLine(MyArea[t1].myLine[t2],ResultLine[t3]))
break;//如果结果line数组里面已经有了这条线,跳出,找该区的下一条线
}
if((t3==iCnt)&&(!MyArea[t1].myLine[t2].IsFrame()))
{//把是边界的线去掉
ResultLine[iCnt].point[0]=MyArea[t1].myLine[t2].point[0];
ResultLine[iCnt].point[1]=MyArea[t1].myLine[t2].point[1];
iCnt++;
}
}
}
}
void CTextoutView::FindMin1(int iArea)
{
long Temp1,Temp2;
long MinDis=1000000;
long CurDis;
for(Temp1=0;Temp1<wCnt;Temp1++)
{
for(Temp2=0;Temp2<sCnt;Temp2++)
{
if(mpW[Temp1].iBelong==iArea&&mpS[Temp2].iBelong==iArea)
{
CurDis=Distance(mpS[Temp2],mpW[Temp1]);
if(CurDis<MinDis)
{
MinDis=CurDis;
minline1.point1[0].x=mpS[Temp2].x;//最近距离连线的第一个点是x
minline1.point1[0].y=mpS[Temp2].y;
minline1.point1[1].x=mpW[Temp1].x;//第二个点是o
minline1.point1[1].y=mpW[Temp1].y;
}
}
}
}
}
void CTextoutView::midlinee()
{
double k1,k2;
CPoint p1,p2;
double x,y;
x=(minline1.point1[0].x+minline1.point1[1].x)/2;
y=(minline1.point1[0].y+minline1.point1[1].y)/2;
k1=minline1.Getk1();
if(k1==0)
k2=10000;
else k2=-1/k1;
if(k2>1||k2<-1)
{
p1.y=0;
p1.x=(int)(x-y/k2);
p2.y=1000;
p2.x=(int)((1000-y)/k2+x);
}
else
{
p1.x=0;
p1.y=(int)(y-k2*x);
p2.x=1000;
p2.y=(int)(y+k2*(1000-x));
}
midline1.point1[0].x=p1.x;
midline1.point1[0].y=p1.y;
midline1.point1[1].x=p2.x;
midline1.point1[1].y=p2.y;
}
void CTextoutView::SplitArea1(int iArea)
{
CPoint p1;
CPoint p2;
int flag=0;
int Temp;
double k1,k2;
int x,y,x1,y1,x2,y2;
k1=midline1.Getk1();
x1=midline1.point1[0].x;
y1=midline1.point1[0].y;
for(Temp=0;Temp<MyArea1[iArea].Cnt1&&flag<2;Temp++)
{
k2=MyArea1[iArea].myLine1[Temp].Getk1();
x2=MyArea1[iArea].myLine1[Temp].point1[0].x;
y2=MyArea1[iArea].myLine1[Temp].point1[0].y;
if(k1-k2>=-0.001&&k1-k2<=0.001) continue;//两条线不能太平行,交点太远,一定不符合要求
x=(int)((y2-y1+k1*x1-k2*x2)/(k1-k2)); //算出中垂线与区域边界的交点
if(k2==10000&&x!=x2) x++; //补回取整的损失
y=(int)((k1*k2*(x2-x1)+k2*y1-k1*y2)/(k2-k1));//算出中垂线与区域边界的交点
if(k2==0&&y!=y2) y++; //不会取整的损失
if(((x-x2)*(x-MyArea1[iArea].myLine1[Temp].point1[1].x)<=0)&&((y-y2)*(y-MyArea1[iArea].myLine1[Temp].point1[1].y)<=0))
{//看该交点是不是在该边界线段内
if(flag==0)//找第一个线段内的交点
{
p1.x=x;
p1.y=y;
for(int s1=0;s1<AreaCnt1;s1++)
{
if(s1!=iArea)
{
for(int s2=0;s2<MyArea1[s1].Cnt1;s2++)
{//把所有拥有这个边界的区域的相应边界分开
if(SameLine1(MyArea1[iArea].myLine1[Temp],MyArea1[s1].myLine1[s2]))
{
MyArea1[s1].myLine1[MyArea1[s1].Cnt1].point1[0]=MyArea1[s1].myLine1[s2].point1[1];
MyArea1[s1].myLine1[s2].point1[1]=p1;
MyArea1[s1].myLine1[MyArea1[s1].Cnt1].point1[1]=p1;
MyArea1[s1].Cnt1++;
}
}
}
}
//把该边界的末头付给新边界的开头
MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].point1[0]=MyArea1[iArea].myLine1[Temp].point1[1];
MyArea1[iArea].myLine1[Temp].point1[1]=p1;
MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].point1[1]=p1;
//并把交点付给新旧边界的末头
MyArea1[iArea].Cnt1++;//边界数加一
flag++;//去找第二个交点
continue;
}
if(flag==1)//找线段内的第二个交点
{
p2.x=x;
p2.y=y;
if(Distance(p1,p2)<=1) continue;//如果是两个边界的交点,就接着找下一个边界.
for(int s1=0;s1<AreaCnt1;s1++)
{
if(s1!=iArea)
{
for(int s2=0;s2<MyArea1[s1].Cnt1;s2++)
{//把所有拥有这个边界的区域的相应边界分开
if(SameLine1(MyArea1[iArea].myLine1[Temp],MyArea1[s1].myLine1[s2]))
{
MyArea1[s1].myLine1[MyArea1[s1].Cnt1].point1[0]=MyArea1[s1].myLine1[s2].point1[1];
MyArea1[s1].myLine1[s2].point1[1]=p2;
MyArea1[s1].myLine1[MyArea1[s1].Cnt1].point1[1]=p2;
MyArea1[s1].Cnt1++;
}
}
}
}
MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].point1[0]=MyArea1[iArea].myLine1[Temp].point1[1];
MyArea1[iArea].myLine1[Temp].point1[1]=p2;
MyArea1[iArea].myLine1[MyArea1[iArea].Cnt1].point1[1]=p2;
MyArea1[iArea].Cnt1++;
flag++;//两个交点全找到,跳出循环
}
}
}
if(flag<=1)
{
AfxMessageBox("您把两个不同的样本重叠在一起了,无法分开!");
::PostQuitMessage(1);
}
area1 temparea;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -