Tuesday, December 30, 2008

BSpline Curve

#include<stdio.h>
#include<conio.h>
#include <graphics.h>
#include<dos.h>
#include <stdlib.h>

struct point {
double x;
double y;
double z;
};

void compute_intervals(int *u, int n, int t);
double blend(int k, int t, int *u, double v);
void compute_point(int *u, int n, int t, double v, point *control,
point *output);

void bspline(int n, int t, point *control, point *output, int num_output)
{
int *u;
double increment,interval;
point calcxyz;
int output_index;

u=new int[n+t+1];
compute_intervals(u, n, t);

increment=(double) (n-t+2)/(num_output-1);
interval=0;

for (output_index=0; output_index<num_output-1; output_index++)
{
compute_point(u, n, t, interval, control, &calcxyz);
output[output_index].x = calcxyz.x;
output[output_index].y = calcxyz.y;
output[output_index].z = calcxyz.z;
interval=interval+increment;
}
output[num_output-1].x=control[n].x;
output[num_output-1].y=control[n].y;
output[num_output-1].z=control[n].z;

delete u;
}

void main()
{
int graphdriver = DETECT, graphmode, error_code;
initgraph(&graphdriver, &graphmode, "c:\\tc\\bgi");
int *u;
int n,t,i,x1,y1;
n=7;
t=4;
point *pts; // allocate our control point array
pts=new point[n+1];

pts[0].x=10; pts[0].y=100; pts[0].z=0;
pts[1].x=200; pts[1].y=100; pts[1].z=0;
pts[2].x=345; pts[2].y=300; pts[2].z=0;
pts[3].x=400; pts[3].y=250; pts[3].z=0;
pts[4].x=500; pts[4].y=450; pts[4].z=0;
pts[5].x=550; pts[5].y=150; pts[5].z=0;
pts[6].x=570; pts[6].y=50; pts[6].z=0;
pts[7].x=600; pts[7].y=100; pts[7].z=0;

int resolution = 500;
point *out_pts;
out_pts = new point[resolution];

bspline(n, t, pts, out_pts, resolution);

setcolor(10);
for (i=0; i<=n; i++)
circle(pts[i].x,pts[i].y,2);

circle(pts[0].x,pts[0].y,0);
for (i=0; i<resolution; i++)
{
setcolor(i);
putpixel(out_pts[i].x,out_pts[i].y,WHITE);delay(10);
}getch();
closegraph();
}

double blend(int k, int t, int *u, double v)
{
double value;

if (t==1)
{
if ((u[k]<=v) && (v<u[k+1]))
value=1;
else
value=0;
}
else
{
if ((u[k+t-1]==u[k]) && (u[k+t]==u[k+1])) // check for divide by zero
value = 0;
else
if (u[k+t-1]==u[k]) // if a term's denominator is zero,use just the other
value = (u[k+t] - v) / (u[k+t] - u[k+1]) * blend(k+1, t-1, u, v);
else
if (u[k+t]==u[k+1])
value = (v - u[k]) / (u[k+t-1] - u[k]) * blend(k, t-1, u, v);
else
value = (v - u[k]) / (u[k+t-1] - u[k]) * blend(k, t-1, u, v) +
(u[k+t] - v) / (u[k+t] - u[k+1]) * blend(k+1, t-1, u, v);
}
return value;
}

void compute_intervals(int *u, int n, int t) // figure out the knots
{
int j;

for (j=0; j<=n+t; j++)
{
if (j<t)
u[j]=0;
else
if ((t<=j) && (j<=n))
u[j]=j-t+1;
else
if (j>n)
u[j]=n-t+2; // if n-t=-2 then we're screwed, everything goes to 0
}
}

void compute_point(int *u, int n, int t, double v, point *control,
point *output)
{
int k;
double temp;

// initialize the variables that will hold our outputted point
output->x=0;
output->y=0;
output->z=0;

for (k=0; k<=n; k++)
{
temp = blend(k,t,u,v); // same blend is used for each dimension coordinate
output->x = output->x + (control[k]).x * temp;
output->y = output->y + (control[k]).y * temp;
output->z = output->z + (control[k]).z * temp;
}
}

8 comments:

日本ダービー said...

第77回 日本ダービー 2010 予想、オッズ、厳選買い目は?人気が平然と馬券に絡む理由とは!?見事に展開を読んで結果を的中させる

SM度チェッカー said...

最近普通のプレイに物足りなさを感じているそこのアナタ、ワンランク上のプレイをしてみませんか?そんな時の目安にSM度チェッカーを使うんです。自分の深層心理を暴きパートナーとのプレイ時のアドバイスも付きますよ!!一度どうですか

玉の輿度チェッカー said...

世の中手っ取り早く、簡単に金持ちに為ったもん勝ち!!そのためのツールが玉の輿度チェッカーです。心理カウンセラーを雇い、一人一人どうすれば人に好かれるか、最終的に結婚へのプロセスに持っていくかのアドバイスを期間限定で無料サービス中です。上手く玉の輿に乗っければ儲けもんです、一度試してみよう

mコミュ said...

mコミュは無料登録で友達を沢山作る事のできる掲示板サイトです。使った事のない人でも簡単に使う事ができるのでお気軽にお立ち寄りください

スタービーチ said...

スタービーチの出合いは他の出合い系サイトのものよりも確実に良い思いができるのは間違いありません。新しい出合いを求めたいと思っているのなら当サイトを利用してください。損はさせませんよ

スタビ said...

スタビが今一番アツイのはご存じでしょうか?夏休みで出会いを探している娘とすぐに会えちゃうんです。登録無料でここまで出会える所は他には存在しません。今登録して良いパートナーに巡り合おう

gree said...

greeで素敵な時間を過ごしたい・・・そんな願望を叶えてくれるサイト誕生!!今までにないドキドキ感と興奮をこのグリーで楽しみましょう

スタービーチ said...

スタービーチで始まる素敵な出 合いをしていきませんか。楽しめる出 合いを経験するにはココから始まる!!最高の出 合いがあなたを待っている