Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
int Curve::segmentCount() const
{
	reevaluate();

	int iEvaluatedPtCount = m_ptvEvaluatedCurvePts.size();

	if (iEvaluatedPtCount == 0) {
		return 0;
	}
	else {
		return iEvaluatedPtCount - 1;
	}
}
Пример #4
0
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();
}
Пример #5
0
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);
}
Пример #6
0
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);
}
Пример #7
0
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;
}
Пример #8
0
void MainWindow::reevaluateFemale()
{
    ui->listWidget->addItem(QString("%1: %2").arg(QTime::currentTime().toString("hh:mm"), "Female"));
    reevaluate(ui->lblFemaleTest,FEMALEINDEX);
    ui->listWidget->scrollToBottom();
}
Пример #9
0
void Curve::drawCurve() const
{
	reevaluate();

	drawEvaluatedCurveSegments();
}
Пример #10
0
void Curve::getClosestPoint(const Point& pt, Point& ptClosestPt) const
{
	reevaluate();

	ptClosestPt = Point(pt.x, evaluateCurveAt(pt.x));
}