源码在最后面有下载,是入行一年时的项目。虽然简陋,却是我人生中的重要里程碑。一直想把背后的故事讲出来,但代码长得丑陋不好意思拿出来。
眼见年终了,丑代码放出来图大家一乐,如果有人学到东西或被后面的故事激起斗志,更是功德一件。
功能介绍:一个大片(图中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]; [] rectangleScope = core.getRectangleScope(param.boardCutlast.point4);dx = 1200 - rectangleScope[0]; float dy = 1200 - rectangleScope[2]; param.boardCutlast.Move(dx, dy); return param.boardCutlast; }
View Code
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>(); 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; } } }
View Code
------------------故事分割线----------------------------------------------------------------------------
选择程序员是一个悲伤的故事。没有学历,专业又冷门,找点正式的工作到处碰壁。没有任何亲戚朋友的支持和交流,绝望之余只好虚拟出了一个”系统”和自己对话。
系统悄悄地对你说:你在地球OL中选择了地狱难度,经过无数搏杀的你竟然弄没了毕业证。新手礼包没领到,裸奔出新手村连木剑都没有,结果野狗都打不死。28级了还在裸奔,也没有战斗技能,一个金币都没赚到,你的人生还真是失败。。。
我:好死不如赖活,活着就有希望。
叮,系统提示:您领悟了“看破红尘,游戏人生”,开启了上帝视角,激活天赋技能“精神胜利法”。
最后进了这家类似富士康的工厂做工人,就叫“富土康”吧。“富土康”实行早八晚九,每天早八点上班,午休一小时,晚九点下班吃晚饭。环境闷,晚餐太晚,每天中午能见到一点太阳,用暗无天日来说富土康一点都不夸张。每月最多休两天,小病也得忍着来上,否则扣工资另外罚款。工人跟机器一样只要求产量和上班时间,没有额外的动作和交谈。经常有人晕倒被送120,其中有的人没有回来过。我的时薪是5元,每月全勤刚好5*10小时*30天=1500元。
打怪打不动,就从难度低的学徒工做起吧,28级的高中矿工至少比那些18级的初中矿工强一些,总能找到理由安慰自己。
叮,系统提示:你使用了技能“打工”(说明:获得1500金币,冷却时间30天)。你使用了”精神胜利法”恢复了5点精神值。
车间是密闭的,工作服也是密不透风像搞消防的一样,我的工作是在热炉旁来回运货。而一起毕业的同学们,大部分在各大研究所做技术骨干。几个在中科院做研究生,有几个留校读研读博,还有个进了人类最强的NASA,而我在工厂做苦工。无数次做梦都回到学校在重新学习,有时在核战后的废墟上研究黑科技,有时在坟场和野鬼们合作研究灵魂学,经常半夜醒来想起一句老歌“落后就要被挨揍,永世不见日头”。
叮,系统警告:你的精神值小于5点,”精神胜利法”无法使用。请尽快学习战斗技能,否则将Game Over。