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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.