#include "stdafx.h"
#include "..\..\Typeset.h"
#include <windows.h>
//用法示例
void testtypeset(HDC dc)
{
//声明一个板材对象
ctypeset typeset;
//设置板材对象大小
typeset.m_desktop.m_dheight=9999;
typeset.m_desktop.m_dwidth=100;
//声明一个排样元素对象
cmaterial material;
//设置排样元素对象大小
material.setsize(20,99);
//添加进入板材对象
typeset.add(&material);
//继续添加
material.setsize(99,80);
typeset.add(&material);
material.setsize(10,60);
typeset.add(&material);
material.setsize(50,20);
typeset.add(&material);
//添加完毕,进行排样
typeset.go();
//排样完毕,输出
list<cmaterial*>::iterator iter;
//画板材对象
::Rectangle(dc,typeset.m_desktop.m_dx,typeset.m_desktop.m_dy,
typeset.m_desktop.m_dx+typeset.m_desktop.m_dwidth,
typeset.m_desktop.m_dy+typeset.m_desktop.m_dheight);
//画排样元素对象
for(iter=typeset.m_materiallist.begin();iter!=typeset.m_materiallist.end();iter++)
{
::Rectangle(dc,(*iter)->m_dx,(*iter)->m_dy,
(*iter)->m_dx+(*iter)->m_dwidth,
(*iter)->m_dy+(*iter)->m_dheight);
}
}
//////////////////////////////////////////////////////////////////////
// cmaterial class
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// construction/destruction
//////////////////////////////////////////////////////////////////////
#define zero 0.00001
cmaterial::cmaterial()
{
m_dheight=100;
m_dwidth=100;
m_dx=0;
m_dy=0;
m_bused=false;
m_bseletcted=false;
m_brotated=false;
m_iindex=0;
}
cmaterial::cmaterial(double dwidth,double dheight)
{
setsize(dwidth,dheight);
m_dx=0;
m_dy=0;
m_bused=false;
m_bseletcted=false;
m_brotated=false;
m_iindex=0;
}
cmaterial::cmaterial(cmaterial *pmaterial)
{
m_dx=pmaterial->m_dx;
m_dy=pmaterial->m_dy;
m_dheight=pmaterial->m_dheight;
m_dwidth=pmaterial->m_dwidth;
m_bused=pmaterial->m_bused;
m_bseletcted=pmaterial->m_bseletcted;
m_brotated=pmaterial->m_brotated;
m_iindex=pmaterial->m_iindex;
}
void cmaterial::setsize(double dwidth, double dheight)
{
m_dheight=dheight;
m_dwidth=dwidth;
}
void cmaterial::rotated()
{
m_brotated=!m_brotated;
double da=m_dheight;
m_dheight=m_dwidth;
m_dwidth=da;
}
cmaterial::~cmaterial()
{
}
//////////////////////////////////////////////////////////////////////
// construction/destruction
//////////////////////////////////////////////////////////////////////
ctypeset::ctypeset()
{
clear();
}
ctypeset::~ctypeset()
{
clear();
}
void ctypeset::clear()
{
list<cmaterial*>::iterator iter;
for(iter=m_materiallist.begin();iter!=m_materiallist.end();iter++)
{
delete (*iter);
}
m_materiallist.clear();
m_icurindex=0;
}
void ctypeset::add(cmaterial *pmaterial)
{
cmaterial *p=new cmaterial(pmaterial);
p->m_iindex=m_icurindex;
m_materiallist.insert(m_materiallist.end(),p);
m_icurindex++;
}
void ctypeset::sort()
{
list<cmaterial*> materiallist;
list<cmaterial*>::iterator iter1,iter2,iter3;
bool bsourceinvert=false;
while (!m_materiallist.empty())
{
double dmaxlen=0;
iter2=m_materiallist.begin();
cmaterial *p=NULL;
iter1=m_materiallist.end()--;
iter3=iter2;
while(iter2!=iter1)
{
if((*iter2)->m_dwidth>dmaxlen)
{
p=*iter2;
iter3=iter2;
dmaxlen=(*iter2)->m_dwidth;
bsourceinvert=false;
}
if((*iter2)->m_dheight>dmaxlen)
{
p=*iter2;
iter3=iter2;
dmaxlen=(*iter2)->m_dheight;
bsourceinvert=true;
}
iter2++;
}
if(p!=NULL)
{
if(bsourceinvert)
p->rotated();
materiallist.insert(materiallist.end(),p);
m_materiallist.erase(iter3);
}
}
for(iter1=materiallist.begin();iter1!=materiallist.end();iter1++)
{
m_materiallist.insert(m_materiallist.end(),(*iter1));
}
materiallist.clear();
}
double ctypeset::go()
{
double dret=0;
list<cmaterial*> List;
list<cmaterial*>::iterator iter;
sort();
typeset(m_desktop.m_dx,m_desktop.m_dy,
m_desktop.m_dwidth,m_desktop.m_dheight,&List);
m_materiallist.clear();
for(iter=List.begin();iter!=List.end();iter++)
{
if((*iter)->m_dx<zero)
{
dret+=(*iter)->m_dy;
}
(*iter)->m_bused=false;
(*iter)->m_bseletcted=false;
m_materiallist.insert(m_materiallist.end(),(*iter));
}
List.clear();
return dret;
}
double ctypeset::typeset(double dstartx,double dstarty,double dstarthei,double dstartwid,
list<cmaterial*> *plist)
{
cmaterial *tmpunit=NULL;
list<cmaterial*>::iterator iter,iter1;
double darea1,darea2,darea;//横放和竖放时的排样面积,和最后方案的排样面积
double drestarea1,drestarea2;//横放和竖放时排样后的剩余面积
list<cmaterial*> list1,list2;////横放和竖放时的最佳排样序列
double dheight,dwidth;
dheight=dstarthei;
dwidth=dstartwid;
if(m_materiallist.empty())
return 0;
for(iter=m_materiallist.begin();iter!=m_materiallist.end();iter++)
{
if((*iter)->m_bused!=false)
continue;
if((*iter)->m_dwidth<(*iter)->m_dheight)
{
//MessageBox(NULL,"错误","error",MB_OK);
return 0;
}
//找出一张能放入的最大的没有排过的板材
//如果板材横竖都能放入
if(((dheight>(*iter)->m_dwidth-zero)&&(dwidth>(*iter)->m_dheight-zero))
&&((dheight>(*iter)->m_dheight-zero)&&(dwidth>(*iter)->m_dwidth-zero)))
{
if(dstartx<zero)
dwidth=(*iter)->m_dheight;
(*iter)->setused(true);//对该图排样
//先横着放入继续排样,计算剩余面积
darea1=typeset(dstartx+(*iter)->m_dwidth,dstarty,
dheight-(*iter)->m_dwidth,(*iter)->m_dheight,&list1);
drestarea1=dheight*dwidth-darea1-(*iter)->getarea();
drestarea1=drestarea1/(dheight*dwidth);//剩余面积率
//将刚才排过的板材状态还原,再竖直放入该图继续排样,计算剩余面积
if(dstartx<zero)
dwidth=(*iter)->m_dwidth;
setstatus(&list1,false);
tmpunit=(*iter)->copy();
tmpunit->rotated();
darea2=typeset(dstartx+tmpunit->m_dwidth,dstarty,
dheight-tmpunit->m_dwidth,tmpunit->m_dheight,&list2);
drestarea2=dheight*dwidth-darea2-tmpunit->getarea();
drestarea2=drestarea2/(dheight*dwidth);//剩余面积率
}
else if((dheight>(*iter)->m_dwidth-zero)&&(dwidth>(*iter)->m_dheight-zero))//如果板材只能横着放入
{
if(dstartx<zero)
dwidth=(*iter)->m_dheight;
(*iter)->setused(true);//对该图排样
darea1=typeset(dstartx+(*iter)->m_dwidth,dstarty,
dheight-(*iter)->m_dwidth,(*iter)->m_dheight,&list1);
drestarea1=dheight*dwidth-darea1-(*iter)->getarea();
drestarea1=drestarea1/(dheight*dwidth);//剩余面积率
drestarea2=drestarea1+10;//不再尝试竖放,将竖放剩余面积设大
}
else if((dheight>(*iter)->m_dheight-zero)&&(dwidth>(*iter)->m_dwidth-zero))//如果板材只能竖着放入
{
if(dstartx<zero)
dwidth=(*iter)->m_dwidth;
(*iter)->setused(true);//对该图排样
tmpunit=(*iter)->copy();
tmpunit->rotated();
darea2=typeset(dstartx+tmpunit->m_dwidth,dstarty,
dheight-tmpunit->m_dwidth,tmpunit->m_dheight,&list2);
drestarea2=dheight*dwidth-darea2-tmpunit->getarea();
drestarea2=drestarea2/(dheight*dwidth);//剩余面积率
drestarea1=drestarea2+10;//不再尝试横放,将横放剩余面积设大
}
else
continue;
//记录优化的排样序列
cmaterial *tmp=NULL;
if(drestarea1<drestarea2+zero)//当前板材横向排结果优化
{
setstatus(&list2,false);//将纵向排的排样序列还原状态
setstatus(&list1,true);//将横向排的排样序列标志为使用
darea=darea1+(*iter)->getarea();;
tmp=(*iter)->copy();
tmp->m_dx=(int)dstartx;
tmp->m_dy=(int)dstarty;
plist->insert(plist->end(),tmp);
while(!list1.empty())
{
iter1=list1.begin();
plist->insert(plist->end(),*iter1);
list1.erase(iter1);
}
//释放不好的序列
for(iter1=list2.begin();iter1!=list2.end();iter1++)
{
delete (*iter1);
}
list2.clear();
delete tmpunit;
}
else//当前板材纵向排结果优化
{
setsta
没有合适的资源?快使用搜索试试~ 我知道了~
c语言的 板材切割 源码。可用于一刀切的玻璃切割等,c语言的 板材切割 源码。可用于一刀切的玻璃切割 等
资源详情
资源评论
资源推荐
收起资源包目录
c源码.7z (2个子文件)
c源码
TypeSet.txt 9KB
TypeSet (2).txt 2KB
共 2 条
- 1
Luoxiaoo
- 粉丝: 2
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0