1.数值微分法算法
void MIDPOINT_Line(CDC *&pDC, CPoint startPoint, CPoint endPoint, COLORREF crColor)
{
if (endPoint.x != startPoint.x && endPoint.y != startPoint.y)
{
int kFlag = 0;
int sFlag = 1;
if (startPoint.x > endPoint.x)
{
CPoint tem = startPoint;
startPoint = endPoint;
endPoint = tem;
}
if (abs(endPoint.y - startPoint.y)> abs(endPoint.x - startPoint.x))
{
kFlag = 1;
}
if (endPoint.y < startPoint.y)
{
sFlag = -1;
}
int a, b,tA, tAB, d, x, y;
if (sFlag == -1)
{
endPoint.y = startPoint.y + (startPoint.y - endPoint.y);
}
a = startPoint.y - endPoint.y;
b = endPoint.x - startPoint.x;
tA = 2 * a;
tAB = 2 * (a + b);
d = 2 * a + b;
x = startPoint.x;
y = startPoint.y;
pDC->SetPixel(x, y, crColor);
if (kFlag == 0) {
for (int i = 0; i < (endPoint.x - startPoint.x); i++)
{
if (d>= 0)
{
pDC->SetPixel(x + 1, y, crColor);
x += 1;
d += tA;
}
else
{
pDC->SetPixel(x + 1, y + sFlag, crColor);
x += 1;
y += sFlag;
d += tAB;
}
}
}
else
{
if (kFlag == 1)
{
tA = 2 * b;
d = 2*b + a;
}
for (int i =0; i< abs(endPoint.y - startPoint.y); i++)
{
if (d >= 0) {
pDC->SetPixel(x + 1, y + sFlag, crColor);
y += sFlag;
x += 1;
d += tAB;
}
else {
pDC->SetPixel(x, y + sFlag, crColor);
y += sFlag;
d += tAB;
}
}
}
}
else if (startPoint.x == endPoint.x)
{
if (startPoint.y < endPoint.y) {
for (int i = startPoint.y; i < endPoint.y; i++)
{
pDC->SetPixel(startPoint.x, i, crColor);
}
}
else {
for (int i = endPoint.y; i < startPoint.y; i++)
{
pDC->SetPixel(startPoint.x, i, crColor);
}
}
}
else if (startPoint.y == endPoint.y)
{
if (startPoint.x < endPoint.x)
{
for (int i = startPoint.x; i < endPoint.x; i++)
{
pDC->SetPixel(i, startPoint.y, crColor);
}
}
else {
for (int i = endPoint.x; i < startPoint.x; i++)
{
pDC->SetPixel(i, startPoint.y, crColor);
}
}
}
}
2.中点画线法算法
void DDA_Line(CDC *&pDC, CPoint &startPoint, CPoint &endPoint, COLORREF crColor)
{
if (endPoint.x != startPoint.x && endPoint.y != startPoint.y)
{
double x, y;
double k;
k = ((float)(endPoint.y - startPoint.y) - (float)(endPoint.x - startPoint.y));
x = endPoint.x;
y = endPoint.y;
pDC->SetPixel((int)x, (int)y, crColor);
if (fabs(k) <= 1.0) {
for (int i =0; i<fabs(endPoint.x -startPoint.x); i++)
{
if (endPoint.x > startPoint.x)
{
x += 1;
y += k;
}
else
{
x -= 1;
y -= k;
}
pDC->SetPixel((int)x, (int)(y + 0.5), crColor);
}
}
else if (fabs(k) > 1)
{
for (int i =0; i<fabs(endPoint.y -startPoint.y); i++)
{
if (endPoint.y > startPoint.y) {
y += 1;
x += 1.0 / k;
}
else {
y -= 1;
x -= 1.0 / k;
}
pDC->SetPixel((int)x + 0.5, (int)y, crColor);
}
}
}
else if(startPoint.x == endPoint.x)
{
if (startPoint.y < endPoint.y) {
for (int i =startPoint.y; i<endPoint.y; i++)
{
pDC->SetPixel(startPoint.x, i, crColor);
}
}
else {
for (int i = endPoint.y; i < startPoint.y; i++)
{
pDC->SetPixel(startPoint.x, i, crColor);
}
}
}
else if (startPoint.y == endPoint.y)
{
if (startPoint.x < endPoint.x)
{
for (int i = startPoint.x; i < endPoint.x; i++)
{
pDC->SetPixel(i, startPoint.y, crColor);
}
}
else {
for (int i = endPoint.x; i< startPoint.x; i++)
{
pDC->SetPixel(i, startPoint.y, crColor);
}
}
}
}
3.Bresenham 画线算法