Vòng tròn văn bản


10

Tìm cách tạo các vòng tròn có bán kính nhất định bằng các ký tự trong bảng điều khiển. Vui lòng chỉ định tên phông chữ và kích thước. Ngoài ra, vui lòng cung cấp ít nhất một ví dụ về đầu ra.

Ví dụ:

Đầu vào:

3

Đầu ra:

   ******
 **      **
**        **
*          *
**        **
 **      **
   ******

... Chà, thứ gì đó đẹp hơn cái "vẽ tay" "vòng tròn" đó với bán kính là 3.


Câu hỏi thưởng: Ellipses. :)


Thật thú vị, vòng tròn bán kính 3 của tôi hoàn toàn giống với vòng tròn của bạn mà không cần cố gắng :)
mellamokb


Có lẽ phần phông chữ có thể được làm rõ. Sao chép ở đây, tất cả các phông chữ sẽ giống nhau; tương tự cho cỡ chữ.
người dùng không xác định

Câu trả lời:


5

Javascript (360)

function c(r){var f=1.83;var e=2*Math.PI/(r*r*r*r*r);var s=r*2+1;var g=Array(s);for(var i=0;i<s;i++){g[i]=Array(Math.round(s*f))};for(var i=0;i<=2*Math.PI;i+=e) {var x=Math.round(f*r*Math.cos(i)+f*r);var y=Math.round(r*Math.sin(i))+r;g[y][x]=1;}for(var j=0;j<g.length;j++){for(var i=0;i<g[j].length;i++)document.write((g[j][i]==1)?'*':' ');document.writeln()}}

http://jsfiddle.net/YssSb/3/ ( flà hệ số hiệu chỉnh cho tỷ lệ chiều cao / chiều rộng phông chữ. Nếu bạn sử dụng cài đặt phông chữ vuông, nghĩa là đặt line-height = font-size, bạn có thể đặt f = 1 và nhận các vòng tròn "vuông". Hoặc đặt ftùy ý cho các hình elip.)

Đầu ra cho 3 (đủ thú vị, vô tình chính xác hình dạng giống như OP), 5, 15:

   ******    
 **      **  
**        ** 
*          * 
**        ** 
 **      **  
   ******    

     *********      
   ***       ****   
 ***            **  
**               ** 
*                 * 
*                 * 
*                 * 
**               ** 
 ***            **  
   ***       ****   
     *********      

                    ***************                      
               ******             ******                 
            ****                       *****             
          ***                              ***           
        ***                                  ***         
      ***                                      ***       
     **                                          **      
    **                                            **     
   **                                              **    
  **                                                **   
 **                                                  **  
 *                                                    *  
**                                                    ** 
*                                                      * 
*                                                      * 
*                                                      * 
*                                                      * 
*                                                      * 
**                                                    ** 
 *                                                    *  
 **                                                  **  
  **                                                **   
   **                                              **    
    **                                            **     
     **                                          **      
      ***                                      ***       
        ***                                  ***         
          ***                              ***           
            ****                       *****             
               ******             ******                 
                    ***************                      

Những vòng tròn đẹp mắt bạn đã có. ;)
Mateen Ulhaq

6

một vòng tròn Bresenham ở Scala (35)

Thuật toán Bresenham có 2 điểm chính:

  • hoạt động mà không có tội lỗi / cosin.
  • bạn chỉ tính vòng tròn ¼ *, các điểm khác được tìm thấy bằng cách phản chiếu.

Làm thế nào để làm nó:

       2 1  
     DCBABCD
   GFE | EFG
  IJ y | ---- JI
 GJ | / JG
 F | / | F
DE | r / | ED
C | / | C
B 4 | / | B 3
A + ------- A
B 4 'x B 3'
CC
DE ED
 FF
 GJ JG
  IJ JI
   GFE EFG
     DCBABCD
       2'1 ' 
  • Chúng tôi chỉ tính các số từ A trong zenit đến I.
    • Điểm I nằm ở 45 °, được xác định bởi x == y.
    • Mặt đất bằng 0 là nơi + là.
    • Điểm A trong zenit là điểm (x = 0, y = r), r = radius.
    • Để vẽ một vòng tròn khép kín, chúng ta di chuyển theo chiều kim đồng hồ (++ x), nằm bên phải (x + = 1) hoặc xuống điểm tiếp theo, (y- = 1).
    • mọi điểm (x, y) trên đường tròn đều r cách tâm. Pythagoras nói, r² = x² + y².
    • Điều này có mùi giống như căn bậc hai và phương trình với 2 giải pháp, nhưng hãy cẩn thận!
    • chúng ta bắt đầu tại A và muốn biết, liệu chúng ta vẽ tiếp theo điểm bên dưới hay điểm bên dưới bên phải.
  • chúng tôi tính toán cho cả hai điểm (x² + y²) và xây dựng cho cả sự khác biệt so với r² (tất nhiên là không đổi).
    • vì sự khác biệt có thể là tiêu cực, chúng tôi lấy abs từ nó.
    • sau đó chúng ta xem điểm nào gần với kết quả hơn (r²), eo ipso nhỏ hơn.
    • tùy thuộc vào đó chúng ta vẽ hàng xóm bên phải hoặc dưới cùng.
  • điểm được tìm thấy
    • 1 x, y được nhân đôi
    • 2 -x, y ở bên trái
    • 3 y, x tại đường chéo
    • 4 -y, x từ đó sang trái
  • tất cả những điểm đó được nhân đôi một lần nữa ở phía nam
    • 1 'x, -y
    • 2 '-x, -y
    • 3 'y, -x
    • 4 '-y, -x xong.

Đây không phải là mã golf, nhưng tất cả những con số đứng đầu các giải pháp hiện có khiến tôi nghĩ nó là vậy, vì vậy tôi đã dành thời gian vô ích để chơi golf giải pháp của mình. Vì vậy, tôi đã thêm một số vô dụng ở đầu quá. Đó là 11 lần Pi tròn.

object BresenhamCircle extends App {
    var count = 0
    val r = args(0).toInt
    // ratio > 1 means expansion in horizontal direction
    val ratio = args(1).toInt
    val field = ((0 to 2 * r).map (i=> (0 to 2 * r * ratio).map (j=> ' ').toArray)).toArray
    def square (x: Int, y: Int): Int = x * x + y * y
    def setPoint (x: Int, y: Int) {
        field (x)(y*ratio) = "Bresenham"(count)
        field (y)(x*ratio) = "Bresenham"(count)
    }
    def points (x: Int, y: Int)
    {
        setPoint (r + x, r + y)
        setPoint (r - x, r + y)
        setPoint (r + x, r - y)
        setPoint (r - x, r - y)
    }
    def bresenwalk () {
        var x = 0;
        var y = r;
        val rxr = r * r
        points (x, y);
        do 
        {
            val (dx, dy) = { if (math.abs (rxr - square ((x+1), y)) < math.abs (rxr - square (x, (y-1))))
                (1, 0)
            else
                (0, -1) 
            }
            count = (count + 1) % "Bresenham".length
            x += dx
            y += dy
            points (x, y)
        }while ((x <= y))
    }
    bresenwalk ()
    println (field.map (_.mkString ("")).mkString ("\n"))
}

Câu hỏi về phông chữ được quyết định bởi máy chủ web của trang web và cài đặt trình duyệt của bạn. Bây giờ, tôi đang tìm kiếm nó

'Droid Sans Mono',Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif

Cỡ chữ là 12px. Thông tin khá vô dụng, nếu bạn hỏi tôi, nhưng ai làm?

Phần thưởng: hình elip và sản lượng mẫu:

Cầu nguyện là

    scala BresenhamCircle SIZE RATIO

ví dụ

    scala BresenhamCircle 10 2
              s e r B r e s              
          h n e           e n h          
      e m a                   a m e      
    e r                           r e    
    m                               m    
  h a                               a h  
  n                                   n  
s e                                   e s
e                                       e
r                                       r
B                                       B
r                                       r
e                                       e
s e                                   e s
  n                                   n  
  h a                               a h  
    m                               m    
    e r                           r e    
      e m a                   a m e      
          h n e           e n h          
              s e r B r e s           

A ratio of 2 will print a circular shape for most fonts which happen to be about twice as tall than wide. To compensate for that, we widen by 2. 
# As smaller value than 2 only 1 is available: 

scala BresenhamCircle 6 1
    erBre    
  aes   sea  
 ah       ha 
 e         e 
es         se
r           r
B           B
r           r
es         se
 e         e 
 ah       ha 
  aes   sea  
    erBre    

# widening it has more freedom:

scala BresenhamCircle 12 5
                                             s    e    r    B    r    e    s                                             
                              a    h    n    e                             e    n    h    a                              
                         B    m                                                           m    B                         
                    e    r                                                                     r    e                    
               e    s                                                                               s    e               
          B    r                                                                                         r    B          
     a    m                                                                                                   m    a     
     h                                                                                                             h     
     n                                                                                                             n     
s    e                                                                                                             e    s
e                                                                                                                       e
r                                                                                                                       r
B                                                                                                                       B
r                                                                                                                       r
e                                                                                                                       e
s    e                                                                                                             e    s
     n                                                                                                             n     
     h                                                                                                             h     
     a    m                                                                                                   m    a     
          B    r                                                                                         r    B          
               e    s                                                                               s    e               
                    e    r                                                                     r    e                    
                         B    m                                                           m    B                         
                              a    h    n    e                             e    n    h    a                              
                                             s    e    r    B    r    e    s     

Tôi đã giới hạn tham số tỷ lệ cho Int để giữ cho nó đơn giản, nhưng nó có thể dễ dàng được mở rộng để cho phép nổi.


số lượng nhân vật của bạn (không có dòng mới không cần thiết) thực tế là 34.557519189487725623089077216075 :) BTW: giải pháp rất hay, +1
Cristian Lupascu

4

Con trăn (172)

172 ký tự bao gồm hai dòng mới bắt buộc. Sử dụng thuật toán Bresenham cho các đường cong hình nón (không chia hoặc nhân); nó chỉ xuất ra các vòng tròn cho phông chữ vuông, nhưng nên được miễn các hiệu ứng cầu thang ( nghĩa là luôn có cùng chiều rộng).

y=input();t=[y*[' ']for x in range(y)];x=0;y-=1;p=3-2*y
while x<=y:t[x][y]=t[y][x]='*';n,y=((x-y+1,y-1),(x,y))[p<0];p+=4*n+6;x+=1
for s in t[::-1]+t:print"".join(s[::-1]+s)

Không đẹp lắm, nhưng tốt, tôi nghĩ tôi sẽ thử.

  ****
 *    *
*      *
*      *
*      *
*      *
 *    *
  ****

          ********
       ***        ***
      *              *
     *                *
    *                  *
   *                    *
  *                      *
 *                        *
 *                        *
 *                        *
*                          *
*                          *
*                          *
*                          *
*                          *
*                          *
*                          *
*                          *
 *                        *
 *                        *
 *                        *
  *                      *
   *                    *
    *                  *
     *                *
      *              *
       ***        ***
          ********

Chỉnh sửa : typo, thay thế Ngoài ra với bộ phận .


3

Perl (92)

Tôi đã đi đến câu hỏi phần thưởng của người Viking và làm cho nó khai thác tỷ lệ khung hình nhân vật để vẽ các hình elip :)

($w)=@ARGV;for$x(-$w..$w){$p.=abs($x*$x+$_*$_-$w*$w)<$w?'*':$"for(-$w..$w);$p.=$/;}print $p;

Kết quả ví dụ:

>perl circle.pl 3
  ***
 *   *
*     *
*     *
*     *
 *   *
  ***

>perl circle.pl 5
   *****
  *     *
 *       *
*         *
*         *
*         *
*         *
*         *
 *       *
  *     *
   *****

>perl circle.pl 8
      *****
    **     **
   *         *
  *           *
 *             *
 *             *
*               *
*               *
*               *
*               *
*               *
 *             *
 *             *
  *           *
   *         *
    **     **
      *****

+1 vị trí thứ 3, nhưng các hình dạng trông không đẹp như trong các câu trả lời khác. (Vẫn còn tốt hơn so với những gì tôi có thể chương trình, tất nhiên :).)
Mateen Ulhaq

3

Haskell ( 112 109)

g n=map(zipWith(?)f.repeat)f where x?y|abs(x^2+y^2-n^2)<n='*'|0<1=' ';f=[-n..n]
main=interact$unlines.g.read

Điều này hoạt động bằng cách kiểm tra, xem x² + y² - r² <n cho tất cả các điểm. Tất cả các điểm mà điều này là đúng là các ngôi sao, tất cả các điểm khác là khoảng trống.

Ví dụ:

$ vang 3 | runhaskell Circ.hs
  ***  
 * * 
* *
* *
* *
 * * 
  ***  
$ vang 10 | runhaskell Circ.hs
       ******       
     ** **     
    * *    
   * *   
  * *  
 * * 
 * * 
* *
* *
* *
* *
* *
* *
* *
 * * 
 * * 
  * *  
   * *   
    * *    
     ** **     
       ******       

Xem ở đây để biết ví dụ lớn: http://www.ideone.com/t042u


3

Con trăn, 180 ký tự

Mã này tạo các vòng tròn nếu phông chữ là hình vuông. Thật dễ dàng để sửa đổi để tạo các hình elip danh nghĩa nếu bạn biết tỷ lệ chiều cao / chiều rộng phông chữ của mình.

import math
r=input()
d=2*r+1
c=[' '*d]*d
for a in xrange(9*d):f=math.pi*a/r/9; x=int(r+r*math.sin(f)+.5);y=int(r+r*math.cos(f)+.5);c[y]=c[y][:x]+'*'+c[y][x+1:]
for s in c:print s

Ví dụ:

4:
  *****  
 **   ** 
**     **
*       *
*       *
*       *
**     **
 **   ** 
  *****  

7:
     *****     
   **     **   
  **       **  
 **         ** 
**           **
*             *
*             *
*             *
*             *
*             *
**           **
 **         ** 
  **       **  
   **     **   
     *****     

Bạn có thể gửi một mẫu?
Mateen Ulhaq

+1 Nhưng vị trí thứ 2 ... Dù vậy, nó đã rất gần.
Mateen Ulhaq

0

C, 127 byte, Tên phông chữ: Arial Super Bold

#include<math.h>
main(){int r=10,c=r*2+1,q=c*c,d;for(;q--;)d=hypot(r-q%c,r-q/c),printf("%c%s",d>r-4&&d<=r?42:32,q%c?"":"\n");}

Kết quả:

      *********      
    *************    
   ***************   
  *****************  
 ******       ****** 
 *****         ***** 
*****           *****
****             ****
****             ****
****             ****
****             ****
****             ****
****             ****
****             ****
*****           *****
 *****         ***** 
 ******       ****** 
  *****************  
   ***************   
    *************    
      *********      
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.