源码在最后面有下载,是入行一年时的项目。虽然简陋,却是我人生中的重要里程碑。一直想把背后的故事讲出来,但代码长得丑陋不好意思拿出来。
眼见年终了,丑代码放出来图大家一乐,如果有人学到东西或被后面的故事激起斗志,更是功德一件。
功能介绍:一个大片(图中m1-m4四个红色标记点组成),指定旋转角度,最多能切割成多少黑灰色的小片。
输入:见图,小片宽高,大片宽高,角度。
输出:最大切片数。
技术涉及屏幕坐标系,数学和几何计算,画图,多线程。
完整的项目有串口控制通信和一些实际工程的代码,和硬件绑定在一起叫自动切割系统,成功申请到工艺发明专利。
主要任务是CPU计算,那时电脑主流是双核,所以只开了两个线程,多开无益。
核心算法原理:
将大片(以四点坐标表示)沿x,y两个方向平移,记录每次平移的坐标和小片数量,最后取最大数量的那个坐标,即为最佳位置。
private BoardCut compute(GlobalVar param) { //1,计算所有切法的结果集。 List<BoardCut> 大片list = CoreMethod(param); //2,选取能达到最大数量的结果集 List<BoardCut> maxList = 大片list.Where(m => m.smallNum >= param.maxNum).ToList(); //3,最大数量结果集中随便取一个 param.boardCutlast = maxList[maxList.Count / 2]; //4,平移到合适的位置 float[] rectangleScope = core.getRectangleScope(param.boardCutlast.point4);//计算多边形pmax的范围 float dx = 1200 - rectangleScope[0]; float dy = 1200 - rectangleScope[2]; param.boardCutlast.Move(dx, dy); return param.boardCutlast; }
for (int i = theadParam.xStart; i < theadParam.xEnd; i++) { //每次Y方向循环走完一次,回到y起点,x则加1进行下一次循环 board.P0.X = x1 + i; board.P1.X = x2 + i; board.P2.X = x3 + i; board.P3.X = x4 + i; board.P0.Y = y1; board.P1.Y = y2; board.P2.Y = y3; board.P3.Y = y4; for (int j = 0; j < gVar.inSmallHight + 1; j++) { board.P0.Y = y1 + j; board.P1.Y = y2 + j; board.P2.Y = y3 + j; board.P3.Y = y4 + j; BoardCut boardCut = new BoardCut(); boardCut.point4 = new PointF[] { board.P0, board.P1, board.P2, board.P3 };//大片坐标 List<MyRectangle> validRect = new List<MyRectangle>(); //对整个网格矩形,如在大片内则数量加1 int Mun = 0; foreach (MyRectangle r in gVar.rectangles) { if (core.RectIsInBoard(r, boardCut.point4)) { Mun += 1; validRect.Add(r); } } boardCut.smallNum = Mun; boardCut.smallList = validRect; BoardCutList.Add(boardCut); if (Mun > gVar.maxNum) { gVar.maxNum = Mun; } } }
------------------故事分割线----------------------------------------------------------------------------
选择程序员是一个悲伤的故事。没有学历,专业又冷门,找点正式的工作到处碰壁。没有任何亲戚朋友的支持和交流,绝望之余只好虚拟出了一个”系统”和自己对话。
系统悄悄地对你说:你在地球OL中选择了地狱难度,经过无数搏杀的你竟然弄没了毕业证。新手礼包没领到,裸奔出新手村连木剑都没有,结果野狗都打不死。28级了还在裸奔,也没有战斗技能,一个金币都没赚到,你的人生还真是失败。。。
我:好死不如赖活,活着就有希望。
叮,系统提示:您领悟了“看破红尘,游戏人生”,开启了上帝视角,激活天赋技能“精神胜利法”。
最后进了这家类似富士康的工厂做工人,就叫“富土康”吧。“富土康”实行早八晚九,每天早八点上班,午休一小时,晚九点下班吃晚饭。环境闷,晚餐太晚,每天中午能见到一点太阳,用暗无天日来说富土康一点都不夸张。每月最多休两天,小病也得忍着来上,否则扣工资另外罚款。工人跟机器一样只要求产量和上班时间,没有额外的动作和交谈。经常有人晕倒被送120,其中有的人没有回来过。我的时薪是5元,每月全勤刚好5*10小时*30天=1500元。
打怪打不动,就从难度低的学徒工做起吧,28级的高中矿工至少比那些18级的初中矿工强一些,总能找到理由安慰自己。
叮,系统提示:你使用了技能“打工”(说明:获得1500金币,冷却时间30天)。你使用了”精神胜利法”恢复了5点精神值。
车间是密闭的,工作服也是密不透风像搞消防的一样,我的工作是在热炉旁来回运货。而一起毕业的同学们,大部分在各大研究所做技术骨干。几个在中科院做研究生,有几个留校读研读博,还有个进了人类最强的NASA,而我在工厂做苦工。无数次做梦都回到学校在重新学习,有时在核战后的废墟上研究黑科技,有时在坟场和野鬼们合作研究灵魂学,经常半夜醒来想起一句老歌“落后就要被挨揍,永世不见日头”。
叮,系统警告:你的精神值小于5点,”精神胜利法”无法使用。请尽快学习战斗技能,否则将Game Over。
网上搜索发现程序员工资高,上手快,没有学历要求。立刻买本C++书来学习(没钱买电脑)。晚上看书时间不够,就抄几页代码到车间偷偷看。车间很闷热,热炉旁边思考代码更是满头大汗,经常想得出神被组长辱骂,旁边工友的表情是这样:
谁让我选择了地狱难度18层的“中国制造”副本呢,这时我就在心里唱“落后就要被挨揍,永世不见日头”。狼离开了草原,容易泯灭在野狗群中,甚至比野狗死得更快。
叮,系统提示:你使用技能“自我激励” 补满了精神值(技能说明:跟我一起唱“如果快乐你就拍拍手,如果落后你就被挨揍,如果落后你就被挨揍啊”)。
叮,系统提示:你获得了称号“机械狂魔”,意志+5(称号说明:作为一个工作机器,还妄想自由和力量,机器也会发疯?)。
干了三个月后,工厂内部招聘程序员,我凭那一点C++淘汰了其它的大专选手。由于学历是高中只能作为临时工拿2000工资,没有人教,直接开始做数据库程序。信息部原来是4个人用PB,Delphi,C#3种语言,我加入后变成5个人用4种开发语言。后来被VS强大的IDE折服,转用C#开发数据库程序,在博客园安了家。
叮,系统提示:恭喜你!您获得了技能“写代码”,你获得了称号“程序猿”。
一年后,用这个软件改进了车间的传统切割排版工艺(已经使用10多年),每年节省几百万的原料费,并申请专利成功。被高层”破格提拨”为正式开发人员,享受本科毕业生的4000月薪待遇。
叮,系统提示:你在30级之前终于达到玩家的平均水平,获得成就“赶上最后一班车”。额外提示:如未获得该成就你将会悲壮唱一辈子的永世不见日头,获该成就你会唱得快乐一些。“如果快乐你就拍拍手,如果落后你就被挨揍”。
这个里程碑对于别人可能是微不足道的,但对我来说是改变命运的关键。2015年终回顾,分享这个项目,希望对一些人有帮助。
工厂、监狱和某某,都是很相似的。都是等级森严,管理严格。都是把属于你的夺走,然后再还给你让你感恩戴德。都是让人为吃口饱饭而劳碌,没有时间胡思乱想,实现稳定与和谐。
也许工厂老板看了会不高兴,但那又如何。也许身体被工作和家庭绑定无法挣脱,但心是自由的。
源码下载:http://files.cnblogs.com/files/zkp2010/大片切小片.rar