mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-18 21:30:38 +01:00
Graph: Draw axis and grid
Change-Id: I06d01dfbf7f45920aa32fd5c85819c75309fbfc4
This commit is contained in:
@@ -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));
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user