C语言基础问题,画三角形

Python09

C语言基础问题,画三角形,第1张

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

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

首先要有个画板

然后程序能画线,

最后对三角形填充。

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

先来个短的代码:

#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语言输出正三角形演示: