1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 아크마 | 판매 납포인트 | 무료 | 평점 | 0점 / 총 0명 참여 |
---|
///////////////////////////////////////////////////
// GBezier Class
//
// T : 계산에 쓰이는 타입 ( 사용자입장에서 고려할 필요가없다.)
// D는 더블형을 쓴다 느리다. 그러나 값손실이 적다.
// Fixed 는 빠르다.
// F : 계산된 값이 들어가는 타입 (사용자가 고려할 타입 )
//
// Usage : GTBezier<Type1, Type2> bez;
//
// GBezierD bez; // int형의 double형계산
//
//
///////////////////////////////////////////////////
#ifndef _GBezier_
#define _GBezier_
#define GBezierD GTBezier<double,int>
#define GBezier GTBezier<GFixed,int>
#define GDBezierD GTBezier<double,double>
template < class T, class F>
class GTBezier{
F m_nPoints[8];
int m_nNpts;
T BezierSplit( T mu, T x1, T x2 );
T BezierValue( T mu, F* coor );
public:
GTBezier();
GTBezier( F pPoint[8] );
GTBezier( const GTBezier& csBezier );
~GTBezier();
void Calculate( F* x , F* y, int npts = -1 );
};
#endif
----------
#include "GTBezier.h"
template <class T, class F>
GTBezier<T,F>::GTBezier()
{
m_nNpts = 0;
m_nPoints[0]=m_nPoints[1]=m_nPoints[2]=m_nPoints[3]=\
m_nPoints[4]=m_nPoints[5]=m_nPoints[6]=m_nPoints[7]=0;
}
template <class T, class F>
GTBezier<T,F>::GTBezier( F pPoint[8] )
{
m_nNpts = 10;
for( int i = 0; i<8 ; i++)
{
m_nPoints[i] = pPoint[i];
}
}
template <class T, class F>
GTBezier<T,F>::GTBezier( const GTBezier<T,F>& csBezier )
{
m_nNpts = csBezier.m_nNpts;
for( int i = 0; i<8 ; i++)
{
m_nPoints[i] = F(csBezier.m_nPoints[i]);
}
}
template <class T, class F>
GTBezier<T,F>::~GTBezier()
{
}
template <class T, class F>
T GTBezier<T,F>::BezierSplit( T mu, T x1, T x2 )
{
return ( (T(1.0) - mu) *x1)+(mu*x2);
//fmul((itofix(1.0)-mu), x1) + fmul(mu, x2);
}
template <class T, class F>
T GTBezier<T,F>::BezierValue( T mu, F *coor )
{
T work[4];
int i;
int j;
for (i=0; i<4; i++)
work[i] = T(coor[i*2]);
//itofix(coor[i*2]);
for (j=0; j<3; j++)
for (i=0; i<3-j; i++)
work[i] = BezierSplit(mu, work[i], work[i+1]);
return work[0];
}
template <class T, class F>
void GTBezier<T,F>::Calculate( F* x , F* y, int npts )
{
if( npts <0 ) npts = m_nNpts;
int i;
T denom;
for (i=0; i < npts; i++)
{
denom = T(i) / T(npts-1);
//fdiv(itofix(i), itofix(npts-1));
x[i] = int( BezierValue( denom , m_nPoints ));
//fixtoi(bezval(denom, points));
y[i] = int( BezierValue( denom , m_nPoints + 1 ));
//fixtoi(bezval(denom, points+1));
}
}
-------------
#include <iostream.h>
#include "GTBezier.h"
#include "GTBezier.cpp"
int main()
{
int pt[8] = { 0,0, 60, 5, 20,15 , 80,23 };
GBezierD bez(pt);
int ptx[10],pty[10];
bez.Calculate ( ptx, pty, 20 );
for ( int p = 0 ; p < 20 ; p ++)
{
cout << ptx[p] << " " << pty[p] << endl;
}
}