float Curve::getDistanceToCurve(const Point& point) const { reevaluate(); Point ptEvaluatedPt(point.x, evaluateCurveAt(point.x)); float delta_x = point.x - ptEvaluatedPt.x; float delta_y = point.y - ptEvaluatedPt.y; float distance = sqrt(delta_x * delta_x + delta_y * delta_y); return distance; }
float Curve::evaluateCurveAt(const float x) const { reevaluate(); float value = 0.0f; if (m_ptvEvaluatedCurvePts.size() == 1) return m_ptvEvaluatedCurvePts[0].y; if (m_ptvEvaluatedCurvePts.size() > 1) { std::vector<Point>::iterator first_point = m_ptvEvaluatedCurvePts.begin(); std::vector<Point>::iterator last_point = m_ptvEvaluatedCurvePts.end() - 1; bool evaluate_point_to_left_of_range = (first_point->x > x); bool evaluate_point_to_right_of_range = (last_point->x < x); if (evaluate_point_to_left_of_range) { value = first_point->y; } else if (evaluate_point_to_right_of_range) { value = last_point->y; } else { std::vector<Point>::iterator point_one_iterator = first_point; while ((point_one_iterator + 1)->x < x) { ++point_one_iterator; #ifdef _DEBUG assert(point_one_iterator != last_point); #endif // _DEBUG } std::vector<Point>::iterator point_two_iterator = point_one_iterator + 1; #ifdef _DEBUG assert(point_one_iterator != m_ptvEvaluatedCurvePts.end()); assert(point_two_iterator != m_ptvEvaluatedCurvePts.end()); #endif // _DEBUG Point point_one = *point_one_iterator; Point point_two = *point_two_iterator; if (point_one.x == point_two.x) value = point_one.y; else { float slope = (point_two.y - point_one.y) / (point_two.x - point_one.x); value = (x - point_one.x) * slope + point_one.y; } } } return value; }
int Curve::segmentCount() const { reevaluate(); int iEvaluatedPtCount = m_ptvEvaluatedCurvePts.size(); if (iEvaluatedPtCount == 0) { return 0; } else { return iEvaluatedPtCount - 1; } }
void Curve::drawEvaluatedCurveSegments() const { reevaluate(); glBegin(GL_LINE_STRIP); for (std::vector<Point>::const_iterator it = m_ptvEvaluatedCurvePts.begin(); it != m_ptvEvaluatedCurvePts.end(); ++it) { glVertex2f(it->x, it->y); } glEnd(); }
void Curve::drawControlPoint(int iCtrlPt) const { reevaluate(); double fPointSize; glGetDoublev(GL_POINT_SIZE, &fPointSize); glPointSize(7.0); glColor3d(1,0,0); glBegin(GL_POINTS); glVertex2f(m_ptvCtrlPts[iCtrlPt].x, m_ptvCtrlPts[iCtrlPt].y); glEnd(); glPointSize(fPointSize); }
void Curve::drawControlPoints() const { reevaluate(); double fPointSize; glGetDoublev(GL_POINT_SIZE, &fPointSize); glPointSize(7.0); glColor3d(1,1,1); glBegin(GL_POINTS); for (std::vector<Point>::const_iterator kit = m_ptvCtrlPts.begin(); kit != m_ptvCtrlPts.end(); ++kit) { glVertex2f(kit->x, kit->y); } glEnd(); glPointSize(fPointSize); }
int Curve::getClosestControlPoint(const Point& point, Point& ptCtrlPt) const { reevaluate(); int iMinDistPt = 0; float fMinDistSquared = FLT_MAX; for (int i = 0; i < (int)m_ptvCtrlPts.size(); ++i) { float delta_x = (m_ptvCtrlPts[i].x - point.x); float delta_y = (m_ptvCtrlPts[i].y - point.y); float fDistSquared = delta_x * delta_x + delta_y * delta_y; if (fDistSquared < fMinDistSquared) { iMinDistPt = i; fMinDistSquared = fDistSquared; ptCtrlPt = m_ptvCtrlPts[i]; } } return iMinDistPt; }
void MainWindow::reevaluateFemale() { ui->listWidget->addItem(QString("%1: %2").arg(QTime::currentTime().toString("hh:mm"), "Female")); reevaluate(ui->lblFemaleTest,FEMALEINDEX); ui->listWidget->scrollToBottom(); }
void Curve::drawCurve() const { reevaluate(); drawEvaluatedCurveSegments(); }
void Curve::getClosestPoint(const Point& pt, Point& ptClosestPt) const { reevaluate(); ptClosestPt = Point(pt.x, evaluateCurveAt(pt.x)); }