- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
实验二 2-2
一、实验题目
给定四个点绘制图4-44所示的不同转角的两个正方形,使用有效边表算法进行填充,填充效果如图4-45所示,注意采用“左闭右开”和“上闭下开”的原则,使得每个正方形的右边界和下边界没有填充。
二、实验思想
有效边表填充算法通过维护边表和有效边表,避开了扫描线与多边形所有边求交的复杂运算。填充原理是按照扫描线从小到大的移动顺序,计算当前扫描线与有效边的交点,然后把这些交点按x值递增的顺序进行排序、配对,以确定填充区间,最后用指定颜色填充区间内的所有像素,即完成填充工作。
三、实验代码
voidCTestView::GetMaxX()//获得屏幕宽度
{
CRectRect;
GetClientRect(Rect);
MaxX=Rect.right;
}
voidCTestView::GetMaxY()//获得屏幕高度
{
CRectRect;
GetClientRect(Rect);
MaxY=Rect.bottom;
}
voidCTestView::ReadPoint()//读入点表函数
{
//设置第一个正方形的4个顶点
inta=160;
P1[0]=CP2(MaxX/4-a,MaxY/2+a);//P0
P1[1]=CP2(MaxX/4+a,MaxY/2+a);//P1
P1[2]=CP2(MaxX/4+a,MaxY/2-a);//P2
P1[3]=CP2(MaxX/4-a,MaxY/2-a);//P3
//设置第二个正方形的4个顶点
intb=ROUND(sqrt(2)*a);
P2[0]=CP2(3*MaxX/4,MaxY/2+b);//P0
P2[1]=CP2(3*MaxX/4+b,MaxY/2);//P1
P2[2]=CP2(3*MaxX/4,MaxY/2-b);//P2
P2[3]=CP2(3*MaxX/4-b,MaxY/2);//P3
}
voidCTestView::DrawRect(CDC*pDC,CP2*P)//绘制正方形函数
{
CP2T;
CLineline;
for(inti=0;i4;i++)//边循环
{
if(i==0)
{
line.MoveTo(pDC,P[i]);
T=P[0];
}
else
{
line.LineTo(pDC,P[i]);;
}
}
line.LineTo(pDC,T);//闭合
}
voidCTestView::OnMENUIFill()
{
//TODO:Addyourcommandhandlercodehere
COLORREFFColor;
CColorDialogccd(RGB(255,0,0));
if(ccd.DoModal()==IDOK)//调用调色板选取色
{
FColor=ccd.GetColor();
m_Red=GetRValue(FColor);//获得颜色的红色分量
m_Green=GetGValue(FColor);//获得颜色的绿色分量
m_Blue=GetBValue(FColor);//获得颜色的蓝色分量
}
RedrawWindow();//刷新屏幕
FillRect(P1);//填充正方形1
FillRect(P2);//填充正方形2
}
voidCTestView::FillRect(CP2*P)//填充正方形函数
{
CFillfill;
CPi2Point[4];
for(inti=0;i4;i++)
{
Point[i].x=P[i].x;
Point[i].y=ROUND(P[i].y);
Point[i].c=CRGB(double(m_Red)/255.0,double(m_Green)/255.0,double(m_Blue)/255.0);
}
CDC*pDC=GetDC();
fill.SetPoint(Point,4);//填充正方形
fill.CreateBucket();
fill.CreateEdge();
fill.Gouraud(pDC);
ReleaseDC(pDC);
}
四、实验截图
文档评论(0)