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

📄 deboor.java

📁 用java语言实现了B样条曲线的做法。 可以自由输入控制点
💻 JAVA
字号:
public class DeBoor  
{
	public static void main(String[] args) 
	{
		DeBoor D=new DeBoor();
		double[][] d={{-24,-12,1,10,12},{0,6,8,2,0}};
		double[] t={0,0.75,1};
		int [] r={4,1,4};
		int q=2;
		int k=3;
		double u=0.5;
		double[] w=D.BsplineDrive(d,t,r,q,u,k);
		System.out.println(w[0]+" "+w[1]);
	}
	public   double[]  BsplineNote(double[] t,int[] r,double u,double[][] d)
	{	 
		double x[]=new double[2];
		double[][] c=d;
		int i=0,k=3;
		for(int j=0;j<8;j++)
		{
			if(u<=knotValue(j+1,t,r)&&u>knotValue(j,t,r))
			{
				i=j;
				break;
			}
		}
		
	
		
		
		for(int q=1;q<=k;q++)
		{
			for(int j=i-k;j<=i-q;j++)
			{
				double alfa=knotValue(j+k+1,t,r)-knotValue(j+1,t,r);
				if(alfa==0)alfa=0;
				else
				alfa=(u-knotValue(j+1,t,r))/alfa;
				c[0][j]=(1-alfa)*c[0][j]+alfa*c[0][j+1];
				c[1][j]=(1-alfa)*c[1][j]+alfa*c[1][j+1];
			}
		}
		for(int m=0;m<2;m++)
		{
			x[m]=c[m][i-k];
		} 
		 
		return x; 
	}
	public double[] BsplineDrive(double[][] d,double[] t,int[] r,int q,double u,int k)
	{
		// d是控制节点,t是节点矢量,r是维数,q是倒数阶数,u是参数
		double[] x=new double[2];
		int i=0;
		for(int j=0;j<d[0].length-1;j++)
		{
			if(u<=knotValue(j+1,t,r)&&u>knotValue(j,t,r))
			{
				i=j;
				break;
			}
		}
		//System.out.println(i);
		for(int l=1;l<=q;l++)
		{
			for(int j=i-k;j<=i-l;j++)
			{
				d[0][j]=(k-l+1)*(d[0][j+1]-d[0][j])/(knotValue(j+k+1,t,r)-knotValue(j+l,t,r));
				d[1][j]=(k-l+1)*(d[1][j+1]-d[1][j])/(knotValue(j+k+1,t,r)-knotValue(j+l,t,r));
			}
		} 
		for(int j=0;j<=i-q;j++)
		//System.out.print(d[0][j]+" "+d[1][j]+"  ");
		for(int l=1;l<=i-q;l++)
		{
			for(int j1=0;j1<i-q;j1++)
			{
				double alfa=knotValue(j1+k+1,t,r)-knotValue(j1+q+1,t,r);
				if(alfa==0)alfa=0;
				else 
					alfa=(u-knotValue(j1+q+1,t,r))/alfa;
				d[0][j1]=(1-alfa)*d[0][j1]+alfa*d[0][j1+1];
				d[1][j1]=(1-alfa)*d[1][j1]+alfa*d[1][j1+1];
			}
		}
		x[0]=d[0][0];x[1]=d[1][0];
		return x;
	}
	public double knotValue(int k,double t[],int r[])
	{
		int j=1;
		double temp=0;
		for(int i=0;i<r.length;i++)
		{
			temp=temp+r[i];
			if(temp>k)
			{
				j=i;
				break;
			}
		}
		return t[j];
		
	}
}

⌨️ 快捷键说明

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