关于用C语言打印图形的一些问题

程序开发,脚本,各类开发工具,程序语言讨论

版主: *sake

关于用C语言打印图形的一些问题

#1  hottea » 周二 8月 15日, 2017年 8:15 pm

一般来说,这种题目都是考察 for 循环来的.但是看到了 这个 ,我就想也许可以新建一个坐标系,将需要打印的图形用不等式表达出来,然后遍历二维平面,符合该不等式的点就输出可见字符,不符合的就输出空格,应该就可以用于各种不同的图形了.

只是还有些疑惑,我该怎么选择坐标系?原点放在哪个位置?x 轴和 y 轴的方向呢?还有什么需要特别考虑的?
wiki 有你更精彩!http://zh.opensuse.org
头像
hottea
史诗
 
帖子: 1146
注册: 周六 3月 30日, 2013年 10:51 pm
Cash on hand: 85.70
Bank: 8,552.60
地址: 美丽的南宁
送出感谢: 8
收到感谢: 12
勋章: 2
I knew SuSE from Day One! (1) Donator (1)

Re: 关于用C语言打印图形的一些问题

#2  恋衣之曲 » 周二 8月 15日, 2017年 11:38 pm

坐标系按正常情况建立就行了,公式确定后,决定你要打印的 x 轴和 y 轴的区间范围,从左上角开始向右一行一行的打印。

例如用 ruby 画圆:
代码: 全选
#!/usr/bin/env ruby

r = 10 # 半径

# 区间, x = [-12, 12], y = [-12, 12]
12.downto(-12).each do |y|
  (-12..12).each do |x|
    if r**2 >= x**2 + y**2
      print "*"
    else
      print " "
    end
  end
  puts ""
end

# 区间, x = [0, 12], y = [0, 12]
12.downto(0).each do |y|
  (0..12).each do |x|
    if r**2 >= x**2 + y**2
      print "*"
    else
      print " "
    end
  end
  puts ""
end
头像
恋衣之曲
使徒
 
帖子: 336
注册: 周一 12月 16日, 2013年 12:05 pm
Cash on hand: 283.20
Bank: 27.80
送出感谢: 2
收到感谢: 54

Re: 关于用C语言打印图形的一些问题

#3  hottea » 周三 8月 16日, 2017年 12:26 am

不是很理解.感觉边界条件不好确定.
wiki 有你更精彩!http://zh.opensuse.org
头像
hottea
史诗
 
帖子: 1146
注册: 周六 3月 30日, 2013年 10:51 pm
Cash on hand: 85.70
Bank: 8,552.60
地址: 美丽的南宁
送出感谢: 8
收到感谢: 12
勋章: 2
I knew SuSE from Day One! (1) Donator (1)

Re: 关于用C语言打印图形的一些问题

#4  恋衣之曲 » 周三 8月 16日, 2017年 1:02 am

一个图形首先要找到能画出它的公式,例如圆形的公式是 x*x + y*y = r*r ,把这个公式变换成 x*x + y*y - r*r = 0 。

半径 r 是已知的数据,我们把点 (x, y) 代入公式 x*x + y*y - r*r 计算出一个结果,如果结果等于 0 表示点 (x, y) 刚好落在圆的线上,如果结果小于 0 表示点 (x, y) 落在圆内,如果结果大于 0 表示点 (x, y) 落在圆外。

任何一个图形只要能用公式进行表示,都可以换算成等式一边为 0 的公式,剩下的只要确认打印的点是处于大于 0 还是小于 0 的区域就行了。
头像
恋衣之曲
使徒
 
帖子: 336
注册: 周一 12月 16日, 2013年 12:05 pm
Cash on hand: 283.20
Bank: 27.80
送出感谢: 2
收到感谢: 54

Re: 关于用C语言打印图形的一些问题

#5  hottea » 周三 8月 16日, 2017年 8:14 am

举个例子,
代码: 全选
#include <stdio.h>
#include <stdlib.h>

void print(int row);
void print_formula(int row);
int f(double x, double y, double row);

int main(int argc, char **argv)
{
   int row;

   scanf("%d", &row);
   print(row);
//   print_formula(row);

   return EXIT_SUCCESS;
}

void print(int row) {
   for(int i = 0; i < row; i++) {
      for(int j = 2*i;j < 2*row - 1; j++) {
         putchar('*');
      }
      putchar('\n');
   }
}

这个用 for 循环输出类似这样的图形
代码: 全选
*******
*****
***
*

其中行数由用户输入.若是用另外一种方法写呢?

假设我用图形左上角的点作为原点 (0, 0),x 轴正向向右,y 轴正向向下,则这个图形用不等式表达出来应该就是:0 < x < 2*row - 1, 0 < y < row -x/2,那么我就可以写
代码: 全选
int f(double x, double y, double row) {
   return y < row - x/2
}

void print_formula(int row) {
        for(int y = 0; y > -row; y--) {
                for(int x = 0; x < 2*row - 1 ; x++) {
                        putchar(f(x, y, row) ? '*' : ' ');
                }
                putchar('\n');
        }
}


测试一下,好像不对啊.
wiki 有你更精彩!http://zh.opensuse.org
头像
hottea
史诗
 
帖子: 1146
注册: 周六 3月 30日, 2013年 10:51 pm
Cash on hand: 85.70
Bank: 8,552.60
地址: 美丽的南宁
送出感谢: 8
收到感谢: 12
勋章: 2
I knew SuSE from Day One! (1) Donator (1)

Re: 关于用C语言打印图形的一些问题

#6  恋衣之曲 » 周三 8月 16日, 2017年 10:04 am

如果用图形左上角的点作为原点 (0, 0),x 轴正向向右,y 轴正向向下。我们先将 y 轴翻转成正向向上,变成正常的坐标系,你要输出的图形也要翻转,应该是这样的:
代码: 全选
*
***
*****
*******


我们求出这个公式为 y = 3 - 1 / 2 * x,变换成 x + 2 * y - 6 = 0,要打印的区域为小于 0。

按照你最终要输出的图形,我们来确定 x 和 y 的范围。最终的图形我们要从左上开始打印,也就是 y 是从 0-3 递增的,x 是从 0-6 递增的。

打印的代码:
代码: 全选
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

# x = [0, 6], y = [0, 3]
(0..3).each do |y|
  (0..6).each do |x|
    if x + 2*y - 6 <= 0
      print "*"
    else
      print " "
    end
  end
  puts ""
end
头像
恋衣之曲
使徒
 
帖子: 336
注册: 周一 12月 16日, 2013年 12:05 pm
Cash on hand: 283.20
Bank: 27.80
送出感谢: 2
收到感谢: 54

Re: 关于用C语言打印图形的一些问题

#7  hottea » 周三 8月 16日, 2017年 12:25 pm

仔细看看,好像是因为我把公式算错了,毕竟 y 轴向下看着不太习惯.233
wiki 有你更精彩!http://zh.opensuse.org
头像
hottea
史诗
 
帖子: 1146
注册: 周六 3月 30日, 2013年 10:51 pm
Cash on hand: 85.70
Bank: 8,552.60
地址: 美丽的南宁
送出感谢: 8
收到感谢: 12
勋章: 2
I knew SuSE from Day One! (1) Donator (1)


回到 开发与开发工具

在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客