LINUX.ORG.RU

[c++] Двухмерный график по точкам. Разные инструменты

 


0

0

Есть матрица 2*N, типа того:

1.0 2.2
1.2 2.5
0.2 3.4
2.1 1.5
2.0 1.7
0.6 2.1

Представлена она как vector<Point> (ну не суть).

Надо нанести точки на плоскости и построить по ним кривую.

Я так понимаю, MathGL для такого непригоден... хотя хотелось бы, т.к. привычная библиотека. Верно понимаю?

Чем можно сделать это в минимальное кол-во строчек кода?

★★★★★

Последнее исправление: Obey-Kun (всего исправлений: 1)

GDI+

я серьезно, там тривиальнейшее апи для рисование типа lineTo, такиеже я только встречал в жабке. Ну может кути еще

wfrr ★★☆
()
Ответ на: GDI+ от wfrr

> Ну может кути еще

qwt тогда уж

Obey-Kun ★★★★★
() автор топика

Ты решил на лоре перепечатать сборник задач по программированию что ли? Сразу уж огласи весь список задач.

anonymous
()

если не ошибаюсь библиотека называется libplot

Zodd ★★★★★
()
Ответ на: комментарий от anonymous

> Ты решил на лоре перепечатать сборник задач по программированию что ли? Сразу уж огласи весь список задач.

Нету списка, и вообще с учёбой это не связано.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от madcore

интересует не велосипед, а готовая либа

свой графопостроитель я бы и так написал бы (но вряд ли стал бы), но либа нужна другому человеку

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от madcore

блин, я же написал — минимум строк текста к проекту, то есть надо использовать уже существующую заточенную под это либу

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

freeglut

#include <GL/glut.h>
#include <stdlib.h>


void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT);

	glPushMatrix();
	glColor3f(1.0,1.0,1.0);

//**************************************
	srand(100);
	glBegin(GL_LINE_LOOP);
	for(int i = 0; i < 100; ++i)
		glVertex2d(-50 + rand()%100, -50 + rand()%100);
	glEnd();
//**************************************

	glPopMatrix();

	glutSwapBuffers();
}

void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei) w, (GLsizei) h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

int main(int argc, char **argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
	glutInitWindowSize(700, 700);
	glutInitWindowPosition(100,100);
	glutCreateWindow("example");
	glClearColor(0.0,0.0,0.0,0.0);
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutMainLoop();
	return 0;
}
anonymous
()
Ответ на: комментарий от Obey-Kun

А, SVG, кстати, тоже хороший выход из положения. Или постскрипт. Все проще, чем генерировать растровую картинку, да еще и в цвете.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

- Что общего у XMl и С++?

- убивающее мозг применение знаков «больше» и «меньше» везде где им не место!

wfrr ★★☆
()
Ответ на: комментарий от Kristi

> А MathGL чем не устроил?

А как строить в таком случае? Мне казалось, что он умеет делать это с заданным шагом по оси x.

Obey-Kun ★★★★★
() автор топика

Это называется B-сплайны и требует минимум средств для получения сглаживания ломаной линии.

#include <GL/glut.h>

#include <cstdlib>
#include <ctime>
#include <vector>
#include <cmath>

double BSpline ( double* p, int i, double t )
{
	double	s  = 1.0 - t;
	double	t2 = t * t;
	double	t3 = t2 * t;
	return ( s * s * s * p [i] + ( 3 * t3 - 6 * t2 + 4 ) * p [i + 1] + ( -3 * t3 + 3 * t2 + 3 * t + 1 ) * p [i + 2] + t3 * p [i + 3] ) / 6.0;
}

const int SIZE = 15;
const int ChangeInterval = 2000;

std::vector<double> xv(SIZE), yv(SIZE);

void CreateVector()
{
	for(int i = 1; i < SIZE - 1; ++i)
	{
		xv[i] =  35 * sin((i - 1) * 2.0 * M_PI /(SIZE-2)) - 10 + rand()%21;
		yv[i] =  35 * cos((i - 1) * 2.0 * M_PI /(SIZE-2)) - 10 + rand()%21;
	}
	xv[0] = xv[1] - xv[2] + xv[1];
	yv[0] = yv[1] - yv[2] + yv[1];
	xv[SIZE-1] = xv[SIZE - 2] - xv[SIZE - 3] + xv[SIZE - 2];
	yv[SIZE-1] = yv[SIZE - 2] - yv[SIZE - 3] + yv[SIZE - 2];
}

void display(void)
{

	glClear(GL_COLOR_BUFFER_BIT);

	glPushMatrix();

	glLineWidth(2);
	glColor3f(1.0, 0.0, 0.0);
	glBegin(GL_LINE_STRIP);
	for(size_t i = 1; i < xv.size() - 1; ++i)
	{
		glVertex2d(xv[i], yv[i]);
	}
	glEnd();

	glLineWidth(4);
	glColor3f(0.0,1.0,0.0);
	glBegin(GL_LINE_STRIP);
	for(size_t i = 0; i < xv.size() - 3; ++i)
	{
		for(int p = 0; p <= 100; ++p)
		{
			double x = BSpline(&xv[0], i, p*0.01);
			double y = BSpline(&yv[0], i, p*0.01);
			glVertex2d(x, y);
		}
	}
	glEnd();

	glPopMatrix();
	glutSwapBuffers();
}

void reshape(int w, int h)
{
	glViewport(0, 0, (GLsizei) w, (GLsizei) h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void timer(int)
{
	CreateVector();
	glutPostRedisplay();
	glutTimerFunc(ChangeInterval, timer, 0);
}

int main(int argc, char **argv)
{
	srand(time(0));
	CreateVector();

	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutInitWindowSize(700, 700);
	glutInitWindowPosition(100,100);
	glutCreateWindow("example");

	glClearColor(0.0,0.0,0.0,0.0);
	glEnable (GL_BLEND);
	glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glEnable(GL_LINE_SMOOTH);
	glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);

	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutTimerFunc(ChangeInterval, timer, 0);
	glutMainLoop();
	return 0;
}
anonymous
()
Ответ на: комментарий от anonymous

спасибо за пример, в будущем точно пригодится, но не здесь:

1. b-сплайны не катят, т.к. нужно, чтобы кривая шла через известные точки графика и сглаживалась только между ними.

2. это ведь ещё надо оси рисовать, сетку, кода многовато когда на мат. часть чуть более ста строк.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от Obey-Kun

> 1. b-сплайны не катят, т.к. нужно, чтобы кривая шла через известные точки графика и сглаживалась только между ними.

Тогда подойдут кубические сплайны(«with csplines» в gnuplot).

balodja ★★★
()
Ответ на: комментарий от Obey-Kun

>b-сплайны не катят, т.к. нужно, чтобы кривая шла через известные точки графика и сглаживалась только между ними.

ЕМНИП, b-сплайны это как раз-таки интерполяция (кривая проходит через все заданные точки), а не аппроксимация

annulen ★★★★★
()
Ответ на: комментарий от annulen

>b-сплайны это как раз-таки интерполяция (кривая проходит через все заданные точки)

надо же. Пишите срочно дисертацию об этом открытии.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.