Cocos2d3.0 画折线图
来源:互联网 发布:法语助手软件过期 编辑:程序博客网 时间:2024/06/05 18:45
实现用2dx画折线图,为以后用2dx开发应用做准备
下面记录下使用方法
auto lineView = DJLineChart::create(); std::vector<float> vec; vec.push_back(130); vec.push_back(520); vec.push_back(60); vec.push_back(0); vec.push_back(140); vec.push_back(100); vec.push_back(30); vec.push_back(80); //设置只有正数为true 有负数为false lineView->m_zfBool = true; lineView->setData(vec); lineView->setPosition(Point(0, VisibleRect::center().y)); lineView->setContentSize(Size(VisibleRect::getVisibleRect().size.width, VisibleRect::getVisibleRect().size.height * 2 /3)); addChild(lineView);
画图类
DJLineChart.h
//// DJLineChart.h// Test890//// Created by 杜甲 on 14-4-28.////#ifndef __Test890__DJLineChart__#define __Test890__DJLineChart__#include "cocos2d.h"#include "VisibleRect.h"using namespace cocos2d;using namespace std;class DJLineChart:public Layer { public: CREATE_FUNC(DJLineChart); virtual bool init(); CC_SYNTHESIZE(int, _hInterval, HInterval); CC_SYNTHESIZE(int, _vInterval, VInterval); Vector<float>* firstVec; void draw(cocos2d::Renderer *renderer, const kmMat4 &transform, bool transformUpdated); double getMaxValue(std::vector<Point> vec); std::vector<Point> pointvec; void drawLine(vector<Point> vec,Color4B lineColor,Color4B dotColor); void setData(std::vector<float> data); float spaceRatio ; //y轴间距系数 float leftRatioX; //x轴左侧间距系数 int maxValue1; //数据中的最大值 float layerHeight1 ; //图离底部的距离 bool m_zfBool; //是否有负数的判断 true 为只有正数 false 为有正有负protected: void onDraw(const kmMat4 &transform, bool transformUpdated); CustomCommand _customCommand; };#endif /* defined(__Test890__DJLineChart__) */
DJLineChart.cpp
//// DJLineChart.cpp// Test890//// Created by 杜甲 on 14-4-28.////#include "DJLineChart.h"bool DJLineChart::init(){ bool bRet = false; do { CC_BREAK_IF(!Layer::init());// auto layerColor = LayerColor::create(Color4B::GREEN);// addChild(layerColor); bRet = true; } while (0); return bRet;}void DJLineChart::draw(cocos2d::Renderer *renderer, const kmMat4 &transform, bool transformUpdated){ _customCommand.init(1); _customCommand.func = CC_CALLBACK_0(DJLineChart::onDraw, this,transform,transformUpdated); renderer->addCommand(&_customCommand); }void DJLineChart::onDraw(const kmMat4 &transform, bool transformUpdated){ kmGLPushMatrix(); kmGLLoadMatrix(&transform); int maxValue = getMaxValue(pointvec); int maxValue2 = roundf(maxValue / 100)* 100 ; maxValue1 = maxValue2 / 10; spaceRatio = 0.06f; //y轴间距系数 leftRatioX = 0.1f; //x轴左侧间距系数 int fontSize = 20; string fontName = StringUtils::format("Thonburi"); Size layerSize = this->getContentSize(); layerHeight1 = 30; float layerHeight = layerHeight1; float layerWidth = layerSize.width; /***********************画y轴标签*************************************/ DrawPrimitives::setDrawColor4B(0, 255, 255, 255); for (int i = 0; i < 11; i++) { //采用相对数值layerWidth* 0.05f 为了以后适配 Point bPoint = Point(layerWidth* leftRatioX, layerHeight ); Point ePoint = Point(layerWidth * 0.95f, layerHeight ); Label* label = nullptr; if (m_zfBool) { label = Label::createWithSystemFont(StringUtils::format("%d",maxValue1* i).c_str(), fontName.c_str(), fontSize); }else{ label = Label::createWithSystemFont(StringUtils::format("%d",maxValue1 * 2* i - maxValue2).c_str(), fontName.c_str(), fontSize); } label->setPosition(Point(layerWidth* 0.05f, layerHeight )); addChild(label); DrawPrimitives::drawLine(bPoint, ePoint); layerHeight += layerSize.height * spaceRatio; } /***********************画y轴标签***********************************END**/ drawLine(pointvec, Color4B(0, 255, 255, 255),Color4B(255, 0, 255, 255)); CHECK_GL_ERROR_DEBUG(); //end draw kmGLPopMatrix(); }void DJLineChart::drawLine(vector<Point> vec,Color4B lineColor,Color4B dotColor){ Size layerSize = this->getContentSize(); float layerWidth = layerSize.width; float tempWidth = layerSize.height * spaceRatio; float tempWidth2 = 0; float tempHeight1 = maxValue1 ; if (m_zfBool) { }else { tempWidth2 = layerSize.height * spaceRatio * 5; tempHeight1 *= 2 ; } double ratio = tempWidth/tempHeight1; /**********************画线**********************/ std::vector<Point>::iterator beforePoint; std::vector<Point>::iterator currentPoint; beforePoint = vec.begin(); DrawPrimitives::setDrawColor4B(lineColor.r, lineColor.g, lineColor.b, lineColor.a); for (currentPoint = vec.begin() + 1;currentPoint != vec.end() ; currentPoint++) { Point bPoint = *beforePoint; bPoint = Point(bPoint.x + layerWidth* leftRatioX, bPoint.y * ratio + layerHeight1 +tempWidth2); Point ePoint = *currentPoint; ePoint = Point(ePoint.x + layerWidth* leftRatioX, ePoint.y * ratio + layerHeight1 +tempWidth2); DrawPrimitives::drawLine(bPoint, ePoint); beforePoint = currentPoint; } /**********************画线*********************end*/ /********************画点和x轴标签***********************************************/ beforePoint = vec.begin(); DrawPrimitives::setDrawColor4B(dotColor.r, dotColor.g, dotColor.b, dotColor.a); Point bPoint = *beforePoint; bPoint = Point(bPoint.x +layerWidth* leftRatioX, bPoint.y * ratio + layerHeight1 +tempWidth2); DrawPrimitives::drawSolidCircle(bPoint, 8, CC_DEGREES_TO_RADIANS(90), 50, 1.0f, 1.0f); auto labelX = Label::createWithSystemFont(StringUtils::format("%d",1).c_str(), "Thonburi", 20); labelX->setPosition(Point(bPoint.x, 0)); this->addChild(labelX); int i = 2; for (currentPoint = vec.begin() + 1;currentPoint != vec.end() ; currentPoint++) { Point ePoint = *currentPoint; ePoint = Point(ePoint.x + layerWidth* leftRatioX, ePoint.y * ratio + layerHeight1 + tempWidth2); DrawPrimitives::drawSolidCircle(ePoint, 8, CC_DEGREES_TO_RADIANS(90), 50, 1.0f, 1.0f); auto labelX = Label::createWithSystemFont(StringUtils::format("%d",i).c_str(), "Thonburi", 20); labelX->setPosition(Point(ePoint.x, 0)); this->addChild(labelX); i++; } /********************画点和x轴标签*********************************************END**/ }void DJLineChart::setData(std::vector<float> data){ std::vector<float>::iterator it; int i = 0; for (it = data.begin();it != data.end();it++) { float f = *it; pointvec.push_back(Point(50 * (i+1), f)); log("%f",f); i++; } }double DJLineChart::getMaxValue(std::vector<Point> vec){ double maxY = 8; for (int i = 0; i < vec.size(); i++) { float num = vec.at(i).y; if (maxY < abs(num)) { maxY = abs(num); } } return maxY;}
效果1
效果2:
例子下载:http://download.csdn.net/detail/qqmcy/7271261
0 0
- Cocos2d3.0 画折线图
- cocos2d3.0 Scale9Sprite
- Cocos2d3.0 CheckBox
- cocos2d3.0 Scale9Sprite
- Cocos2d3.0 CheckBox
- Cocos2d3.0RC2 Android编译
- Cocos2d3.0 制作PList文件
- 使用achartengine-1.1.0画折线图
- 动态画折线图
- C# 画折线图
- gnuplot 画折线图
- AChartEngine画折线图
- iOS画折线图
- html5画折线图
- Matlab画折线图
- matlab画折线图
- Flot画折线图
- QT画折线图
- 函数
- Programming Apple Push Notification Services
- Oracle ListAgg 和 wm_concat函数
- asp.Net中Gridview动态创建模板列
- GDFSGDSFGDFGDSF
- Cocos2d3.0 画折线图
- GridView动态添加模板列
- C++的虚函数 Virtual Function
- VLC简介及使用说明(转自 自由的风 » VLC简介及使用说明)
- 类模板
- 汉诺塔java递归解法浅析
- 用UMDH检查C++程序内存泄露
- httpclient抓取百度贴吧图片
- 【九度OJ合集】P1201-P1358