#include<iostream>
#include"math.h"
#include"windows.h"
using namespace std;
HDC dc = GetWindowDC(GetDesktopWindow());
int ff(float x)
{
return (int)(x < 0 ? x - 0.5 : x + 0.5);
}
void DDCLine(int x0, int y0, int x1, int y1, COLORREF color)
{
float dx, dy,x, y;
int numb = abs(x1 - x0) > abs(y1 - y0) ? abs(x1 - x0) : abs(y1 - y0);
x = (float)(x0);
y = (float)(y0);
dx = (float)(x1 - x0) / numb;
dy = (float)(y1 - y0) / numb;
for (int i = 0; i <= numb; i++)
{
SetPixel(dc, ff(x), ff(y), color);
Sleep(1);
x += dx;
y += dy;
}
Sleep(900);
}
void MidptLine(int x0, int y0, int x1, int y1, int color)
{
/*int a, b, d1, d2, d, x, y;
a = y0 - y1, b = x1 - x0, d = 2 * a + b;
d1 = 2 * a, d2 = 2 * (a + b);
x = x0, y = y0;
SetPixel(dc, x, y, color);
while (x < x1)
{
if (d < 0)
{
x++, y++, d += d2;
}
else
{
x++, d += d1;
}
SetPixel(dc, x, y, color);
Sleep(1);
}*/
int x = x0, y = y0;
int a = y0 - y1, b = x1 - x0;
int dx = (b >= 0 ? 1 : (b = -b, -1));
int dy = (a <= 0 ? 1 : (a = -a, -1));
SetPixel(dc, x, y, color);
int d, d1, d2;
if (-a <= b)
{
d = 2 * a + b;
d1 = 2 * a;
d2 = 2*(a + b);
while (x != x1)
{
if (d < 0)
y += dy, d += d2;
else
d += d1;
x += dx;
SetPixel(dc, x, y, color);
Sleep(1);
}
}
else
{
d = 2 * b + a;
d1 = 2 * b;
d2 = 2 * (a + b);
while (y != y1)
{
if (d < 0)
d += d1;
else
d += dx, d += d2;
y += dy;
SetPixel(dc, x, y, color);
Sleep(1);
}
}
Sleep(900);
}
void BresenhamLine(int x0, int y0, int x1, int y1, int color)
{
/*int x, y, dx, dy, e;
dx = x1 - x0, dy = y1 - y0, e = -dx;
x = x0, y = y0;
for (int i = 0; i <= dx; i++)
{
SetPixel(dc, x, y, color);
Sleep(1);
x++, e = e + 2 * dy;
if (e >= 0){ y++; e = e - 2 * dx; }
}*/
int x = x0;
int y = y0;
int dx = abs(x1 - x0);
int dy = abs(y1 - y0);
int n1 = x1 > x1 ? 1 : -1;
int n2 = y1 > y0 ? 1 : -1;
bool interchange = false;
if (dy > dx)
{
int temp = dx;
dx = dy;
dy = temp;
interchange = true;
}
int p = 2 * dy - dx;
for (int i = 0; i < dx; i++)
{
SetPixel(dc, x, y, color);
Sleep(1);
if (p >= 0)
{
if (!interchange)
y += n2;
else
x += n1;
p -= 2 * dx;
}
if (!interchange)
x += n1;
else
y += n2;
p += 2 * dy;
}
//float x, y, dx, dy, e, k;
//dx = x1 - x0, dy = y1 - y0, x = x0, y = y0;
//if (dx == 0){
// if (dy>0){
// while (y0 <= y1){
// SetPixel(dc,x0, y0, color);
// Sleep(1);
// y0++;
// }
// }
// else{
// while (y1 <= y0){
// SetPixel(dc,x1, y1, color);
// Sleep(1);
// y1++;
// }
// }
// return;
//}
//else
// k = dy / dx;
//if (k >= 0 && k<1){
// e = -dx;
// for (int i = 0; i <= dx; i++){
// SetPixel(dc,x, y, color);
// Sleep(1);
// x++, e = e + 2 * dy;
// if (e >= 0){
// y++; e = e - 2 * dx;
// }
// }
//}
//else if (k >= 1){
// e = -dy;
// for (int i = 0; i <= dy; i++){
// SetPixel(dc,x, y, color);
// Sleep(1);
// y++, e = e + 2 * dx;
// if (e >= 0){
// x++; e = e - 2 * dy;
// }
// }
//}
//else if (k<0 && k >= -1){
// e = dx;
// for (int i = 0; i <= dx; i++){
// SetPixel(dc,x, y, color);
// Sleep(1);
// x++, e = e + 2 * dy;
// if (e <= 0){
// y--; e = e + 2 * dx;
// }
// }
//}
//else{
// e = -dy;
// for (int i = 0; i <= abs(dy); i++){
// SetPixel(dc,x, y, color);
// Sleep(1);
// y--; e = e + 2 * dx;
// if (e >= 0){
// x++; e = e + 2 * dy;
// }
// }
//}
Sleep(900);
}
int main()
{
/*int a;
cout << "想看DDC请按1;"<<endl<<"想看中点画线请按2;"<<endl<<"想看Bresenham请按3;"<<endl;
cin >> a;*/
int color1 = RGB(255, 0, 0);
int color2 = RGB(0, 255, 0);
int color3 = RGB(0, 0, 255);
Sleep(1000);
DDCLine(1000, 300, 200, 1000, color1);
DDCLine(500, 0, 500, 800, color1);
MidptLine(1200, 300, 300, 800, color2);
MidptLine(800, 0, 800, 800, color2);
BresenhamLine(1400, 300, 200, 1000, color3);
BresenhamLine(1100, 0, 1100, 1000, color3);
return 0;
}
计算机图形学的三种直线算法实现
需积分: 5 33 浏览量
2016-06-27
11:10:01
上传
评论 1
收藏 10.77MB ZIP 举报
Resurgam211
- 粉丝: 0
- 资源: 2