打印出 ASCII 圆和轴

2023-12-06

该程序在笛卡尔平面上打印一个圆。

输入是:半径、圆心坐标 (cx,cy) 以及我们要用来打印圆的字符。

如果圆上的点与轴重叠,则该点优先。我在方法中编写了打印轴的条件drawCircle,但是图像扭曲了......

有些事情让我困惑......有人可以帮助我找出我的错误吗?

这是我的整个程序(有问题的方法是最后一个,drawCircle):

public class Circle {
  public static void main(String[] args) {
    System.out.println(onCircle(1, 2, 3, 4, 5));

    drawCircle(1, 3, 3, '*');
    drawCircle(3, 3, 3, '*');
    drawCircle(5, 10, 12, '*');
  }

  //Question 1A
  public static boolean onCircle(int radius, int cx, int cy, int x, int y) {
    //default answer is false, but if the
    //inequality holds then it is set to true
    boolean isDrawn = false;
    if (Math.pow(radius,2)<=(Math.pow((x-cx),2)+Math.pow((y-cy),2))
        && (Math.pow((x-cx),2)+Math.pow((y-cy),2))<=(Math.pow(radius,2)+1)) {
      isDrawn = true;
    }
    return isDrawn;
  }

  //Question 1B
  public static void verifyInput(int radius, int cx, int cy) {
    //if radius is negative, display error message
    if (radius <= 0) {
      throw new IllegalArgumentException(
                "The radius of the circle must be a positive number.");
    }
    //if the center of the circle with radius 'radius' causes the circle
    //to 'overflow' into other quadrants, display error message
    if ((cx - radius) < 0 || (cy - radius) < 0) {
      throw new IllegalArgumentException(
                "the circle with requested parameters does not fit " +
                "in the quadrant. Consider moving the center of the " +
                "circle further from the axes.");
    }
  }

  //Question 1C
  public static void drawCircle(int radius, int cx, int cy, char symbol) {
    verifyInput(radius, cx, cy);
    //set the values for extension of the axes (aka how long are they)
    int xMax = cx + radius + 1;
    int yMax = cy + radius + 1;
    for (int j = yMax; j >= 0; j--) {
      for (int i = 0; i <= xMax; i++) {
        //set of if-block to print the axes
        if (i == 0 && j == 0) {
          System.out.print('+');
        } else if (i == 0) {
          if (j == yMax) {
            System.out.print('^');
          }
          if (j != yMax && onCircle(radius, cx, cy, i, j) == false) {
            System.out.print('|');
          }
        } else if (j == 0) {
          if (i == xMax) {
            System.out.print('>');
          }
          if (i != xMax && onCircle(radius, cx, cy, i, j) == false) {
            System.out.print('-');
          }
        }

        //if block to print the circle
        //verify for each coordinate (i,j)
        //in the quadrant if they are on circle
        //if =true print symbol, if =false print empty character
        if (onCircle(radius, cx, cy, i, j) == true) {
          System.out.print(symbol);
        } else {
          System.out.print(' ');
        }
      }
      System.out.println();
    }
  }
}

这是我得到的:

false
^      
|  *** 
|  * * 
|  *** 
|      
+ - - - - > 
^        
|  ***   
|        
*     * 
*     * 
*     * 
|        
+ - ***- - > 
^                 
|         ***     
|       *     *   
|      *       *  
|                 
|     *         * 
|     *         * 
|     *         * 
|                 
|      *       *  
|       *     *   
|         ***     
|                 
|                 
|                 
|                 
|                 
|                 
+ - - - - - - - - - - - - - - - > 

正如您所看到的,第一个和第三个圆很好,但与轴重叠的那个圆扭曲了。


一般圆的方程以原点为中心:

Equation of a circle

In Java它可以这样实现:

i*i + j*j == r*r

但在一个情况下整数坐标系, 你必须round这个方程以某种方式使得圆的所有点都反映在这个坐标系中:

(int) Math.sqrt(i*i + j*j) == r

If r=8,那么圆和轴看起来像这样:

r=8
        * * * * * * * * *         
      * *       *       * *       
    *           *           *     
  *             *             *   
* *             *             * * 
*               *               * 
*               *               * 
*               *               * 
* * * * * * * * * * * * * * * * * 
*               *               * 
*               *               * 
*               *               * 
* *             *             * * 
  *             *             *   
    *           *           *     
      * *       *       * *       
        * * * * * * * * *         

在线尝试一下!

int r = 8;
System.out.println("r=" + r);
IntStream.rangeClosed(-r, r)
        .peek(i -> IntStream.rangeClosed(-r, r)
                .mapToObj(j -> i == 0 || j == 0 ||
                        (int) Math.sqrt(i*i + j*j) == r ?
                        "* " : "  ")
                .forEach(System.out::print))
        .forEach(i -> System.out.println());

See also: Print out an ASCII star in java

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

打印出 ASCII 圆和轴 的相关文章

随机推荐

  • vector.push_back 上的“glibc free():无效的下一个大小(快速)”?

    当我运行我的程序时 它偶尔会崩溃并给出以下错误 检测到 glibc pathtoexecutable free 下一个大小无效 快速 回溯导致一个成员函数只调用向量的push back函数 void Path add Position p
  • 用于将重复行插入另一个表的插入触发器之前

    我有一张桌子叫tblspmaster其中 sp 列我有唯一索引 因此不会插入重复项 但我想将重复行插入到tblspduplicate 所以我决定为此编写触发器 IN 主表是tblspmaster记录将使用加载文件插入mysql create
  • 条形图上的错误栏

    我试图得到 一个漂亮的组条形图 我希望每个条形上都有误差条 如下所示 或类似的 由您自行决定 我有办法 ff Medical eq Patient Hygiene Near bed Far bed Direct 1 2759 0 9253
  • 为什么我的 XML 阅读器读取所有其他元素?

    我构建了一个非常简单的表格 显示 4 列和 4 行 执行以下代码时 它会显示 xml 文件中的所有其他元素 它不区分每个表行 它读起来没有任何问题 而且我已经运行了 xml 验证器 所以这不是语法问题 public partial clas
  • 什么时候需要条件变量,互斥锁还不够吗?

    我确信互斥锁还不够 这就是条件变量概念存在的原因 但这让我很困惑 当条件变量至关重要时 我无法用具体的场景说服自己 条件变量 互斥锁和锁之间的区别问题的接受答案说条件变量是 带有 信号 机制的锁 当线程需要时使用它 等待资源变得可用 线程可
  • FFMPEG 链接错误

    我正在尝试编译此版本的修改版本来自 FFMPEG 站点的转码示例 我已经使用了所有必需的包含并使用此加入了库 INCLUDEPATH FFMPEG DEV PATH include LIBS L FFMPEG DEV PATH lib la
  • 无论如何,我可以突出显示 JTable 中的一行吗?

    我目前正在使用 JTable 和 DefaultTableModel 构建数据库 在我的程序中我 具有允许用户搜索数据库的功能 我已经构建了搜索部分 但没有 知道如何突出显示 JTable 中的行或单元格 有人可以帮帮我吗 谢谢 您确定要突
  • PHP 访问数组值[重复]

    这个问题在这里已经有答案了 我正在尝试访问我创建的数组的值 但似乎失败了 我正在循环发送 VIA http 的数组 并添加docno and entryno到名为的新数组 ArrID 它可以添加到新数组中 但是当我尝试访问ArrID似乎没有
  • Sequelize 连接模型包括多对多

    假设我有三个这样的模型 var User define user username Sequelize INTEGER var UserPubCrawl define userpubcrawl user id Sequelize STRIN
  • Python中重新赋值会从内存中删除之前的值吗?

    gt gt p 5 gt gt id p 140101523888800 gt gt p 5 56 gt gt id p 140100617985840 我知道将新值分配给现有变量时 它指向内存中存储新值的新位置 但我的问题是 包含先前值的
  • selenium python 中 find_element_by_class_name 的属性是什么?

    browser webdriver Firefox browser get url divs browser find elements by class name class browser find element by class n
  • 使用 C 中的 regex.h 计算匹配数

    我正在使用 POSIX 正则表达式regex h用 C 语言计算英语文本片段中短语出现的次数 但返回值是regexec 只告诉是否找到匹配项 所以我尝试使用nmatch and matchptr找到不同的外观 但是当我打印出匹配项时matc
  • 为什么值类型没有出现默认构造函数?

    下面的代码片段给了我一个类型的构造函数和方法的列表 static void ReflectOnType Type type Console WriteLine type FullName Console WriteLine List
  • 寻找带有复选框的 WPF ComboBox

    我的谷歌技能让我失败了 任何人都听说过 WPF 这样的控件 我试图让它看起来像这样 winforms 屏幕截图 您可以通过设置组合框的 DataTemplate 自行完成此操作 本文向您展示了如何操作 对于列表框 但原理是相同的 另一篇文章
  • JQuery UI Accordion 无法处理 AJAX 加载的内容

    我正在尝试动态加载产品信息页面 该页面有一个手风琴菜单供用户浏览 单击按钮后 我使用 AJAX 动态引入手风琴的内容 手风琴的 HTML 以其应有的方式显示 但手风琴 方法 未执行以将内容修改为手风琴 Imports
  • 控制到达非 void 函数的末尾

    以下代码片段在编译时会生成一些警告消息 Cluster Myclass getCluster const Point p foreach Cluster c this foreach Point point c if point p ret
  • 使用 EclipseLink JPA 将 XML 类型存储到 PostgreSQL

    我是 JPA 新手 我有一个关于如何使用 JPA 将 XML 类型存储到 PostgreSQL 的问题 我只是扩展现有的 POJO 以将附加的 XML 字段保留到列中 POJO 看起来像这样 我故意省略了一堆其他列以使其更短 在添加这个额外
  • 用图像替换 x 轴刻度标签

    我正在绘制一个散点图 展示所有 NFL 球队的防守 我想在底部轴上显示他们的图像 而不是纯文本中的他们的名字 可以这样做吗 这是我能想到的代码片段 fig px scatter df x defensiveTeam y passResult
  • 使用 Lambda 或 LINQ 将一个类实例转换或映射到另一个类实例的列表?

    我有以下两个课程 class MyData public List
  • 打印出 ASCII 圆和轴

    该程序在笛卡尔平面上打印一个圆 输入是 半径 圆心坐标 cx cy 以及我们要用来打印圆的字符 如果圆上的点与轴重叠 则该点优先 我在方法中编写了打印轴的条件drawCircle 但是图像扭曲了 有些事情让我困惑 有人可以帮助我找出我的错误