Computer graphics experiment 1
本代码在vs2019调试且需建立MFC工程后在 view.cpp目录下的OnDraw后添加 *
1,绘制像素点,画两个点,将第一个点的颜色赋给另一个点
CPoint p0(100, 100), p1(p0.x + 100, p0.y); pDC->SetPixel(p0, RGB(255, 0, 0)); COLORREF crColor = pDC->GetPixel(p0);
pDC->SetPixel(p1, crColor);,
2,已知一个正方形像素快,在坐标轴中画一个相同的像素快
CRect rect;
GetClientRect(rect);//对rect初始化
//映射模式函数
pDC->SetMapMode(MM_ADDSEPARATOR);
//设置窗口的长和宽
pDC->SetWindowExt(rect.Width(), rect.Height());
//设置视区大小
pDC->SetViewportExt(rect.Width(), -rect.Height());
//设置原点位置
pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);
//偏移量
rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);
//自定义坐标系结束
srand((unsigned)time(NULL));
COLORREF crColor;
for (int x = 50;x < 150; x++)
for (int y = -50;y < 50; y++)
pDC->SetPixelV(x, y, RGB(rand() % 255, rand() % 255, rand() % 255, ));
for (int x = 50; x < 150; x++)
for (int y = -50; y < 50; y++)
{
crColor = pDC->GetPixel(x, y);
pDC->SetPixelV(-x, y,crColor);
}
3,给定P0(100, 100)、P1(300, 200)和P2(500, 150)。要求从P0到P1点绘制一条 - -像素宽的绿色实线,从Pj到P2点绘制一 - 条 1像素宽的蓝色实线。请在设备坐标系中编程实现,效果如图所示。
CPoint p0(100, 100), p1(300, 200), p2(500, 150);
CPen greenPen, bluePen, * poldPen;
//创建新画笔
greenPen.CreatePen(0, 1, RGB(0, 255, 0));
poldPen = pDC->SelectObject(&greenPen);
pDC->MoveTo(p0);
pDC->LineTo(p1);
pDC->SelectObject(poldPen);//相当于注销画笔,返回最初画笔
bluePen.CreatePen(0, 1, RGB(0, 0, 255));
poldPen = pDC->SelectObject(&bluePen);
pDC->LineTo(p2);
pDC->SelectObject(poldPen);//相当于注销画笔,返回最初画笔
例11-3+将圆n等分后,使用直线段将各等分点相连得到的图
案称为金刚石图案。假定n为10,请在自定义坐标系中编程实现,效果如图所示。
CRect rect;
GetClientRect(rect);//对rect初始化
//映射模式函数
pDC->SetMapMode(MM_ADDSEPARATOR);
//设置窗口的长和宽
pDC->SetWindowExt(rect.Width(), rect.Height());
//设置视区大小
pDC->SetViewportExt(rect.Width(), -rect.Height());
//设置原点位置
pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);
//偏移量
rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);
//自定义坐标系结束
int r = 200, n = 10;//半径,等分为10份
CPoint P[10];
double theta = 2 * PI / n;
for (int i = 0; i < n; i++)
{
P[i].x = (int)(r * cos(i * theta));
P[i].y = (int)(r * sin(i * theta));
}
for (int i = 0; i <= n - 2; i++)
{
for (int j = i + 1; j <= n - 1; j++)
{
pDC->MoveTo(P[i]);
pDC->LineTo(P[j]);
}
}
例11-4绘制左上角点为(100, 100),右下角点为(600, 300)的
矩形。请在设备坐标系中编程实现,效果如图所示。
//直接用矩形函数rectangle
//pDC->Rectangle(100, 100, 600, 300);
CPoint p0(100, 100), p1(600, 300);
CRect rect(p0, p1);
pDC->Rectangle(rect);
例11-4+将客户区矩形左右边界各收缩100个像素,上下边界各收缩50个像素得到一个新矩形。使用3像素宽的绿色实线绘制边界线,使用蓝色填充矩形内部。请在自定义坐标系中编程实现,效果如图所示。 CRect rect;
GetClientRect(rect);//对rect初始化
//映射模式函数
pDC->SetMapMode(MM_ADDSEPARATOR);
//设置窗口的长和宽
pDC->SetWindowExt(rect.Width(), rect.Height());
//设置视区大小
pDC->SetViewportExt(rect.Width(), -rect.Height());
//设置原点位置
pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);
//偏移量
rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);
//自定义坐标系结束
//DeflateRect(a,b)缩小像素,左右a个像素,上下b个像素
rect.DeflateRect(100, 50);
//画笔变量
CPen NewPen, * OldPen;
NewPen.CreatePen(0, 3, 0x00ff00);
OldPen = pDC->SelectObject(&NewPen);
CBrush NewBrush, * OldBrush;
NewBrush.CreateSolidBrush(0xff0000);
OldBrush = pDC->SelectObject(&NewBrush);
pDC->Rectangle(rect);
pDC->SelectObject(OldPen);
pDC->SelectObject(OldBrush);
