Graph: Draw axis and grid

Change-Id: I06d01dfbf7f45920aa32fd5c85819c75309fbfc4
This commit is contained in:
Romain Goyet
2016-06-21 11:45:58 +02:00
parent fa8e23c9a7
commit eed0f4af95
2 changed files with 93 additions and 23 deletions

View File

@@ -1,9 +1,19 @@
#include "graph_view.h"
constexpr KDColor kAxisColor = KDColorGray(0x0);
constexpr KDColor kMainGridColor = KDColorGray(0xCC);
constexpr KDColor kSecondaryGridColor = KDColorGray(0xEE);
constexpr int kNumberOfMainGridLines = 5;
constexpr int kNumberOfSecondaryGridLines = 5;
GraphView::GraphView() :
View(),
m_cursorView(CursorView()),
m_cursorPosition(KDPointZero)
m_cursorPosition(KDPointZero),
m_xMin(-2.0f),
m_xMax(2.0f),
m_yMin(-2.0f),
m_yMax(2.0f)
{
}
@@ -30,29 +40,72 @@ void GraphView::layoutSubviews() {
void GraphView::drawRect(KDRect rect) const {
KDFillRect(rect, KDColorWhite);
KDCoordinate x_grid_step = m_frame.width/10;
KDCoordinate y_grid_step = m_frame.height/10;
KDColor gridColor = KDColorGray(0xEE);
for (KDCoordinate x=0; x<m_frame.width; x += x_grid_step) {
KDRect verticalGridRect;
verticalGridRect.x = x;
verticalGridRect.y = 0;
verticalGridRect.width = 1;
verticalGridRect.height = m_frame.height;
KDFillRect(verticalGridRect, gridColor);
drawGrid(rect);
drawAxis(rect);
drawFunction(rect);
}
void GraphView::drawHorizontalLine(KDRect rect, float y, KDColor color) const {
KDRect lineRect;
lineRect.x = rect.x;
lineRect.y = floatToYPixel(y);
lineRect.width = rect.width;
lineRect.height = 1;
KDFillRect(lineRect, color);
}
void GraphView::drawVerticalLine(KDRect rect, float x, KDColor color) const {
KDRect lineRect;
lineRect.x = floatToXPixel(x);
lineRect.y = rect.y;
lineRect.width = 1;
lineRect.height = rect.height;
KDFillRect(lineRect, color);
}
void GraphView::drawAxis(KDRect rect) const {
drawHorizontalLine(rect, 0.0f, kAxisColor);
drawVerticalLine(rect, 0.0f, kAxisColor);
}
void GraphView::drawGrid(KDRect rect) const {
float xRange = m_xMax - m_xMin;
float xGridStep = xRange/kNumberOfMainGridLines;
float xGridStart = xGridStep*((int)(m_xMin/xGridStep));
for (int i=0; i<kNumberOfMainGridLines; i++) {
drawVerticalLine(rect, xGridStart+i*xGridStep, kMainGridColor);
}
for (KDCoordinate y=0; y<m_frame.height; y += y_grid_step) {
KDRect horizontalGridRect;
horizontalGridRect.x = 0;
horizontalGridRect.y = y;
horizontalGridRect.width = m_frame.width;
horizontalGridRect.height = 1;
KDFillRect(horizontalGridRect, gridColor);
float yRange = m_yMax - m_yMin;
float yGridStep = yRange/kNumberOfMainGridLines;
float yGridStart = yGridStep*((int)(m_yMin/yGridStep));
for (int i=0; i<kNumberOfMainGridLines; i++) {
drawHorizontalLine(rect, yGridStart+i*yGridStep, kMainGridColor);
}
for (int i=0; i<m_frame.width; i++) {
KDPoint p;
p.x = i;
p.y = (i*i)/m_frame.height;
}
float GraphView::xPixelToFloat(int xPixel) const {
return m_xMin + xPixel*(m_xMax-m_xMin)/m_frame.width;
}
float GraphView::yPixelToFloat(int yPixel) const {
return m_yMin + yPixel*(m_yMax-m_yMin)/m_frame.height;
}
KDCoordinate GraphView::floatToYPixel(float y) const {
return m_frame.height*(m_yMax-y)/(m_yMax-m_yMin);
}
KDCoordinate GraphView::floatToXPixel(float x) const {
return m_frame.width*(m_xMax-x)/(m_xMax-m_xMin);
}
void GraphView::drawFunction(KDRect rect) const {
KDPoint p = KDPointZero;
for (p.x=rect.x; p.x<(rect.x+rect.width); p.x++) {
float x = xPixelToFloat(p.x);
float y = (x-1)*(x+1)*x;
p.y = floatToYPixel(y);
KDSetPixel(p, KDColorRGB(0x7F, 0, 0));
}
};
}

View File

@@ -14,8 +14,25 @@ private:
View * subviewAtIndex(int index) override;
void layoutSubviews() override;
float xPixelToFloat(int xPixel) const;
float yPixelToFloat(int yPixel) const;
KDCoordinate floatToXPixel(float x) const;
KDCoordinate floatToYPixel(float y) const;
void drawHorizontalLine(KDRect rect, float y, KDColor color) const;
void drawVerticalLine(KDRect rect, float x, KDColor color) const;
void drawAxis(KDRect rect) const;
void drawGrid(KDRect rect) const;
void drawFunction(KDRect rect) const;
CursorView m_cursorView;
KDPoint m_cursorPosition;
float m_xMin;
float m_xMax;
float m_yMin;
float m_yMax;
};
#endif