直线与椭圆画法

版权声明:欢迎转载,请注明出处噢,谢谢 https://blog.csdn.net/DT2131/article/details/78948035

画法的原理参考教科书就行,这里给出自己写的代码(可能有BUG)

包含

BHLine(BH直线)

mpline(中点直线)

DDAline(DDA直线,可能有问题,线条不太顺)

MDcircle(中点画圆)

BHcircle(BH画圆)

MDellipse(中点画椭)

除算法本身外的必要函数使用了EasyX库,在此感谢 EasyX 团队。

//#include <stdafx.h>
#include <bits/stdc++.h>
#include <graphics.h>
#include <conio.h>

using namespace std;
const int INF = 0x3f3f3f3f;
void ddaline(int stx, int sty, int enx, int eny, int color) {
	if (stx > enx) swap(stx, enx), swap(sty, eny);
	if (stx == enx) {
		if (sty > eny) swap(sty, eny);
		while (sty <= eny) {
			putpixel(stx, sty, color);
			sty++;
		}
	}
	else if (sty == eny) {
		while (stx <= enx) {
			putpixel(stx, sty, color);
			stx++;
		}
	}
	else {
		double k = (double)(eny - sty) / (enx - stx);
		double y = sty;
		for (; stx <= enx; stx++) {
			putpixel(stx, (int)(y + 0.5), color);
			y += k;
		}
	}
}
void mpline(int stx, int sty, int enx, int eny, int color) {
	if (stx > enx) swap(stx, enx), swap(sty, eny);
	int x = stx, y = sty;
	if (stx == enx) {
		y = min(sty, eny);
		eny = max(sty, eny);
		while (y <= eny) {
			putpixel(stx, y, color);
			y++;
		}
	}
	else if (sty == eny) {
		while (x <= enx) {
			putpixel(x, sty, color);
			x++;
		}
	}
	else {
		double k = (double)(eny - sty) / (enx - stx);
		putpixel(stx, sty, color);
		int a = eny - sty, b = stx - enx, d0, d1, d2;
		if (k >= 1) {
			d0 = a + b + b, d1 = b + b, d2 = d1 + a + a;
			for (; y <= eny; y++) {
				if (d0<0) d0 += d2, x++;
				else d0 += d1;
				putpixel(x, y, color);
			}
		}
		else if (k >= 0) {
			d0 = a + a + b, d1 = a + a, d2 = d1 + b + b;
			for (; x <= enx; x++) {
				if (d0 >= 0) d0 += d2, y++;
				else d0 += d1;
				putpixel(x, y, color);
			}
		}
		else if (k >= -1) {
			d0 = a + a - b, d1 = a + a, d2 = d1 - b - b;
			for (; x <= enx; x++) {
				if (d0<0) d0 += d2, y--;
				else d0 += d1;
				putpixel(x, y, color);
			}
		}
		else {
			d0 = a - b - b, d1 = -b - b, d2 = d1 + a + a;
			for (; y >= eny; y--) {
				if (d0 >= 0) d0 += d2, x++;
				else d0 += d1;
				putpixel(x, y, color);
			}
		}
	}
}

void BHline(int stx, int sty, int enx, int eny, int color) {
	if (stx > enx) swap(stx, enx), swap(sty, eny);
	int x = stx, y = sty;
	if (stx == enx) {
		y = min(sty, eny);
		eny = max(sty, eny);
		while (y <= eny) {
			putpixel(stx, y, color);
			y++;
		}
	}
	else if (sty == eny) {
		while (x <= enx) {
			putpixel(x, sty, color);
			x++;
		}
	}
	else {
		double k = (double)(eny - sty) / (enx - stx);
		int dx = enx - stx, dy = eny - sty, dk;
		if (k >= 1) {
			dk = dx + dx - dy;
			for (; y <= eny; y++) {
				putpixel(x, y, color);
				if (dk<0) dk += dx + dx;
				else x++, dk += dx + dx - dy - dy;
			}
		}
		else if (k >= 0) {
			dk = dy + dy - dx;
			for (; x <= enx; x++) {
				putpixel(x, y, color);
				if (dk < 0) dk += dy + dy;
				else y++, dk += dy + dy - dx - dx;
			}
		}
		else if (k >= -1) {
			dk = -dy - dy - dx;
			for (; x <= enx; x++) {
				putpixel(x, y, color);
				if (dk < 0) dk += -dy - dy;
				else y--, dk += -dy - dy - dx - dx;
			}
		}
		else {
			dk = dx + dx + dy;
			for (; y >= eny; y--) {
				putpixel(x, y, color);
				if (dk < 0)  dk += dx + dx;
				else x++, dk += dx + dx + dy + dy;
			}
		}
	}
}
void wholecircle(int xc, int yc, int x, int y, int color) {
	putpixel(xc + x, yc + y, color);
	putpixel(xc + x, yc - y, color);
	putpixel(xc + y, yc + x, color);
	putpixel(xc + y, yc - x, color);
	putpixel(xc - x, yc + y, color);
	putpixel(xc - x, yc - y, color);
	putpixel(xc - y, yc + x, color);
	putpixel(xc - y, yc - x, color);
}
void Mdcircle(int xc, int yc, int r, int color) {
	int x = 0, y = r, d = 1 - r;
	wholecircle(xc, yc, x, y, color);
	while (x <= y) {
		if (d < 0) {
			d += x + x + 3;
			x++;
		}
		else {
			d += x + x - y - y + 5;
			x++; y--;
		}
		wholecircle(xc, yc, x, y, color);
	}
}
void BHcircle(int xc, int yc, int r, int color) {
	int x = 0, y = r, d = 3 - r - r;
	while (x < y) {
		wholecircle(xc, yc, x, y, color);
		if (d < 0) d = d + x + x + x + x + 6;
		else {
			d = d + x + x + x + x - y - y - y - y + 10;
			y--;
		}
		x++;
	}
	if (x == y) wholecircle(xc, yc, x, y, color);
}
void wholeellipse(int xc, int yc, int x, int y, int color) {
	putpixel(xc + x, yc + y, color); putpixel(xc + x, yc - y, color);
	putpixel(xc - x, yc + y, color); putpixel(xc - x, yc - y, color);
}
void MDellipse(int xc, int yc, int a, int b, int color) {
	int aa = a * a, bb = b * b;
	int twoaa = 2 * aa, twobb = 2 * bb;
	int x = 0, y = b;
	int dx = 0, dy = twoaa * y;
	int d = (int)(bb + aa*(-b + 0.25) + 0.5);
	wholeellipse(xc, yc, x, y, color);
	while (dx < dy) {
		x++;
		dx += twobb;
		if (d < 0) d += bb + dx;
		else {
			y--;
			dy -= twoaa;
			d += bb + dx - dy;
		}
		wholeellipse(xc, yc, x, y, color);
	}
	d = (int)(bb*(x + 0.5)*(x + 0.5) + aa*(y - 1)*(y - 1) - aa*bb + 0.5);
	while (y > 0) {
		y--;
		dy -= twoaa;
		if (d > 0) d += aa - dy;
		else {
			x++;
			dx += twobb;
			d += aa - dy + dx;
		}
		wholeellipse(xc, yc, x, y, color);
	}
}
int main()
{
	// 绘图环境初始化
	initgraph(640, 640);

	for (int x = 500; x <= 600; x += 10) {
		ddaline(x, 500, 600, 600, WHITE);
		ddaline(x, 600, 600, 600, WHITE);
		ddaline(500, x, 600, 600, WHITE);
		ddaline(600, x, 600, 600, WHITE);
	}

	
	for (int x = 300; x <= 400; x += 10) {
		mpline(x, 300, 400, 400, WHITE);
		mpline(x, 400, 400, 400, WHITE);
		mpline(300, x, 400, 400, WHITE);
		mpline(400, x, 400, 400, WHITE);
	}

	for (int x = 100; x <= 200; x+=10) {
		BHline(x, 100, 200, 200, WHITE);
		BHline(x, 200, 200, 200, WHITE);
		BHline(100, x, 200, 200, WHITE);
		BHline(200, x, 200, 200, WHITE);
	}
	
	Mdcircle(200, 200, 100, RED);
	BHcircle(200, 200, 100, RED);
	MDellipse(300, 300, 50, 250, RED);
	system("pause");
}


猜你喜欢

转载自blog.csdn.net/DT2131/article/details/78948035