#include "graph_view.h" #include constexpr KDColor kAxisColor = KDColorGray(0x0); constexpr KDColor kMainGridColor = KDColorGray(0xCC); constexpr KDColor kSecondaryGridColor = KDColorGray(0xEE); constexpr int kNumberOfMainGridLines = 5; constexpr int kNumberOfSecondaryGridLines = 4; GraphView::GraphView() : View(), m_cursorView(CursorView()), m_cursorPosition(KDPointZero), m_xMin(-2.0f), m_xMax(2.0f), m_yMin(-2.0f), m_yMax(2.0f) { } int GraphView::numberOfSubviews() const { return 1; }; View * GraphView::subviewAtIndex(int index) { return &m_cursorView; } void GraphView::moveCursorRight() { m_cursorPosition.x = m_cursorPosition.x + 2; layoutSubviews(); } void GraphView::layoutSubviews() { KDRect cursorFrame; cursorFrame.origin = m_cursorPosition; cursorFrame.width = 10; cursorFrame.height = 10; m_cursorView.setFrame(cursorFrame); } void GraphView::drawRect(KDRect rect) const { KDFillRect(rect, KDColorWhite); drawGrid(rect); drawAxes(rect); drawFunction(rect); } void GraphView::drawLine(KDRect rect, Axis axis, float coordinate, KDColor color) const { KDRect lineRect; switch(axis) { case Axis::Horizontal: lineRect.x = rect.x; lineRect.y = floatToPixel(Axis::Vertical, coordinate); lineRect.width = rect.width; lineRect.height = 1; break; case Axis::Vertical: lineRect.x = floatToPixel(Axis::Horizontal, coordinate); lineRect.y = rect.y; lineRect.width = 1; lineRect.height = rect.height; break; } KDFillRect(lineRect, color); } void GraphView::drawAxes(KDRect rect) const { drawLine(rect, Axis::Horizontal, 0.0f, kAxisColor); drawLine(rect, Axis::Vertical, 0.0f, kAxisColor); } void GraphView::drawGridLines(KDRect rect, Axis axis, int count, KDColor color) const { float range = max(axis)-min(axis); float step = range/count; float start = step*((int)(min(axis)/step)); for (int i=0; i