⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 editor.c

📁 学习c++必备
💻 C
📖 第 1 页 / 共 3 页
字号:
	tg = &upoint->last->tg;	if ( tg->x1 != tg->x0 ) {		t1 = (tg->y1-tg->y0) / (tg->x1-tg->x0);	} else {		t1 = (tg->y1-tg->y0)*10000.;	}	GetPolynome(		upoint->last->mode,		upoint->last->x,		upoint->last->y,		t1,		upoint->x,		upoint->y,		t0,		upoint->last->polynome	);	for ( i=1+(int) upoint->last->x; i<(int) upoint->x; i++ ) {		val = Polynome4((float) i, upoint->last->polynome)/(float)MAXNDX;		TabCmpnt(cmpnt,i) = INF( SUP(val,0.), 1. );	} } if ( upoint->next != NULL ) {	tg = &upoint->next->tg;	if ( tg->x1 != tg->x0 ) {		t1 = (tg->y1-tg->y0) / (tg->x1-tg->x0);	} else {		t1 = (tg->y1-tg->y0)*10000.;	}	GetPolynome(		upoint->mode,		upoint->x,		upoint->y,		t0,		upoint->next->x,		upoint->next->y,		t1,		upoint->polynome	);	for ( i=1+(int) upoint->x; i<(int) upoint->next->x; i++ ) {		val = Polynome4( (float) i, upoint->polynome )/(float)MAXNDX;		TabCmpnt(cmpnt,i) = INF( SUP(val,0.), 1. );	}	TabCmpnt(cmpnt,(int) upoint->next->x) = upoint->next->y/(float)MAXNDX; }}/*---------------------------------------------------------------------------* *			freePointList *---------------------------------------------------------------------------*/static voidfreePointList( UserPoint *upoint ){	while (upoint != NULL)	{		UserPoint *unext = upoint->next;		freePoint( upoint );		upoint = unext;	}}/*---------------------------------------------------------------------------* *			clonePointList *---------------------------------------------------------------------------*/static UserPoint *clonePointList( UserPoint *base ){	UserPoint *clone, *upoint;	if (base == NULL) return NULL;	newPoint( clone );	upoint = clone;	memcpy( upoint, base, sizeof(UserPoint) );	upoint->last = NULL;	upoint->next = NULL;	while (base->next != NULL)	{		base = base->next;		newPoint( upoint->next );		memcpy( upoint->next, base, sizeof(UserPoint) );		upoint->next->last = upoint;		upoint->next->next = NULL;		upoint = upoint->next;	}	return clone;}/*---------------------------------------------------------------------------* *			ApplyCMap *---------------------------------------------------------------------------*/voidApplyCMap(void){	int	i;	for (i=0; i<4; i++) if ( modifiedCurve[i] )	{		freePointList( userPointSvg[i] );		userPointSvg[i] = clonePointList( userPoint[i] );		modifiedCurve[i] = 0;	}}/*---------------------------------------------------------------------------* *			ResetCMap *---------------------------------------------------------------------------*/voidResetCMap(void){	int	i;	UserPoint *upoint;	for (i=0; i<4; i++) if ( modifiedCurve[i] )	{		freePointList( userPoint[i] );		userPoint[i] = clonePointList( userPointSvg[i] );		modifiedCurve[i] = 0;		for (upoint=userPoint[i]; upoint!=NULL; upoint=upoint->next )			YACME_update( i, upoint );	}}/*---------------------------------------------------------------------------* *			InsertPoint *---------------------------------------------------------------------------*/intInsertPoint( PickObject *obj ){ float	dx, dy, slope, coeff[4]; int	i; Tangente *tg; UserPoint *upoint, *userpoint; upoint = userPoint[obj->cmpnt]; while ( (int) upoint->next->x <= obj->ndx ) {	upoint = upoint->next;	if ( upoint->next == NULL ) return 0; } if ( (int) upoint->x == obj->ndx ) {	obj->upoint = upoint;	return POINT; } newPoint( userpoint ); userpoint->x = (float) obj->ndx; userpoint->y = Polynome4( obj->ndx, upoint->polynome ); userpoint->y = SUP( INF(userpoint->y, (float)MAXNDX), 0. ); userpoint->mode = upoint->mode; for ( i=0; i<4; i++ ) {	userpoint->polynome[i] = upoint->polynome[i]; } userpoint->next = upoint->next; userpoint->last = upoint; upoint->next = userpoint; userpoint->next->last = userpoint;/* calcul de slope = P'(index) ---------------------------*/ if ( userpoint->y == (float)MAXNDX || userpoint->y == 0. ) {	dx = 25.;	dy = 0.; } else {	coeff[0] = userpoint->polynome[0]*3.;	coeff[1] = userpoint->polynome[1]*2.;	coeff[2] = userpoint->polynome[2];	slope = coeff[0];	for (i=1; i<3; i++) {		slope *= (float) obj->ndx;			slope += coeff[i];	}/*	Rappel :	cos( arctg(x) ) = 1/sqr( 1 + x^2 );	sin( arctg(x) ) = |x|/sqr( 1 + x^2 );*/	dx = 25. / fsqrt( slope*slope + 1. );	dy = dx*slope; } dx *= LUTRATIO; dy *= LUTRATIO; tg = &userpoint->tg; tg->x0 = userpoint->x - dx; tg->x1 = userpoint->x + dx; tg->y0 = userpoint->y - dy; tg->y1 = userpoint->y + dy; obj->upoint = userpoint; return POINT;}/*---------------------------------------------------------------------------* *			DeletePoint *---------------------------------------------------------------------------*/voidDeletePoint( int cmpnt, UserPoint *upoint ){	if ( upoint == NULL || upoint->last == NULL || upoint->next == NULL )		return;	upoint->last->next = upoint->next;	upoint->next->last = upoint->last;	YACME_update( cmpnt, upoint->last );	freePoint( upoint );}/*---------------------------------------------------------------------------* *			MovePoint *---------------------------------------------------------------------------*/intMovePoint( int mousex, int mousey ){	float	x, y, dx, dy, minx, maxx;	OrthoTransform( mousex, mousey, &x, &y );	y = SUP( INF(y,(float)MAXNDX), 0. );	x = ((x-(int)x)<.5) ? (float)(int)x : (float)(int)(x+1);	y = ((y-(int)y)<.5) ? (float)(int)y : (float)(int)(y+1);	if ( curPoint->next != NULL && curPoint->last!= NULL )	{		minx = curPoint->last->x + 1.;		maxx = curPoint->next->x - 1.;		x = SUP( INF(x, maxx), minx );		dx = (float)x - curPoint->x;		curPoint->x = (float) x;		curPoint->tg.x0 += (float) dx;		curPoint->tg.x1 += (float) dx;	}	dy = (float)y - curPoint->y;	curPoint->y = (float)y;	curPoint->tg.y0 += (float) dy;	curPoint->tg.y1 += (float) dy;	return 1;}/*---------------------------------------------------------------------------* *			MoveTangente *---------------------------------------------------------------------------*/intMoveTangente( int sens, int mousex, int mousey ){	float	x, y, dx, dy, slope;	Tangente *tg;	OrthoTransform( mousex, mousey, &x, &y );	if ( sens == -1 )	{		x = INF(x, curPoint->x);	}	else	{		x = SUP(x, curPoint->x);	}	if ( x != curPoint->x )	{		slope =		(curPoint->y - y);		slope /=	(curPoint->x - x);		dx = 25. / fsqrt( slope*slope + 1. );		dy = dx*slope;	}	else	{		dx = 0.;		dy = (curPoint->y < y) ? sens*25. : -sens*25.;	}	dx *= LUTRATIO;	dy *= LUTRATIO;	tg = &curPoint->tg;	tg->x0 = curPoint->x;	tg->y0 = curPoint->y;	if ( curPoint->last != NULL ) {		tg->x0 -= dx;		tg->y0 -= dy;	}	tg->x1 = curPoint->x;	tg->y1 = curPoint->y;	if ( curPoint->next != NULL )	{		tg->x1 += dx;		tg->y1 += dy;	}	return 1;}/*---------------------------------------------------------------------------* *			GetPolynome *---------------------------------------------------------------------------*//*	we want a polynom P(x) = Ax^3 + Bx^2 + Cx + D	so that : P(a0) = b0, P'(a0) = t0, P(a1) = b1, P'(a1) = t1 	i.e.	| a0^3		a0^2	a0	1 | |A|	  |b0|	| a1^3		a1^2	a1	1 | |B| = |b1|	| 3a0^2		2a0		1	0 | |C|	  |t0|	| 3a1^2		2a1		1	0 | |D|   |t1|*/voidGetPolynome(	int mode,	float a0, float b0, float t0,	float a1, float b1, float t1,	float coeff[4] ){	Matrix	mat, INV_mat;	int	i;	float	val;	switch (mode)	{		case CONSTANT:/*			we want P(x) = b0 */			coeff[0] = 0.;			coeff[1] = 0.;			coeff[2] = 0.;			coeff[3] = b0;			break;		case LINEAR:/*			we want P(x) = b0 + (x-a0)/(a1-a0)*(b1-b0)			i.e. P(x) = x*[(b1-b0)/(a1-a0)] + b0 - a0*[(b1-b0)/(a1-a0)]*/			val = (b1-b0)/(a1-a0);			coeff[0] = 0.;			coeff[1] = 0.;			coeff[2] = val;			coeff[3] = b0 - a0*val;			break;		case POLYNOMIAL:/*			we want a polynom P(x) = Ax^3 + Bx^2 + Cx + D			so that : P(a0) = b0, P'(a0) = t0, P(a1) = b1, P'(a1) = t1 			i.e.					| a0^3		a0^2	a0	1 | |A|	  |b0|			| a1^3		a1^2	a1	1 | |B| = |b1|			| 3a0^2		2a0		1	0 | |C|	  |t0|			| 3a1^2		2a1		1	0 | |D|   |t1|*/			val = 1.;			for (i=3; i>=0; i--)			{				mat[0][i] = val;				val *= a0;			}					val = 1.;			for (i=3; i>=0; i--)			{				mat[1][i] = val;				val *= a1;			}					mat[2][3] = 0.;			mat[2][2] = 1.;			mat[2][1] = 2.*a0;			mat[2][0] = 3.*a0*a0;					mat[3][3] = 0.;			mat[3][2] = 1.;			mat[3][1] = 2.*a1;			mat[3][0] = 3.*a1*a1;					invertmat( mat, INV_mat );					for (i=0; i<4; i++)				coeff[i] = INV_mat[i][0]*b0 +					INV_mat[i][1]*b1 +					INV_mat[i][2]*t0 +					INV_mat[i][3]*t1;			break;	}}/*---------------------------------------------------------------------------* *			OrthoTransform *---------------------------------------------------------------------------*/voidOrthoTransform( int mx, int my, float *x, float *y ){ float	xf, yf; xf =	(float) mx; xf /=	(float) W; xf *=	(float) (RIGHT - LEFT); xf +=	(float) LEFT; yf =	(float) my; yf /=	(float) H; yf *=	(float) (TOP - BOTTOM); yf +=	(float) BOTTOM; *x = xf; *y = yf;}/*---------------------------------------------------------------------------* *			Polynome4 *---------------------------------------------------------------------------*/floatPolynome4( float x, float *coeff ){ int	j; float	val = coeff[0]; for (j=1; j<4; j++) {	val *= x;	val += coeff[j]; } return	val;}/*---------------------------------------------------------------------------* *			MAIN *---------------------------------------------------------------------------*/#ifdef	YACME_DBG#include "RGBA.h"intmain( int argc, char *argv[] ){	glutInit( &argc, argv );	YACME_init(		0, 0, WINWIDTH, WINHEIGHT,		256, (float**)RGBA,		NULL, NULL	);	glutMainLoop();	return 0;             /* ANSI C requires main to return int. */}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -