【安德GameEnginesAssign1】Bresenham‘s line(缺45°的半成品以及完成品)

看了一个讲该算法生成过程的视频:

https://www.youtube.com/watch?v=RGB-wlatStc

自己算了半天各种情况,结果整合出来还剩45度显示不出来,舍不得删掉留一个存档。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public void bresehamLine(int x1, int y1, int x2, int y2, int r, int g, int b, int a) {
		int p,x,y;
		int dx = Math.abs(x2-x1); // dx
		int dy = Math.abs(y2-y1) ; // dy
		int twoDy = 2*dy; // 2dy
		int twoDx = 2*dx;
		int twoDyMinusDx = 2*(dy - dx); // 2dy-2dx
		int twoDyAddDx = 2*(dy + dx);
		p = 2*dy - dx;
		x = x1;
		y = y1;
		if((x1>x2)) {
			//draw from (x2,y2)
			x = x2; x2 = x1; y = y2; y2 = y1;
		}
		p = 2*dy - dx;
		
		if(dx>dy) {
			// degree <45
			while(x <= x2) {
				// draw current point
				point(x, y, r, g, b, a);
				//Calculate next point
				x++;
				if(p<0) {
						p += twoDy;
				}else {
					p = p + twoDyMinusDx;
					if(y1<=y2) {
						//dy/dx >= 0
						y++;
					}else {
						//y1>y2,dy/dx < 0
						y--;
					}
				}
			}
		}else {
			//degree >= 45
			while(Math.abs(y-y2) != 0) {
				// draw current point
				point(x, y, r, g, b, a);
				//Calculate next point
				if(y<=y2) {
					//dy/dx > 0
					y++;
				}else {
					//dy/dx <= 0
					y--;
				}
				if(p<0) {
					p = p + twoDyMinusDx;
					x++;
				}else {
					p = p - twoDx;
				}
			}
		}
	}

经过一阵子的strugglling,莫名其妙的他就好了,引入了两个变量保存线段终点。其他地方哪里不同,我是看不出来了。

public void bresehamLine(int x1, int y1, int x2, int y2, int r, int g, int b, int a) {
		int dx = Math.abs(x2-x1); // dx
		int dy = Math.abs(y2-y1) ; // dy
		int twoDy = 2*dy; // 2dy
		int twoDx = 2*dx;
		int twoDyMinusDx = 2*(dy - dx); // 2dy-2dx
		int twoDyAddDx = 2*(dy + dx);
		int p = 2*dy - dx;
		int x = x1;
		int y = y1;
		int xEnd = x2;
		int yEnd = y2;
		if((x1>x2)) {
			//draw from (x2,y2)
			x = x2; xEnd = x1; y = y2; yEnd = y1;
		}
		if(dx>dy) {
			// dx>dy, 0<k<1, so that 0< degree <45, 
			while(x <= xEnd) {
				// draw current point
				point(x, y, r, g, b, a);
				//Calculate next point
				x++;
				if(p<0) {
						p += twoDy;
				}else {
					p = p + twoDyMinusDx;
					if(y<=yEnd) {
						//
						y++;
					}else {
						//y1>y2,
						y--;
					}
				}
			}
		}else {
			//dx<dy, k>1, so that degree >= 45
			while(Math.abs(y-yEnd) != 0) {
				// draw current point
				point(x, y, r, g, b, a);
				//Calculate next point
				if(y<=yEnd) {
					//dy/dx > 0
					y++;
				}else {
					//dy/dx <= 0
					y--;
				}
				if(p<0) {
					p = p + twoDyMinusDx;
					x++;
				}else {
					p = p - twoDx;
				}
			}
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值