⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphexpdoc.cpp

📁 实现了区域填充已经其他画线功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					m_Set=LineSetR(m_RctLU,m_RctRD);
			}
			else
				m_Set=LineSetL(m_RctLU,m_RctRD);

			//将窗外端点移到交点处并重新编码

			if(m_code==m_code1)
			{
				m_pStart=m_Set;
				Code(m_pStart,m_RctLU,m_RctRD,m_code1);
			}
			else
			{
				m_pEnd=m_Set;
				Code(m_pEnd,m_RctLU,m_RctRD,m_code2);
			}
		}
		else
			done=0;
	
	}while(done);

	AddLineDDA(m_pStart.x,m_pStart.y,m_pEnd.x,m_pEnd.y,RGB(255,0,255));
	AddRect(m_RctLU,m_RctRD);
}

int CGraphExpDoc::ClipBarskyTest(float p, float q, float *u1, float *u2)
{
	int flag=1;				/*flag为标志变量,0:表示舍弃;1:表示可见。*/
	float r;
	if(p<0.0)
	{
		r=q/p;
		if(r>*u2)
			flag=0;
		else if(r>*u1)
			*u1=r;			/*u1取"进入"点的最大参数值*/
	}
	else if(q>0.0)
	{
		r=q/p;
		if(r<*u1)
			flag=0;
		else if(r<*u2)
			*u2=r;			/*u2取"离开" 点的最小参数值*/
	}
	else if(q<0.0)			/*p=0,且q<0。平行于边界,而且在界外的线*/
		flag=0;
	return flag;
}

void CGraphExpDoc::ClipBarskyLine(CPoint m_RctLU, CPoint m_RctRD)
{
	float u1=0.0,u2=1.0,dx,dy;
	dx=m_pEnd.x-m_pStart.x;
	if(ClipBarskyTest(-dx,m_pStart.x-m_RctLU.x,&u1,&u2))
		if(ClipBarskyTest(dx,m_RctRD.x-m_pStart.x,&u1,&u2))
		{
			dy=m_pEnd.y-m_pStart.y;
			if(ClipBarskyTest(-dy,m_pStart.y-m_RctLU.y,&u1,&u2))
				if(ClipBarskyTest(dy,m_RctRD.y-m_pStart.y,&u1,&u2))
				{
					if(u2<1.0)
					{
						m_pEnd.x=m_pStart.x+u2*dx;
						m_pEnd.y=m_pStart.y+u2*dy;
					}
					if(u1>0.0)
					{
						m_pStart.x=m_pStart.x+u1*dx;
						m_pStart.y=m_pStart.y+u1*dy;
					}
					AddLineDDA(m_pStart.x,m_pStart.y,m_pEnd.x,m_pEnd.y,RGB(255,255,0));
					AddRect(m_RctLU,m_RctRD);
				}
		}
}

void CGraphExpDoc::AddPloygon(CPoint *m_Ploy,int m_numPloy)
{
	m_Ploygon=new CPoint[PLOYGONNUM];
	m_Ploygon=m_Ploy;
	m_nPloy=m_numPloy;
}

void CGraphExpDoc::DrawPloygon(CDC *pDC)
{
	pDC->Polygon(m_Ploygon,m_nPloy);
}

void CGraphExpDoc::ClipSHLineL(CPoint blan)
{
	CPoint m_temp;
	int flag;
	m_temp=m_Ploygon[m_nPloy-1];
	CPoint m_pSet;
	CPoint *m_ps=new CPoint[100];

	if(m_temp.x>blan.x)
		flag=0;
	else 
		flag=1;

	int j=0;

	for(int i=0;i<m_nPloy;i++)
	{
		if(m_Ploygon[i].x>blan.x)
		{
			if(flag!=0)
			{
				flag=0;
				m_pSet.x=blan.x;
				m_pSet.y=(blan.x-m_temp.x)*(m_temp.y-m_Ploygon[i].y)/(m_temp.x-m_Ploygon[i].x)+m_temp.y;
				m_ps[j]=m_pSet;
				j++;
			}
			m_ps[j]=m_Ploygon[i];
			j++;
		}
		else
		{
			if(flag==0)
			{
				flag=1;
				m_pSet.x=blan.x;
				m_pSet.y=(blan.x-m_temp.x)*(m_temp.y-m_Ploygon[i].y)/(m_temp.x-m_Ploygon[i].x)+m_temp.y;
				m_ps[j]=m_pSet;
				j++;
			}
		}
		m_temp=m_Ploygon[i];
	}
	m_Ploygon=m_ps;
	m_nPloy=j;
	AddPloygon(m_Ploygon,m_nPloy);
}

void CGraphExpDoc::ClipSHLineR(CPoint blan)
{
	CPoint m_temp;
	int flag;
	m_temp=m_Ploygon[m_nPloy-1];
	CPoint m_pSet;
	CPoint *m_ps=new CPoint[100];

	if(m_temp.x<blan.x)
		flag=0;
	else 
		flag=1;

	int j=0;

	for(int i=0;i<m_nPloy;i++)
	{
		if(m_Ploygon[i].x<blan.x)
		{
			if(flag!=0)
			{
				flag=0;
				m_pSet.x=blan.x;
				m_pSet.y=(blan.x-m_temp.x)*(m_temp.y-m_Ploygon[i].y)/(m_temp.x-m_Ploygon[i].x)+m_temp.y;
				m_ps[j]=m_pSet;
				j++;
			}
			m_ps[j]=m_Ploygon[i];
			j++;
		}
		else
		{
			if(flag==0)
			{
				flag=1;
				m_pSet.x=blan.x;
				m_pSet.y=(blan.x-m_temp.x)*(m_temp.y-m_Ploygon[i].y)/(m_temp.x-m_Ploygon[i].x)+m_temp.y;
				m_ps[j]=m_pSet;
				j++;
			}
		}
		m_temp=m_Ploygon[i];
	}
	m_Ploygon=m_ps;
	m_nPloy=j;
	AddPloygon(m_Ploygon,m_nPloy);
}

void CGraphExpDoc::ClipSHLineU(CPoint blan)
{
	CPoint m_temp;
	int flag;
	m_temp=m_Ploygon[m_nPloy-1];
	CPoint m_pSet;
	CPoint *m_ps=new CPoint[100];

	if(m_temp.y>blan.y)
		flag=0;
	else 
		flag=1;

	int j=0;

	for(int i=0;i<m_nPloy;i++)
	{
		if(m_Ploygon[i].y>blan.y)
		{
			if(flag!=0)
			{
				flag=0;
				m_pSet.y=blan.y;
				m_pSet.x=(blan.y-m_temp.y)*(m_temp.x-m_Ploygon[i].x)/(m_temp.y-m_Ploygon[i].y)+m_temp.x;
				m_ps[j]=m_pSet;
				j++;
			}
			m_ps[j]=m_Ploygon[i];
			j++;
		}
		else
		{
			if(flag==0)
			{
				flag=1;
				m_pSet.y=blan.y;
				m_pSet.x=(blan.y-m_temp.y)*(m_temp.x-m_Ploygon[i].x)/(m_temp.y-m_Ploygon[i].y)+m_temp.x;
				m_ps[j]=m_pSet;
				j++;
			}
		}
		m_temp=m_Ploygon[i];
	}
	m_Ploygon=m_ps;
	m_nPloy=j;
	AddPloygon(m_Ploygon,m_nPloy);
}

void CGraphExpDoc::ClipSHLineD(CPoint blan)
{
	CPoint m_temp;
	int flag;
	m_temp=m_Ploygon[m_nPloy-1];
	CPoint m_pSet;
	CPoint *m_ps=new CPoint[100];

	if(m_temp.y<blan.y)
		flag=0;
	else 
		flag=1;

	int j=0;

	for(int i=0;i<m_nPloy;i++)
	{
		if(m_Ploygon[i].y<blan.y)
		{
			if(flag!=0)
			{
				flag=0;
				m_pSet.y=blan.y;
				m_pSet.x=(blan.y-m_temp.y)*(m_temp.x-m_Ploygon[i].x)/(m_temp.y-m_Ploygon[i].y)+m_temp.x;
				m_ps[j]=m_pSet;
				j++;
			}
			m_ps[j]=m_Ploygon[i];
			j++;
		}
		else
		{
			if(flag==0)
			{
				flag=1;
				m_pSet.y=blan.y;
				m_pSet.x=(blan.y-m_temp.y)*(m_temp.x-m_Ploygon[i].x)/(m_temp.y-m_Ploygon[i].y)+m_temp.x;
				m_ps[j]=m_pSet;
				j++;
			}
		}
		m_temp=m_Ploygon[i];
	}
	m_Ploygon=m_ps;
	m_nPloy=j;
	AddPloygon(m_Ploygon,m_nPloy);
}

void CGraphExpDoc::ClipSHRect(CPoint m_RctLU, CPoint m_RctRD)
{
	ClipSHLineL(m_RctLU);
	ClipSHLineR(m_RctRD);
	ClipSHLineU(m_RctLU);
	ClipSHLineD(m_RctRD);
	AddRect(m_RctLU,m_RctRD);
}

void CGraphExpDoc::AddRect(CPoint m_RctLU, CPoint m_RctRD)
{
	m_RngLU=m_RctLU;
	m_RngRD=m_RctRD;
}

void CGraphExpDoc::DrawRect(CDC *pDC)
{
	CRect rect(m_RngLU,m_RngRD);

	pDC->Rectangle(rect);
}


void CGraphExpDoc::Add_Bezier2_Line(CPoint m_p1, CPoint m_p2, CPoint m_p3, COLORREF color)
{
	m_vBezier2.push_back(CB_Line(m_p1,m_p2,m_p3,color));
}

CB_Line CGraphExpDoc::Get_Bezier2_Line(int index)
{
	return m_vBezier2.at(index);
}

int CGraphExpDoc::GetBezier2LineNumber()
{
	return m_vBezier2.size();
}

void CGraphExpDoc::Add_Bezier3_Line(CPoint m_p1, CPoint m_p2, CPoint m_p3, CPoint m_p4, COLORREF color)
{
	m_vBezier3.push_back(CB_Line(m_p1,m_p2,m_p3,m_p4,color));
}

CB_Line CGraphExpDoc::Get_Bezier3_Line(int index)
{
	return m_vBezier3.at(index);
}

int CGraphExpDoc::GetBezier3LineNumber()
{
	return m_vBezier3.size();
}

void CGraphExpDoc::Add_B2_Line(CPoint m_p1, CPoint m_p2, CPoint m_p3, COLORREF color)
{
	m_vB2Lines.push_back(CB_Line(m_p1,m_p2,m_p3,color));
}

CB_Line CGraphExpDoc::Get_B2_Line(int index)
{
	return m_vB2Lines.at(index);
}

int CGraphExpDoc::GetB2LineNumber()
{
	return m_vB2Lines.size();
}

void CGraphExpDoc::Add_B3_Line(CPoint m_p1, CPoint m_p2, CPoint m_p3, CPoint m_p4, COLORREF color)
{
	m_vB3Lines.push_back(CB_Line(m_p1,m_p2,m_p3,m_p4,color));
}

CB_Line CGraphExpDoc::Get_B3_Line(int index)
{
	return m_vB3Lines.at(index);
}

int CGraphExpDoc::GetB3LineNumber()
{
	return m_vB3Lines.size();
}
int CGraphExpDoc::GetBezierNLineNumber()
{
	return m_vBezierN.size();
}

CB_Line CGraphExpDoc::Get_BezierN_Line(int index)
{
	return m_vBezierN.at(index);
}

void CGraphExpDoc::Add_BezierN_Line(CPoint *m_Bezier,int num,COLORREF color)
{
	m_vBezierN.push_back(CB_Line(m_Bezier,num,color));
}

void CGraphExpDoc::AddRect3(COLORREF color, CPoint pStart, CPoint pEnd)
{
	m_vRect3.push_back(CRect3D(color,pStart,pEnd));
	SetModifiedFlag();
}

CRect3D CGraphExpDoc::GetRect3(int index)
{
	return m_vRect3.at(index);
}

int CGraphExpDoc::GetRect3Number()
{
	return m_vRect3.size();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -