程序设计思路:
1.获取控制点
2.通过控制点计算beizer点
3.通过Graphics显示所有的beizer点
先观察beizer曲线生成公式:(以下为一阶、二阶、三阶)通过观察低阶公式我们可以总结出其n阶式子的规律。
首先我们只看公式系数部分可以得出:其存在杨辉三角数阵的规律
然后观察四阶公式的特点:
四阶公式中除去整数系数外就只存在 t (1-t) P三种类型,根据他们的次方可以看出分别是0、1、2、3、4和4、3、2、1、0
所以我们只需用一个循环生成式子的每一部分然后累加起来。
根据四阶的公式特点我们就可以推断出n阶的式子。
具体代码如下:
/*
* 得到指定行的杨辉三角数据
* 1 要理解下面的实现,首先要明白int数组中元素默认值为 0
* 2 然后每一次迭代打印新的一行的元素的时候:
* 新的特定位置的元素 = 该位置原来的元素 + 该位置的前一个位置的值
*/
public void printYFTriangle(int lines){
b = new int[lines];
//int型数组默认值为0
int[] a = new int[lines + 1];
int previous = 1;
for (int i = 1; i <= lines; i ++){
for (int j = 1; j <= i; j++){
int current = a[j];
a[j] = previous + current;
previous = current;
if(i==lines){
b[j-1]=a[j];
}
}
}
}
/*
* 传入t值返回对应的B(t)值
* n为传入的阶数
* x[]传入的n个点的一个坐标值
*/
public void printBTvalue(double t,int n,ArrayList point){
res_x = 0;
res_y=0;
temp_x=0;
temp_y=0;
//计算杨辉三角值
printYFTriangle(n+1);
for(int i=0;i<=n;i++){
// (1-t)^n-i * t^i Pi 杨辉三角因数
temp_x=(double)Math.pow((1-t),(n-i))*Math.pow(t,i)*point.get(i).x*b[i];
res_x=res_x+temp_x;
temp_y=(double)Math.pow((1-t),(n-i))*Math.pow(t,i)*point.get(i).y*b[i];
res_y=res_y+temp_y;
}
MyPanel.a6.add(new Beizerbean((int)res_x,(int)res_y,t));
}
其中队列a6用来存储beizer点;
我是这么处理的创建两个队列一个用于存储控制点、一个用于存储beizer点,然后通过
public void paint(Graphics g2){
Graphics2D g2d = (Graphics2D) g2;
super.paint(g2d);
repaint();
g2d.setColor(ColorPanel.getColor);
g2d.setStroke(new BasicStroke(1.0f));
for(int i=1;i<a6.size();i++){
g2d.drawLine(a6.get(i-1).x, a6.get(i-1).y, a6.get(i).x, a6.get(i).y);
}
(这里只是部分显示曲线代码,通过将点连成线能使曲线更流畅)至于调整控制点,我们只需要改变控制点队列的点的坐标,然后重新生成。然后就是升降阶,通过观看 B_zier曲线的升阶及程序实现_林芳.pdf 我们可以知道他的公式:
/*
* beizer升阶
*/
public ArrayList<zuobiao> BeizerShengjie(ArrayList<zuobiao> a){
ArrayList<zuobiao> a7=new ArrayList<zuobiao>();
a7.clear();
zuobiao temp;
double t;
int n=a.size();
double x,y;
temp=new zuobiao(a.get(0).x,a.get(0).y);
a7.add(temp);
for(int j=1;j<n;j++){
t=(j+0.0)/(n+1);
x=Math.round((1-t)*a.get(j).x+t*a.get(j-1).x);
y=Math.round((1-t)*a.get(j).y+t*a.get(j-1).y);
temp=new zuobiao((int)x,(int)y);
a7.add(temp);
}
temp=new zuobiao(a.get(n-1).x,a.get(n-1).y);
a7.add(temp);
return a7;
}
/*
* beizer将阶
*/
public ArrayList<zuobiao> Beizerjiangjie(ArrayList<zuobiao> a){
ArrayList<zuobiao> a7=new ArrayList<zuobiao>();
a7.clear();
zuobiao temp;
double t;
int n=a.size();
double x,y;
temp=new zuobiao(a.get(0).x,a.get(0).y);
a7.add(temp);
for(int j=1;j<n-2;j++){
t=(j+0.0)/(n+1);
x=Math.round(((a.get(j).x-t*a7.get(j-1).x)*1.0)/(1-t));
y=Math.round(((a.get(j).y-t*a7.get(j-1).y)*1.0)/(1-t));
temp=new zuobiao((int)x,(int)y);
a7.add(temp);
}
temp=new zuobiao(a.get(n-1).x,a.get(n-1).y);
a7.add(temp);
return a7;
}