二维矩形装箱问题

2023-10-26

装箱问题,是个NP问题。至于装箱问题到底是个什么东西,可以看看百度文档http://wenku.baidu.com/view/f6e7f80590c69ec3d5bb755f.html。其实我没看。

研究二维矩形装箱问题,是因为需要将小图拼成大图,作为一个大的texture加载到内存内,从而实现减少内存消耗的目的。

做游戏的都知道texturepacker工具,一款付费软件,有无限多个破解安装程序。

texturepacker就是将小图合成为一张大图,导出png图像,以及含有小图大小,位置信息的plist文本文件。

给布置的作业,其实是让用设计模式完成一款texturepacker类工具,可惜编程能力不强,另一方面比较懒,不想去做可视化界面,于是就只找了篇硕士论文,按照论文内提到的一种算法,写了写程序。

论文是:二维矩形条带装箱问题的底部左齐择优匹配算法。不知道原作者是高兴还是忧伤我酱紫给他做广告。

程序运行环境为:cocos2dx 3.0, vs2012.

 1 #ifndef __HELLOWORLD_SCENE_H__
 2 #define __HELLOWORLD_SCENE_H__
 3 
 4 #include "cocos2d.h"
 5 #include "BigImage.h"
 6 #include "BaseObject.h"
 7 #include "LLABF_Algorithm.h"
 8 
 9 class BigImage;
10 class HelloWorld : public cocos2d::Layer
11 {
12 public:
13     ~HelloWorld();
14     // there's no 'id' in cpp, so we recommend returning the class instance pointer
15     static cocos2d::Scene* createScene();
16 
17     // Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
18     virtual bool init();  
19     
20     // a selector callback
21     void menuCloseCallback(cocos2d::Ref* pSender);
22     
23     void initSimpleImageInfo( SimpleImageInfo * simpleImage );
24 
25     // implement the "static create()" method manually
26     CREATE_FUNC(HelloWorld);
27 
28     std::vector<SimpleImageInfo*> imageInfos;
29 
30     // 图像像素拷贝   将一张图的内容复制到另一张大图中   
31     void copyPixels();
32 
33     BigImage * m_bigImage;
34     void initTestImageInfos();
35     void initTestDictionary();
36 };
37 
38 #endif // __HELLOWORLD_SCENE_H__
HelloWorldScene.h
  1 #include "HelloWorldScene.h"
  2 #include "cocos2d/external/png/include/win32/png.h"
  3 #include  <math.h>
  4 #include  <iostream>
  5 #include  <fstream>
  6 #include  <string>
  7 
  8 using namespace std;
  9 
 10 USING_NS_CC;
 11 
 12 Scene* HelloWorld::createScene()
 13 {
 14     auto scene = Scene::create();
 15     auto layer = HelloWorld::create();
 16     scene->addChild(layer);
 17     return scene;
 18 }
 19 
 20 bool HelloWorld::init()
 21 {
 22     if ( !Layer::init() )
 23     {
 24         return false;
 25     }
 26 
 27     Size visibleSize = Director::getInstance()->getVisibleSize();
 28     Point origin = Director::getInstance()->getVisibleOrigin();
 29     auto closeItem = MenuItemImage::create(
 30                                            "CloseNormal.png",
 31                                            "CloseSelected.png",
 32                                            CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
 33     
 34     closeItem->setPosition(Point(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
 35                                 origin.y + closeItem->getContentSize().height/2));
 36     auto menu = Menu::create(closeItem, NULL);
 37     menu->setPosition(Point::ZERO);
 38     this->addChild(menu, 1);
 39     auto label = LabelTTF::create("Hello World", "Arial", 24);
 40 
 41     label->setPosition(Point(origin.x + visibleSize.width/2,
 42                             origin.y + visibleSize.height - label->getContentSize().height));
 43 
 44     return true;
 45 }
 46 
 47 
 48 void HelloWorld::menuCloseCallback(Ref* pSender)
 49 {
 50 #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
 51     MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");
 52     return;
 53 #endif
 54     imageInfos.clear();
 55     system("dir /b *.png > untitled.plist");
 56     int bigImageWidth = 512;
 57     string fullPath = FileUtils::getInstance()->fullPathForFilename("untitled.plist");
 58     string filecontent = FileUtils::getInstance()->getStringFromFile(fullPath);
 59     ifstream fp( fullPath );
 60     if (!fp)
 61     {
 62         cerr << "OPEN ERROR" << endl;
 63         return ;
 64     }
 65 
 66     if ( fp )
 67     {
 68         string s;
 69         while (getline(fp,s))
 70         {
 71             SimpleImageInfo * image = new SimpleImageInfo();
 72             image->imageName = s;
 73             imageInfos.push_back(image);
 74             CCLog( s.c_str()) ;
 75         }
 76         fp.close();
 77 
 78         // 初始化I   
 79         for ( int i = 0; i< imageInfos.size(); i++ )
 80         {
 81             initSimpleImageInfo(imageInfos[i]);
 82             imageInfos[i]->id = i;
 83         }
 84         LLABF * llabf = new LLABF();
 85         llabf->initImages(imageInfos, bigImageWidth );
 86         llabf->runLLABF();
 87         
 88 
 89 
 90         m_bigImage = new BigImage("my_test_1.png",bigImageWidth,llabf->getBigImageHeight(),"my_test_1.plist");
 91         m_bigImage->initBigImageWithImagesData(&imageInfos);
 92         m_bigImage->publish();
 93     }
 94 
 95     CCLog("end");
 96 
 97     //SpriteFrameCache::getInstance()->addSpriteFramesWithFile("my_test_1.plist");
 98     //auto sprite = Sprite::createWithSpriteFrameName("a1.png");
 99     //sprite->setPosition( 300, 300);
100     //this->addChild(sprite, 1000);
101 
102 #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
103     exit(0);
104 #endif
105 }
106 
107 void HelloWorld::initSimpleImageInfo( SimpleImageInfo * simpleImage )
108 {
109     // 读取png文件头    
110         std::string fullPath_png = FileUtils::getInstance()->fullPathForFilename( simpleImage->imageName );
111         unsigned char header[8];
112         int width, height;
113         png_byte color_type; //图片到类型(可能会用在是否是开启来通道)  
114         png_byte bit_depth; //字节深度  
115 
116         png_structp png_ptr;  // 图片  
117         png_infop info_ptr;   // 图片的信息  
118         int number_of_passes;// 隔行扫描  
119         png_bytep * row_pointers;// 图片的数据内容  
120         int  row, col, pos; // 用于改变png像素排列的问题  
121         GLubyte * rgba;
122 
123         FILE * fp = fopen( fullPath_png.c_str(), "rb");
124         if ( !fp )
125         {
126             fclose(fp);
127             return;
128         }
129         fread(header, 1, 8, fp);
130         if ( png_sig_cmp(header, 0, 8 ))  // 读取文件头判断是否是png图片,不是则做出相应处理   
131         {
132             fclose(fp);
133             return;
134         }
135         //根据libpng的libpng-manual.txt的说明使用文档 接下来必须初始化png_structp 和 png_infop  
136         png_ptr=png_create_read_struct(PNG_LIBPNG_VER_STRING,NULL,NULL,NULL); //后三个是绑定错误以及警告的函数这里设置为空  
137 
138         if(!png_ptr)
139         {
140             fclose(fp);
141             return;
142         }
143         //根据初始化的png_ptr初始化png_infop  
144         info_ptr=png_create_info_struct(png_ptr);  
145         if(!info_ptr)  
146         {  
147             //初始化失败以后销毁png_structp  
148             png_destroy_read_struct(&png_ptr,(png_infopp)NULL,(png_infopp)NULL);  
149             fclose(fp);  
150             return ;  
151         }  
152         //老老实实按照libpng给到的说明稳定步骤来  错误处理!  
153         if (setjmp(png_jmpbuf(png_ptr)))  
154         {  
155             //释放占用的内存!然后关闭文件返回一个贴图ID此处应该调用一个生成默认贴图返回ID的函数  
156 
157             png_destroy_read_struct(&png_ptr,(png_infopp)NULL,(png_infopp)NULL);  
158 
159             fclose(fp);  
160 
161             return ;  
162 
163         }  
164         //你需要确保是通过2进制打开的文件。通过i/o定制函数png_init_io  
165         png_init_io(png_ptr,fp);  
166         //似乎是说要告诉libpng文件从第几个开始missing  
167         png_set_sig_bytes(png_ptr, 8);  
168         //如果你只想简单的操作你现在可以实际读取图片信息了!  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二维矩形装箱问题 的相关文章

  • MySQL 一对多转 JSON 格式

    我有两个 MySQL 表 User id name Sale id user item Where Sale user 是一个外键User id 所以这是一种一对多的关系 一个用户可以进行多次销售 我试图从数据库中获取它并以 JSON 格式
  • 模拟 with 语句中使用的类

    我有一堂课有一个 exit and enter 函数 以便我可以在 with 语句中使用它 例如 with ClassName as c c do something 我现在正在尝试编写一个单元测试来测试这一点 基本上 我想测试一下do s
  • 如何中断 java.util.Scanner nextLine 调用

    我正在使用多线程环境 其中一个线程通过重复调用不断侦听用户输入scanner nextLine 要结束应用程序 此运行循环将由另一个线程停止 但侦听线程不会停止 直到最后一个用户输入完成 由于nextLine 关闭流似乎不是一个选择 因为我
  • Selenium Python:如何在点击后等待页面加载?

    我想在点击后获取页面的页面源 然后使用 browser back 函数返回 但是 Selenium 不会让页面在点击后完全加载 并且 JavaScript 生成的内容不会包含在该页面的页面源中 element i click Need to
  • python条件运算符中“and”和“&”的奇怪行为[重复]

    这个问题在这里已经有答案了 以下是使用 和 and 条件运算符尝试的不同场景及其结果 使用Python 2 7 使用 运算符 使用 与 运算符 想知道为什么两个条件运算符表现出不同的行为 用真实场景进行解释会很有帮助 提前致谢 is not
  • Android 和 PhoneGap——在 NPObject 上调用方法时出错

    我正在尝试设置FLAG SHOW WHEN LOCKED在我的phonegap应用程序中 但仅当显示特定页面时 为此 我有一个 Java 插件 扩展自CordovaPlugin在以下代码中execute method if action e
  • 如何指定 Perl 的 Inline::Python 模块正在使用的 Python 版本?

    我正在运行 Debian squeeze 和 perl v5 10 1 并且安装了两个版本的 python pyversions i python2 5 python2 6 Python Inline显然使用python2 5 perl u
  • wxPython 上的 IPython

    我一直在尝试找到一种方法 让 IPython Shell 能够在wx Frame 在库代码或 Google 中搜索 基于 wxPython 的 IPython 小部件 https www google com search q wxPyth
  • 南迁:“数据库后端不接受0作为AutoField的值”(mysql)

    我是 django 的新手 并试图将外键返回给受让人和记者的用户 但是当我尝试对 South 应用更改时 我收到错误 ValueError The database backend does not accept 0 as a value
  • Apache Commons CLI - 在帮助输出中打印尾随参数

    我正在使用 Apache Commons CLI 1 2 来解析最后带有选项和额外参数的命令行 前任 mycmd d DIR extra stuff 我知道如何使用获得 额外 和 东西 CommandLine getArgs 但我不知道如何
  • 使用 Memcache 缓存 Matplotlib(不会 Pickle)

    我有一个图表 渲染需要 3 秒 然后可以从所述图表中添加一些内容来制作子图表 我想缓存主图表中的轴 以便稍后在渲染子图表时检索并修改它 我怎样才能克服这个错误 这是一个示例测试代码 import pylibmc cache pylibmc
  • 在 HTML5 websocket 服务器中切割媒体流,用于基于网络的聊天/视频会议应用程序

    我们目前正在开发一个聊天 文件共享 视频会议应用程序使用 HTML5 websocket https stackoverflow com questions 4220672 implementing webbased real time v
  • 为什么 Java 和 C# 没有隐式转换为布尔值?

    自从我开始使用 Java 以来 它不支持从数字类型到布尔值的隐式转换 这对我来说非常恼火 所以你不能做这样的事情 if flags 0x80 相反 你必须经历这种疯狂 if flags 0x80 0 null 和对象也是如此 我所知道的所有
  • JAVA - 如何将一个对象的属性复制到另一个具有相同属性的对象?

    假设我们有一个对象 A 定义如下 public class ObjectA private Attribute a1 private Attribute a2 private Attribute a3 由于某种原因 我需要创建第二个对象 B
  • 如何在 Jupyter Notebook 中加载 CSV 文件?

    我是新人 正在研究机器学习 我偶然发现了一个在网上找到的教程 我想让该程序运行起来 这样我就能更好地理解 但是 我在将 CSV 文件加载到 Jupyter Notebook 时遇到问题 我收到此错误 File
  • 如何识别 Pandas 的 Parquet 后端

    据我所知 Pandas 可以使用不同的后端读取和写入 Parquet 文件 pyarrow and fastparquet 我有一个带有 Intel 发行版的 Conda 发行版 并且 它可以工作 我可以使用pandas DataFrame
  • GenJar 更换或更新?

    GenJar 是一个专门的 Ant 任务 它基于类依赖关系而不是简单地基于目录的内容构建 jar 文件 http genjar sourceforge net http genjar sourceforge net 确实有用 但是项目好像不
  • Django 无法导入设置

    我正在尝试在我的项目中使用 django admin dbshel l 任何其他 cmd 都会给出相同的结果 我得到了 You must either define the environment variable DJANGO SETTI
  • BouncyCastle 安装问题

    我正在尝试将 BouncyCastle 添加为 Windows XP Pro 上的安全提供程序 以便我可以根据说明使用它向 Android 应用程序添加一些证书here http blog crazybob org 2010 02 andr
  • 在Java中,在哪里放置代码以在窗口关闭时可靠地触发?

    我有几个窗口 我想在用户采取操作关闭窗口 通过标题栏中的按钮 菜单项或我提供的按钮 之后和处理窗口之前保存默认值 有些窗口我可以DISPOSE ON CLOSE 但有些窗口我需要在它们被dispose 之前提供信息 窗体窗口关闭 http

随机推荐

  • vue3中使用jweixin-module报错

    在vue3中使用 var jweixin require jweixin module 会编译报错 require is not defined 没有require模块 改成import的话 由于jweixin module不支持expor
  • REDIS 4 集群搭建

    REDIS 4 集群搭建 1 下载 redis wget http download redis io releases redis 4 0 10 tar gz tar xzf redis 4 0 10 tar gz cd redis 4
  • [学习笔记]Centos7虚拟机网络重启失败

    好久没用虚拟机了 这次学习的时候打开之前安装好的Centos7发现又连不了网了 在网上跟着教程配置好IP之后重启网络服务 执行service network restart命令 出现了错误 Restarting network via sy
  • Install ModelSim on Linux

    To use ModelSim on Linux is quite difficult There is only exe file for installing ModelSim on Windows on the official we
  • php的phpstoem代码编辑器的快捷键,比较常用的归纳

    1 CTRL SHIFT N 全局搜索文件 优先文件名匹配的文件 2 CTRL R 当前窗口替换文本 3 CTRL E 最近打开的文件 4 F5 复制文件 文件夹 5 CTRL C 复制 CTRL V 粘贴 CTRL X 剪切 删除行 Ct
  • Linux 面试题-(腾讯,百度,美团,滴滴)

    Linux 面试题 腾讯 百度 美团 滴滴 分析日志t log 访问量 将各个ip 地址截取 并统计出现次数 并按从大到小排序 腾讯 http 192 168 200 10 index1 html http 192 168 200 10 i
  • 用两成数据也能训练出十成功力的模型,Jina Embeddings 这么做

    句向量 Sentence Embeddings 模型在多模态人工智能领域起着至关重要的作用 它通过将句子编码为固定长度的向量表示 将语义信息转化为机器可以处理的形式 在 文本分类 信息检索和相似度计算 等多个方面有着广泛应用 然而长期以来
  • unity 动画 - Animator 的使用

    创建 animator 文件 命名为 nanzhanshi2 controller 双击打开文件 默认三个 State AnyState Entry Exit Parameters 有四种类型的参数 Float Int Bool Trigg
  • cocos控制相机旋转

    import decorator Component Event EventMouse find Input input Node v3 Vec3 from cc const ccclass property decorator cccla
  • 1.Cherry Pick与Create Patch的区别

    Cherry Pick与Create Patch的区别 结论 实验 场景1 应用时无冲突 场景2 应用时产生冲突 使用cherry pick 使用patch 场景3 产生冲突 并且有其他文件的变更 原理 结论 1 应用无冲突时cherry
  • Java全栈体系路线(总结不易,持续更新中)

    文章目录 Java全栈工程师 font color orange Java基础 基础语法 面向对象 工具类 集合框架 序列化 反射机制 注解 文件处理 设计模式 视频教程 文档教程 练习题 面试题 GUI模块 多线程模块 Socket模块
  • VS2019修改代码后必须重新生成解决方案

    这是因为没有配置好 在工具 gt 选项 gt 生成和运行 gt 运行时 项目过期 在这里选择始终生成 这样的话就可以在修改代码之后自动重新生成解决方案
  • 钉钉环境下H5开发微应用遇到的问题和BUG(持续更新)

    项目类型 CRM 项目描述 微应用是钉钉为连接企业办公打造的移动入口 通过微应用你可以将企业的业务审批 内部系统 生成 协作 管理 上下游沟通连接到钉钉 该项目是在钉钉的基础上开发一个供本公司销售使用的客户管理系统 包含了客户 项目 订单
  • mysql实现行转列作为临时表、以及字符分割行转列

    1 需求 实现两个日期段转换为具体的日期天数 2022 10 23至2022 10 26得到一张2022 10 23 2022 10 24 2022 10 25 2022 10 26的临时表 SELECT DATE FORMAT DATE
  • vivado关联第三方编辑器

    前言 可忽略不看 绑定vivado的第三方编辑器的时候 本人曾经看过一些教程 但是对于路径的设置看的一头雾水 所以就把路径构成记录了下来 希望对你有帮助 需要关键在于step6中的路径格式 路径的格式简单分为三个部分 需要绑定的编辑器的路径
  • java中匿名内部类的匿名构造函数是怎么用的

    java中匿名内部类的匿名构造函数是怎么用的 下面的例子说明匿名内部类的匿名构造函数的用法 例2 7 2 0 interface FigureMark to win void whoAmI public class Test public
  • 刀片服务器切换显示,刀片机服务器切换

    刀片机服务器切换 内容精选 换一换 当保护组的生产站点发生故障时 将保护组的生产站点切到当前的容灾站点 即另一端AZ 启用当前容灾站点的云硬盘以及云服务器等资源 故障切换完成之后 保护组的当前生产站点变成故障切换发生之前的容灾站点 且生产站
  • 大数据开源框架之HBase编程实践

    HBase的安装部署请看 30条消息 大数据开源框架环境搭建 五 Hbase完全分布式集群的安装部署 木子一个Lee的博客 CSDN博客 目录 任务1 用HBase提供的HBase Shell命令实现以下指定功能 1 列出HBase所有的表
  • 我的创作纪念日

    机缘 我热爱编程 热爱解决问题 也享受在解决问题的过程中遇到的挑战 在大学的学习过程中 我发现将学习过程和解决问题的过程记录下来能够帮助我更深入地理解知识和技术 同时也为未来遇到类似问题提供了参考 我开始将我的学习笔记分享给同学们 收到了非
  • 二维矩形装箱问题

    装箱问题 是个NP问题 至于装箱问题到底是个什么东西 可以看看百度文档http wenku baidu com view f6e7f80590c69ec3d5bb755f html 其实我没看 研究二维矩形装箱问题 是因为需要将小图拼成大图