gamemaker studio2 实现一个贝塞尔曲线连接

首先是虚线连接的版本:

参数介绍:起点坐标X,起点坐标Y,终点坐标X,终点坐标Y,贝塞尔的测试点偏角

function scr_bezier_point(argument0,argument1,argument2,argument3,argument4 = 30){

	var _xo = argument0,_yo = argument1,_x1 = argument2,_y1 = argument3,_angle = argument4;
	// 绘制角度
	var _r =360 -  point_direction(_xo,_yo,_x1,_y1)
	if(_r >= 360)
	{
		_r -=360
	}
	// 获取测试点的角度
	var _des = point_distance(_xo,_yo,_x1,_y1)
	var _r1 = 0,_r2 = 0;
	if (_x1 >_xo && _y1<_yo)
	{
		_r1 = _r + _angle;
		_r1 = _r - _angle;
	}
	else if(_x1 >_xo && _y1>_yo)
	{
		_r1 = _r + _angle;
		_r2 = _r - _angle;
	}
	else if(_x1<_xo && _y1<_yo)
	{
			_r1 = _r + _angle;
			_r2 = _r - _angle;
	}
	else if(_x1<_xo && _y1>_yo)
	{
			_r1 = _r - _angle;
			_r2 = _r + _angle;
	}
	
	// 一号测试点
	var _p1_x = _xo+_des/3*cos(degtorad(_r1))
	var _p1_y = _yo + _des/3*sin(degtorad(_r1))
	
	var _p2_x = _xo+_des*2/3*cos(degtorad(_r2))
	var _p2_y = _yo + _des*2/3*sin(degtorad(_r2))
	
	// 绘制曲线
	var _cx = 3*(_p1_x - _xo)
	var _cy = 3*(_p1_y - _yo)
	var _bx = 3*(_p2_x - _p1_x) - _cx;
	var _by = 3*(_p2_y - _p1_y) - _cy;
	var _ax = _x1 - _xo - _cx - _bx
	var _ay = _y1 - _yo - _cy - _by
	
	for(var _t = 0;_t<1;_t+=0.01)
	{
		var _x = _ax*power(_t,3)+_bx*power(_t,2)+_cx*_t + _xo
		var _y = _ay*power(_t,3)+_by*power(_t,2)+_cy*_t + _yo
		draw_point(_x,_y);
	}
}

下面是线段的版本:

function scr_bezier_line(argument0,argument1,argument2,argument3,argument4 = 30){

	var _xo = argument0,_yo = argument1,_x1 = argument2,_y1 = argument3,_angle = argument4;
	// 绘制角度
	var _r =360 -  point_direction(_xo,_yo,_x1,_y1)
	if(_r >= 360)
	{
		_r -=360
	}
	// 获取测试点的角度
	var _des = point_distance(_xo,_yo,_x1,_y1)
	var _r1 = 0,_r2 = 0;
	if (_x1 >_xo && _y1<_yo)
	{
		_r1 = _r + _angle;
		_r1 = _r - _angle;
	}
	else if(_x1 >_xo && _y1>_yo)
	{
		_r1 = _r + _angle;
		_r2 = _r - _angle;
	}
	else if(_x1<_xo && _y1<_yo)
	{
			_r1 = _r + _angle;
			_r2 = _r - _angle;
	}
	else if(_x1<_xo && _y1>_yo)
	{
			_r1 = _r - _angle;
			_r2 = _r + _angle;
	}
	
	
	// 一号测试点
	var _p1_x = _xo+_des/3*cos(degtorad(_r1))
	var _p1_y = _yo + _des/3*sin(degtorad(_r1))
	
	var _p2_x = _xo+_des*2/3*cos(degtorad(_r2))
	var _p2_y = _yo + _des*2/3*sin(degtorad(_r2))
	
	// 绘制曲线
	var _cx = 3*(_p1_x - _xo)
	var _cy = 3*(_p1_y - _yo)
	var _bx = 3*(_p2_x - _p1_x) - _cx;
	var _by = 3*(_p2_y - _p1_y) - _cy;
	var _ax = _x1 - _xo - _cx - _bx
	var _ay = _y1 - _yo - _cy - _by
	var _tx = _xo,_ty = _yo;
	
	for(var _t = 0;_t<1;_t+=0.01)
	{
		var _x = _ax*power(_t,3)+_bx*power(_t,2)+_cx*_t + _xo
		var _y = _ay*power(_t,3)+_by*power(_t,2)+_cy*_t + _yo
		draw_line_width(_tx,_ty,_x,_y,3);
		_tx = _x;
		_ty = _y;
	}
}

测试后效率还行,主要是向做类似脑图那种连接线;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值