//在构造函数里添加以下两句:
//加载十字光标
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
}
运行效果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)