Java 计算机图形学beizer生成以及升降阶

程序设计思路: 
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;


}

最终效果:
这里写图片描述
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Eclipse平台JAVA实现 1. 实验内容 用基本增量算法和Bresenham算法画直线 2.实验目的 1)理解在显示器上画图与在纸上画图的本质区别; 2)掌握直线的光栅扫描转换过程; 3)掌握不同算法绘制直线的思路和优缺点。 3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入参数; 3)鼠标移动时,显示鼠标当前位置; 4)显示判别式的计算过程和下一点的选择策略; 5)记录生成点的坐标,建议用表的形式; 6)图形生成过程可以重复进行。 1. 实验内容 用正负法和Bresenham算法画圆弧 2.实验目的 1)掌握圆及圆弧的光栅扫描转换过程; 2)掌握不同算法绘制圆弧的技巧和优缺点。 3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入参数; 3)鼠标移动时,显示鼠标当前位置; 4)显示判别式的计算过程和下一点的选择策略; 5)记录生成点的坐标,建议用表的形式; 6)图形生成过程可以重复进行。 1. 实验内容 用Cohen-SutherLand算法和liang _barsky算法进行线段裁剪 2.实验目的 1)理解裁剪的相关概念 2)掌握直线段的一般裁剪过程; 3)理解并掌握Cohen-SutherLand 算法的编码思想; 4)理解并掌握Liang_Barsky算法的参数化裁剪思想; 3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入剪裁线段和裁剪窗口; 3)鼠标移动时,显示鼠标当前位置; 4)对于线段裁剪,线段被窗口的四条边裁剪的过程要显示出来; 6)裁剪过程可以重复进行。 1. 实验内容 用Sutherland-Hodgman算法进行多边形裁剪 2.实验目的 1)理解多边形裁剪与直线段裁剪的区别; 2)掌握多边形的裁剪过程; 3)理解并掌握Sutherland-Hodgman算法的裁剪思想。 3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入剪裁多边形和裁剪窗口; 3)鼠标移动时,显示鼠标当前位置; 4)多边形被窗口的四条边裁剪的过程以及多边形顶点增删的过程要显示出来; 5)裁剪过程可以重复进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值