我的電腦圖形功課畫線,是落實只用畫點的能力OpenGL的算法。與Bresenham直線算法
所以,很顯然,我需要得到drawLine()
上班之前,我可以畫任何東西。 drawLine()
只能使用整數來完成。沒有浮點。
這是教我的東西。基本上,線可以分爲4個不同的類別,積極陡峭,積極淺,負陡和負淺。這是我應該畫出來:
而且這是圖片我的程序繪製:
的顏色爲我們做。我們給了頂點,我們需要使用Bresenham的線算法來繪製基於起點和終點的線。
這是我到目前爲止有:
int dx = end.x - start.x;
int dy = end.y - start.y;
//initialize varibales
int d;
int dL;
int dU;
if (dy > 0){
if (dy > dx){
//+steep
d = dy - 2*dx;
dL = -2*dx;
dU = 2*dy - 2*dx;
for (int x = start.x, y = start.y; y <= end.y; y++){
Vertex v(x,y);
drawPoint(v);
if (d >= 1){
d += dL;
}else{
x++;
d += dU;
}
}
} else {
//+shallow
d = 2*dy - dx;
dL = 2*dy;
dU = 2*dy - 2*dx;
for (int x = start.x, y = start.y; x <= end.x; x++) {
Vertex v(x,y);
drawPoint(v);
// if choosing L, next y will stay the same, we only need
// to update d by dL
if (d <= 0) {
d += dL;
// otherwise choose U, y moves up 1
} else {
y++;
d += dU;
}
}
}
} else {
if (-dy > dx){
cout << "-steep\n";
//-steep
d = dy - 2*dx;
//south
dL = 2*dx;
//southeast
dU = 2*dy - 2*dx;
for (int x = start.x, y = start.y; y >= end.y; --y){
Vertex v(x,y);
drawPoint(v);
//if choosing L, next x will stay the same, we only need
//to update d
if (d >= 1){
d -= dL;
} else {
x++;
d -= dU;
}
}
} else {
cout << "-shallow\n";
//-shallow
d = 2*dy - dx;
dL = 2*dy;
dU = 2*dy - 2*dx;
for (int x = start.x, y = start.y; x <= end.x; x++){
Vertex v(x,y);
drawPoint(v);
if (d >= 0){
d += dL;
} else {
--y;
d -= dU;
}
}
}
}
我知道我的錯誤將是愚蠢的事,但老實說,我想不出什麼我做錯了。爲什麼有些線條如上所示不正確?
什麼是不工作? – 2012-04-08 03:03:21
如果你看一下上面我的代碼段的兩張圖片中,「第二象限」和「四象限」不提款權。我將這些引號放在引號中,因爲point(0,0)位於圖片的左下角。基本上,第一個else語句包含不正常工作的代碼 - 淺 - 和。 – ToastyMallows 2012-04-08 03:10:44
在2個簡單的例子中運行你的代碼,一個可行,一個不行。說(0,0),(5,5)和(0,5),(5,0),跟蹤兩者,看他們是否有分歧。這將是一個更好的練習,而不是讓某個人爲你做這件事。 – 2012-04-08 03:24:33