public
class
Bezier
extends
Graphics2DActivity
implements
OnClickListener,Runnable{
/**
* The animation thread.
*/
private
Thread thread;
private
volatile
boolean
stopThread=
false
;
private
boolean
stopOrNot=
false
;
boolean
drawn;
/**
* The random number generator.
*/
static
java.util.Random random =
new
java.util.Random();
/**
* The animated path
*/
Path path =
new
Path();
/**
* Red brush used to fill the path.
*/
SolidBrush brush =
new
SolidBrush(Color.RED);
private
static
final
int
NUMPTS =
6
;
private
int
animpts[] =
new
int
[NUMPTS *
2
];
private
int
deltas[] =
new
int
[NUMPTS *
2
];
long
startt, endt;
private
Button btnOptions;
@Override
protected
void
drawImage() {
drawDemo(
100
,
100
);
}
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.beziers);
graphic2dView
= (GuidebeeGraphics2DView) findViewById(R.id.graphics2dview);
btnOptions = (Button) findViewById(R.id.btnStopStart);
btnOptions.setOnClickListener(
this
);
reset(
100
,
100
);
if
(thread ==
null
) {
thread =
new
Thread(
this
);
thread.start();
}
}
@Override
public
void
onClick(View view) {
if
(!stopOrNot){
btnOptions.setText(
"Start"
);
stopThread=
true
;
}
else
{
stopThread=
false
;
btnOptions.setText(
"Stop"
);
if
(thread ==
null
) {
thread =
new
Thread(
this
);
thread.start();
}
}
stopOrNot=!stopOrNot;
}
/**
* Generates new points for the path.
*/
private
void
animate(
int
[] pts,
int
[] deltas,
int
i,
int
limit) {
int
newpt = pts[i] + deltas[i];
if
(newpt <=
0
) {
newpt = -newpt;
deltas[i] = (random.nextInt() &
0x00000003
)
+
2
;
}
else
if
(newpt >= limit) {
newpt =
2
* limit - newpt;
deltas[i] = -((random.nextInt() &
0x00000003
)
+
2
);
}
pts[i] = newpt;
}
/**
* Resets the animation data.
*/
private
void
reset(
int
w,
int
h) {
for
(
int
i =
0
; i < animpts.length; i +=
2
) {
animpts[i +
0
]
= (random.nextInt() &
0x00000003
)
* w /
2
;
animpts[i +
1
]
= (random.nextInt() &
0x00000003
)
* h /
2
;
deltas[i +
0
]
= (random.nextInt() &
0x00000003
)
*
6
+
4
;
deltas[i +
1
]
= (random.nextInt() &
0x00000003
)
*
6
+
4
;
if
(animpts[i +
0
] > w /
2
) {
deltas[i +
0
] = -deltas[i +
0
];
}
if
(animpts[i +
1
] > h /
2
) {
deltas[i +
1
] = -deltas[i +
1
];
}
}
}
final
Runnable updateCanvas =
new
Runnable() {
public
void
run() {
int
offsetX = (graphic2dView.getWidth() -
SharedGraphics2DInstance.CANVAS_WIDTH) /
2
;
int
offsetY = (graphic2dView.getHeight()
- SharedGraphics2DInstance.CANVAS_HEIGHT) /
2
;
graphic2dView.invalidate(offsetX,offsetY,
offsetX+
100
,offsetY+
100
);
}
};
/**
* Sets the points of the path and draws and fills the path.
*/
private
void
drawDemo(
int
w,
int
h) {
for
(
int
i =
0
; i < animpts.length; i +=
2
) {
animate(animpts, deltas, i +
0
, w);
animate(animpts, deltas, i +
1
, h);
}
path.reset();
int
[] ctrlpts = animpts;
int
len = ctrlpts.length;
int
prevx = ctrlpts[len -
2
];
int
prevy = ctrlpts[len -
1
];
int
curx = ctrlpts[
0
];
int
cury = ctrlpts[
1
];
int
midx = (curx + prevx) /
2
;
int
midy = (cury + prevy) /
2
;
path.moveTo(midx, midy);
for
(
int
i =
2
; i <= ctrlpts.length; i +=
2
) {
int
x1 = (curx + midx) /
2
;
int
y1 = (cury + midy) /
2
;
prevx = curx;
prevy = cury;
if
(i < ctrlpts.length) {
curx = ctrlpts[i +
0
];
cury = ctrlpts[i +
1
];
}
else
{
curx = ctrlpts[
0
];
cury = ctrlpts[
1
];
}
midx = (curx + prevx) /
2
;
midy = (cury + prevy) /
2
;
int
x2 = (prevx + midx) /
2
;
int
y2 = (prevy + midy) /
2
;
path.curveTo(x1, y1, x2, y2, midx, midy);
}
path.closePath();
graphics2D.clear(Color.WHITE);
graphics2D.fill(brush, path);
this
.runOnUiThread(updateCanvas);
}
public
void
run() {
Thread me = Thread.currentThread();
if
(!drawn) {
synchronized
(
this
) {
graphics2D.clear(Color.WHITE);
graphics2D.fill(brush, path);
graphic2dView.refreshCanvas();
drawn =
true
;
}
}
while
(thread == me && !stopThread) {
drawDemo(
100
,
100
);
}
thread =
null
;
}
}
相关推荐
掌握Bezier曲线的生成算法,掌握应用调和函数生成曲线的方法,掌握3次Bezier曲线的性质。 实验要求: 用鼠标交互输入控制点,绘制控制折线,生成并显示3次Bezier曲线。 实验原理: Bezier曲线的形状是通过一组多边...
计算机图形学Bezier曲线生成实验报告含源代码实验结果
在Matlab GUI中实现了Bezier任意阶数曲线和曲面的绘制。曲线可使用鼠标生成控制点,控制点可随意拖动;也可手动输入控制点坐标。曲面控制点信息可使用xls文件导入,也可手动输入控制点坐标。 程序使用Matlab GUI...
在vc上基于openGL编写的n次Bezier曲线,可以选择n的大小绘制指定次数的Bezier曲线,之后有较好的交互性,可以在n次Bezier曲线的基础上,将两点拖至重合,变成n-1次Bezier曲线
算法:n次Bezier曲线的定义。先作控制点,再点击显示屏上任意一点绘制n次Bezier曲线。可多次重新绘制。
图形学 编程实现绘制一段三次Bezier曲线 实现两段三次Bezier曲线的拼接
vb bezier 曲线 计算机图形学 算法
1、 通过实验,进一步理解和掌握生成BEZIER曲线的算法; 2、 掌握BEZIER曲线的基本生成过程; 3、 通过编程,会在TC环境下编程实现三次BEZIER曲线的绘制; 4、 通过实验,进一步理解和掌握生成B样条曲线的算法; 5、...
Bezier曲线曲面课件下 讲解Bezier曲线的性质及定义 PDF格式
河北经贸大学计算机图形学课程设计课题名称:生成三次Bezier曲线学 号: 201672450124 姓 名: 刘振宇 软件开发环境操作系统:windows 1
经典代码 Bezier曲线代码 java
使用OpenGL画七条曲线:Bezier曲线;3阶(2次)均匀B样条曲线;3阶(2次)准均匀B样条曲线;3阶(2次)分段B样条曲线;4阶(3次)均匀B样条曲线;4阶(3次)准均匀B样条曲线;4阶(3次)分段B样条曲线.rar
通过典型例子讲述如何利用matlab画二次及三次Bezier曲线,很经典。
本程序代码可以绘制多种图形曲线,采用真彩工具条做界面,分别编写Bezier曲线,B-样条曲线,Hermit曲线;本程序采用c++
基于c++mfc下利用opengl编写的Bezier曲线的绘制的程序,单击鼠标左键绘制曲线
三次Bezier曲线代码
利用de Casteljau算法绘制Bezier曲线,是利用了递归的思想
介绍三次Bezier曲线原理及其实现代码。代码基于VC6,WINDOWS平台。
计算机图形学曲线生成算法Bezier曲线的动画演示,Bezier曲线.swf
绘制2次及3次bezier曲线在matlab上的源码,简单易懂。