如何用c++编一个简单画图程序

如何用c++编一个简单画图程序,第1张

============================================================

//在构造函数里添加以下两句:

//加载十字光标

m_hCrossCur = AfxGetApp()->LoadStandardCursor(IDC_CROSS)

//加载箭头光标

m_hArrowCur = AfxGetApp()->LoadStandardCursor(IDC_ARROW)

============================================================

============================================================

//以下是画直线的代码:

void CMyProject4View::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

m_bLButtonDown = TRUE//鼠标左键按下

m_ptStart = point //直线的起点

m_ptEnd = point //直线的临时端点

SetCapture()

SetCursor(m_hCrossCur)//设置鼠标捕捉

CView::OnLButtonDown(nFlags, point)

}

void CMyProject4View::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

if(m_bLButtonDown)

{

m_bLButtonDown = FALSE//鼠标左键释放

ReleaseCapture() //释放鼠标捕捉

CClientDC dc(this)//创建客户区设备环境

dc.MoveTo(m_ptStart)

dc.LineTo(point)

SetCursor(m_hArrowCur)

CView::OnLButtonUp(nFlags, point)

}

}

void CMyProject4View::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

if(m_bLButtonDown)

{

CClientDC dc(this)

dc.SetROP2(R2_NOT)

dc.MoveTo(m_ptStart)//擦除从起点到上个鼠标移动点间的直线

dc.LineTo(m_ptEnd)

dc.MoveTo(m_ptStart)//绘制从起点到当前点间的直线

dc.LineTo(point)

m_ptEnd = point //保存当前鼠标位置

}

CView::OnMouseMove(nFlags, point)

}

============================================================

============================================================

以下是画圆的代码:

void CMyProject4View::OnPaint()

{

CPaintDC dc(this)// device context for painting

// TODO: Add your message handler code here

CRect rcClient

GetClientRect (&rcClient)

int cx=rcClient.Width() /2

int cy=rcClient.Height() /2

CRect rc(cx-45,cy-45,cx+45,cy+45)

CBrush brush(RGB(0,250,250))

CBrush *poldbrush=dc.SelectObject(&brush)

dc.Ellipse(rc)

}

// Do not call CView::OnPaint() for painting messages

}

============================================================

===========================================================

C语言中提供了库函数来画圆,函数名为circle

函数的头文件为 #include<graphics.h>

函数功能: circle()使用当前绘图色并以实线画一个完整的圆。

用法:该函数调用方式为void circle(int x,int y,int radius)

说明:参数x,y为圆心坐标,radius为圆半径,用像素个素表示。注意,调用circle()函数画圆时不用当前线型。

你描述的输入不清,我调整了一下。

其实最重要是分解程序编程一个一个 *** 作。

首先要有个画板

然后程序能画线,

最后对三角形填充。

就是这么简单,三种 *** 作。

先来个短的代码:

#include <stdio.h>

#include <math.h>

#include <string.h>

using namespace std

const int bsize = 64 // 最大画板大小

const double eps = 1e-6 // 精度控制

char board[bsize][bsize] // 画板

int bw, bh // 画板宽高

int main()

{

void printBoard() // 输出画板内容

int iw, ih

double x[3], y[3]

double v0x, v0y, v1x, v1y, v2x, v2y

double d00, d01, d11, d20, d21, denom, v, u, w

scanf("%d%d", &ih, &iw)

bw = iw + 2 // 你边缘多出了边框,所以+2

bh = ih + 2

scanf("%lf%lf%lf%lf%lf%lf", x, y, x + 1, y + 1, x + 2, y + 2)

// 清空画板

for (int i = 0 i < bh i++)

for (int j = 0 j < bw j++)

board[i][j] = ' '

// 利用质心坐标求值

v0x = x[1] - x[0], v0y = y[1] - y[0]

v1x = x[2] - x[0], v1y = y[2] - y[0]

for (int i = 0 i < bh i++)

for (int j = 0 j < bw j++)

{

v2x = i - x[0], v2y = j - y[0]

 d00 = v0x*v0x + v0y*v0y

 d01 = v0x*v1x + v0y*v1y

 d11 = v1x*v1x + v1y*v1y

 d20 = v2x*v0x + v2y*v0y

 d21 = v2x*v1x + v2y*v1y

 denom = d00*d11 - d01*d01

 v = (d11*d20 - d01*d21) / denom

 u = (d00*d21 - d01*d20) / denom

 w = 1 - u - v

 if (0 <= v && v <= 1 && 0 <= u && u <= 1 && 0 <= w && w <= 1)

 board[bh - 1 - i][j] = '*'

}

// 画边框

for (int i = 0 i < bw i++)

{

board[0][i] = '-'

board[bh - 1][i] = '-'

}

for (int i = 0 i < bh i++)

{

board[i][0] = '|'

board[i][bw - 1] = '|'

}

board[0][0] = board[bh - 1][0] = board[0][bw - 1] = board[bh - 1][bw - 1] = '+'

printBoard()

return 0

}

void printBoard()

{

int i, j

for (j = 0 j < bh j++)

{

for (i = 0 i < bw i++)

putc(board[j][i], stdout)

putc('\n', stdout)

}

}

就是枚举三角形点来画的。

运行效果:

然后给你一份通用示例吧,

这可以画任意边型,

都有注释了,

不懂可以再询问。

代码如下:

#include <stdio.h>

#include <math.h>

#include <string.h>

using namespace std

const int bsize = 64 // 最大画板大小

const double eps = 1e-6 // 精度控制

char board[bsize][bsize] // 画板

int bw, bh // 画板宽高

int main()

{

void clearBoard(char brush) // 清空画板

void drawBorder() // 画边框的

void drawLine(double x0, double y0, double x1, double y1, char brush) // 画线的

void fillArea(char brush) // 填充的

void printBoard() // 输出画板内容

int w, h

double x[3], y[3]

scanf("%d%d", &h, &w)

bw = w + 2 // 你边缘多出了边框,所以+2

bh = h + 2

scanf("%lf%lf%lf%lf%lf%lf", x, y, x + 1, y + 1, x + 2, y + 2)

// 初始化画板

clearBoard(' ')

drawBorder()

// 画三角形

drawLine(x[0], y[0], x[1], y[1], '*')

drawLine(x[1], y[1], x[2], y[2], '*')

drawLine(x[2], y[2], x[0], y[0], '*')

// 填充输出

fillArea('*')

printBoard()

return 0

}

void printBoard()

{

int i, j

for (j = 0 j < bh j++)

{

for (i = 0 i < bw i++)

putc(board[j][i], stdout)

putc('\n', stdout)

}

}

// 填充 brush 围成的区域

void fillArea(char brush)

{

int i, j, b, e

for (j = 0 j < bh j++)

{

b = e = -1

for (i = 0 i < bw i++)

if (board[j][i] == brush)

if (b == -1) b = i

else e = i

for (i = b i <= e i++)

board[j][i] = brush

}

}

// 填充单个像素

void fillPixel(int x, int y, char brush)

{

int tx, ty

// 对坐标的转换

tx = x

ty = bh - y - 1

if (tx >= 0 && tx < bw && ty >= 0 && ty < bh) // 如果超出画板就不用画了

board[ty][tx] = brush

}

// 符号函数 整数返回1,负数返回-1,零返回0

int sign(double v)

{

if (fabs(v) < eps) return 0

else if (v > 0) return 1

else return -1

}

// 交换用

void sawp(double *a, double *b)

{

double t

t = *a, *a = *b, *b = t

}

/*

* Bresenham 直线算法,请自行搜索

*/

void drawLine(double x0, double y0, double x1, double y1, char brush)

{

int x, y

double deltax, deltay, error, deltaerr, t

if (x0 > x1) sawp(&x0, &x1), sawp(&y0, &y1)

deltax = x1 - x0

deltay = y1 - y0

error = 0

if (fabs(deltax) < eps)

{

// 垂直线斜率不存在,要特殊处理

x = round(x0)

t = round(fmax(y0, y1))

for (y = round(fmin(y0, y1)) y <= t y++)

fillPixel(x, y, brush)

return

}

// Bresenham 直线算法

deltaerr = fabs(deltay / deltax)

y = round(y0)

for (x = round(x0) x <= x1 x++)

{

fillPixel(x, y, brush)

error += deltaerr

while (error >= 0.5)

{

fillPixel(x, y, brush)

y = y + sign(y1 - y0)

error -= 1.0

}

}

}

void drawBorder()

{

// 画四条边

drawLine(1, 0, bw - 2, 0, '-')

drawLine(1, bh - 1, bw - 2, bh - 1, '-')

drawLine(0, 1, 0, bh - 2, '|')

drawLine(bw - 1, 1, bw - 1, bh - 2, '|')

// 画四个角落

fillPixel(0, 0, '+')

fillPixel(bw - 1, 0, '+')

fillPixel(bw - 1, bh - 1, '+')

fillPixel(0, bh - 1, '+')

}

void clearBoard(char brush)

{

// 逐个填充

int i, j

for (j = 0 j < bh j++)

for (i = 0 i < bw i++)

board[j][i] = brush

}

运行效果:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7765680.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存