你描述的输入不清,我调整了一下。
其实最重要是分解程序编程一个一个操作。
首先要有个画板,
然后程序能画线,
最后对三角形填充。
就是这么简单,三种操作。
先来个短的代码:
#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
}
运行效果:
1、打开visual C++ 6.0软件,准备好一个空白的c语言文件,首先引入预处理命令和主函数:
2、接着定义变量并确定行数,这里用3个for循环,外层的for循环用来遍历行数,里面的第一个for循环确定空格数量,另一个for循环确定每一行星号数量并换行,图像的输出也是在for循环中完成的:
3、程序编写完成,运行程序观察输出结果,可以看到其中输出了正三角形的形状。以上就是用c语言输出正三角形演示: