版权声明:欢迎转载,请注明出处噢,谢谢 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");
}