画线的c语言
❶ 怎么用C语言画点和直线
这个不管怎么说不是最开始的控制台的程序,这个新建工程的时候需要选择的是Win32的程序
画线的函数使用windows提供的API,MoveTo:移动到起点,LineToEx:移动到终点的这两个函数,是在OnPaint,或是响应WM_PAINT的消息的时候处理这两个函数;画点的画,使用SetPixel这个函数,同样也是在WM_PAINT的消息中去处理与画图有关的操作的
❷ 如何在VC里面用C语言绘制图形,直线,圆等等。另外头文件<graphics.h>在VC下不能使用,为什么
<graphics.h>是TC下使用的库
建立MFC文件,添加菜单“功能性按键”时选择“CVIEW”
函数内容如下(我用的Visual studio 2010,可能有些版本不同导致操作不同)
CDC*pDC=GetDC();//得到绘图类指针
RedrawWindow();//重建窗口
pDC->Rectangle(50,20,700,400);//以默认画笔画一矩形
CPen bluepen(PS_DASH,1,RGB(0,0,255));//创建画虚线,线宽为1的蓝色画笔
CPen*old=pDC->SelectObject(&bluepen);
pDC->Ellipse(100,50,250,200);//画圆
CPen redpen(PS_SOLID,2,RGB(255,0,0));//创建画实线,线宽为2的红色画笔
pDC->SelectObject(&redpen);
pDC->Ellipse(500,50,650,200);//画圆
pDC->MoveTo(375,100);//画一三角形
pDC->LineTo(225,300);
pDC->LineTo(525,300);
pDC->LineTo(375,100);
CBrush greenBrush(RGB(0,255,0));//创建纯色的绿色画笔刷
pDC->SelectObject(&greenBrush);
pDC->FloodFill(375,200,RGB(255,0,0));//以纯色绿笔刷填充三角形
CBrush green1Brush(HS_FDIAGONAL,RGB(0,255,0));//创建影线为斜线的绿色笔刷
pDC->SelectObject(&green1Brush);
pDC->FloodFill(600,150,RGB(255,0,0));//以绿色斜线笔刷填充圆
pDC->SelectObject(old);//释放创建的画笔,回复原来的画笔
pDC->TextOut(335,250,"HELLO WORLD,It's my first computer graphic work!");//输出字符
ReleaseDC(pDC);//释放创建的CDC对象
❸ 怎么用C语言画一条红色的直线
首先设置初始坐标和结束坐标,然后设定画线颜色,最后用draw函数画出来就好了
❹ 求一用C语言画直线的程序
不调用画图 API,用C 或 C++ 如何实现画一条线?
Milo Yip:如何开始用 C++ 写一个光栅化渲染器?
我尝试用不同技术实现画直线的方法(完整源代码在 miloyip/line),此文简单介绍个中思路。本文的代码采用 C 语言、标准库及极简的 PNG 编码函数 svpng(),没有使用其他 API。
1. Bresenham 算法
Bresenham直线算法 [1] 是最简单的直线光栅化(rasterization)算法。
Bresenham 直线
如果像上图,直线的高度小于宽度,那么 Bresenham 直线算法会为 轴每个坐标填入一个像素,绘画每个像素时按斜率判断 是否需要调整。整个算法可以避开浮点数运算,只用整数运算实现。以下是一个简单实现:
// Modified from https://rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm#C
void bresenham(int x0, int y0, int x1, int y1) {
int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1;
int dy = abs(y1 - y0), sy = y0 < y1 ? 1 : -1;
int err = (dx > dy ? dx : -dy) / 2;
while (setpixel(x0, y0), x0 != x1 || y0 != y1) {
int e2 = err;
if (e2 > -dx) { err -= dy; x0 += sx; }
if (e2 < dy) { err += dx; y0 += sy; }
}
}
为了测试不同角度,我做了一个测试用例:
int main() {
memset(img, 255, sizeof(img));
float cx = w * 0.5f - 0.5f, cy = h * 0.5f - 0.5f;
for (int j = 0; j < 5; j++) {
float r1 = fminf(W, H) * (j + 0.5f) * 0.085f;
float r2 = fminf(W, H) * (j + 1.5f) * 0.085f;
float t = j * PI / 64.0f;
for (int i = 1; i <= 64; i++, t += 2.0f * PI / 64.0f) {
float ct = cosf(t), st = sinf(t);
bresenham((int)(cx + r1 * ct), (int)(cy - r1 * st), (int)(cx + r2 * ct), (int)(cy - r2 * st));
}
}
svpng(fopen("line_bresenham.png", "wb"), W, H, img, 0);
}
完整代码 line_bresenham.c
渲染结果及中间局部放大:
2. 采样方法
Bresenham 直线算法有 3 个问题:
不能控制直线宽度;
坐标为整数;
只能对像素写入一个颜色,只用单色会有严重的锯齿效果。
在图形学中,除了以逐个图元(如直线)方式渲染,我们还可以通过对每个像素进行采样(sampling),换句话说,我们可对整个图像逐像素询问:“这个像素的颜色是什么?”
用采样方式画直线时,我们可以用一个具有面积的形状去表示“直线”,例如是长方形。但在本文中,我们使用胶囊体(capsule)去表示直线。这样就能解决上面前两个问题:(1) 可用胶囊体半径设置直线的宽度;(2) 坐标可以为浮点数。不过,用最简单的采样方式,我们需要在每像素查询所有图元是否占有该像素,效率很低。