중심 원 플로팅

Sep 22 2020

소개

주어진 반경 \$r\$, 화면 중앙에 원을 그립니다.

모래 상자.

도전

여기에 간단한 도전이 있습니다.

공식 \을 사용하여 원을 그립니다.$x^2+y^2=r^2\$, 또는 주어진 매개 변수에 따라 원을 그리는 다른 공식.

잘 정의되고 일관된 출력을 제공하는 한 언어가 제공하는 모든 단위를 사용할 수 있습니다.

원은 캔버스 중앙에 중심이 있어야하며 모든면에 5 단위 이상의 패딩이 있어야합니다.

원에는 윤곽선과 일치하지 않는 채우기가있을 수 있습니다.

플롯의 배경에 축이있을 수 있습니다.

원의 윤곽은 실선 (틈이 없음)이어야하며 표시되어야합니다. 다음은 그 예입니다.

입력은 허용되는 형식으로 취할 수 있습니다. (함수 매개 변수, 변수, 표준 입력 ...)

출력은 별도의 창 형식이나 이미지 형식 일 수 있습니다.

표준 허점과 규칙이 적용됩니다.

예제 코드 ( Java + Processing)

// Modified from the C language example from
// https:// en.wikipedia.org/wiki/Midpoint_circle_algorithm
int r = 70; //radius
void settings() {
  size(2*r+10, 2*r+10);
}
 
void draw() {
  background(255);
  drawCircle(width/2, height/2, r, 60);
  save("Circle.png");
}

 
void drawCircle(int x0, int y0, int radius, int angle) {
  int circCol = color(0, 0, 0);
  float limit = radians(angle);
  int x = radius;
  int y = 0;
  int err = 0;
 
  while (x >= y && atan2(y, x) < limit) {
    set(x0 + x, y0 + y, circCol);
    set(x0 + y, y0 + x, circCol);
    set(x0 - y, y0 + x, circCol);
    set(x0 - x, y0 + y, circCol);
    set(x0 - x, y0 - y, circCol);
    set(x0 - y, y0 - x, circCol);
    set(x0 + y, y0 - x, circCol);
    set(x0 + x, y0 - y, circCol);
 
    y += 1;
    if (err <= 0) {
      err += 2*y + 1;
    }
    if (err > 0) {
      x -= 1;
      err -= 2*x + 1;
    }
  }
}

득점

이것은 그래픽 출력 질문입니다. ASCII 아트가 없습니다.

이것은 code-golf 입니다. 각 언어에서 가장 짧은 답변이 이깁니다.

답변

7 DominicvanEssen Sep 22 2020 at 15:31

R , 74 70 68 65 54 바이트

편집 : Giuseppe 덕분에 -11 바이트

function(r)plot(r*1i^(1:1e3/99),,"l",l<-c(-r-5,r+5),l)

rdrr.io에서 사용해보세요

저는이 도전에 대한 3 가지 가능한 답을 R 에서 제안합니다 . 길이는 줄지 만주의 사항은 증가합니다.

제가 가장 좋아하는 대답 (위에서를 사용 plot)은 3 개 중 가장 짧은 것입니다. i396 개의 점을 사용하여 의 거듭 제곱의 복소 좌표를 계산하여 원을 그립니다 (약간의 랩 어라운드 포함). 다음은 출력 이미지입니다 plot_circle(5).


'진짜'원의 경우 (데이터 포인트를 연결하는 작은 직선이있는 거의 원이 아니라) curve공식과 함께 함수를 사용할 수 있지만 불행히도 양과 음의 반쪽을 별도로 그려야하므로 결국 더 길게:

R , 86 84 바이트

function(r){curve((r^2-x^2)^.5,xli=l<-c(-r-5,r+5),yli=l)
curve(-(r^2-x^2)^.5,add=T)}

rdrr.io에서 사용해보세요


(내가 생각할 수있는) 가장 짧은 것 (내가 생각할 수있는 것) 이전에는 가장 짧았지만-이제는 Giuseppe 덕분에 더 이상 그렇게하지 않는다- 단지 56 바이트 circles의 symbols함수 옵션 을 사용하는 것이다. 그러나 플롯의 크기가 조정 되더라도 원 기호는 항상 원형이므로 y 축과 더 이상 정렬되지 않을 수 있습니다.

R , 62 58 56 바이트

function(r)symbols(x=1,c=r,i=F,xli=l<-c(-r-4,r+6),yli=l)

rdrr.io에서 사용해보세요

5 EthanChapman Sep 23 2020 at 01:20

Desmos , 1 바이트

r

Desmos에서 사용해보기

다른 Desmos 답변과 동일한 입력 방법을 사용합니다. 이름이 사용되지 않는 변수는 r기본적으로 반지름이 r 인 원을 그리는 것입니다.

5 ErikF Sep 23 2020 at 08:36

C (GCC) , 169 (166) 161 160 바이트

제안에 대한 ceilingcat (x3)에게 감사드립니다! 또한 헤더의 줄 바꿈을 구분 기호로 제대로 작동하는 것처럼 보이기 때문에 (적어도 Irfanview에서) 배열이 스택에 놓일 때 드러난 버그를 수정했습니다.

비트 맵을 만드는 가장 간단한 방법 인 PBM 형식으로 이미지를 생성합니다! 어떤 이유로 내가 시도한 모든 온라인 PBM 뷰어는 출력 파일을 좋아하지 않는 것 같지만 Irfanview와 GIMP는 괜찮습니다.

z;f(r,w){char s[(w=r*2+11)*w+1];float x=s[w*w]=!memset(s,48,w*w);for(;x<7;)s[z=round(sin(x+=1e-5)*r+r+5)+round(cos(x)*r+r+5)*w]=49;printf("P1 %d %d %s",w,w,s);}

온라인으로 시도하십시오!

4 Neil Sep 22 2020 at 16:37

JavaScript (ES6), 96 바이트

f=
v=>`<svg width=${s=v*2+12} height=${s}><circle r=${v} cx=${v+=6} cy=${v} stroke=#000 fill=none>`
<input type=number min=1 oninput=o.innerHTML=f(+this.value)><div id=o>

스 니펫이 표시하는 SVG (HTML5) 이미지를 출력합니다. HTML5가 허용되는 경우 95 바이트 :

f=
v=>`<div style="width:${v*=2}px;height:${v}px;margin:6px;border:1px solid;border-radius:100%">`
<input type=number min=1 oninput=o.innerHTML=f(+this.value)><div id=o>

4 Arty Sep 22 2020 at 22:29

Python 2 및 3, 57 바이트

@DigitalTrauma 덕분에 -17 바이트-@Sisyphus 덕분에
1 바이트

from turtle import*
def f(r):pu();sety(-r);pd();circle(r)

온라인으로 시도하십시오!

turtle 은 Python 2 및 3에 포함 된 표준 라이브러리 turtle입니다. 인터넷 검색 " graphics python " 에서 거의 첫 번째 결과 로 아이디어를 생각해 냈습니다 .

3 Noodle9 Sep 22 2020 at 15:00

SageMath , 24 바이트

lambda r:circle((0,0),r)

온라인으로 시도하십시오!

예

3 KevinCruijssen Sep 22 2020 at 15:41

자바 8, 141123 바이트

import java.awt.*;r->new Frame(){{setSize(2*r+26,2*r+56);show();}public void paint(Graphics g){g.drawOval(13,43,2*r,2*r);}}

\에 대한 출력$n=100\$ (연한 회색 배경색이 추가 된 두 번째 그림은 상단 패딩을 확인하는 것입니다) :

설명:

import java.awt.*;     // Required import for Frame and Graphics
r->                    // Method with integer parameter and Frame return-type
 new Frame(){          //  Create the Frame
   {                   //   In an inner code-block:
     setSize(2*r       //    Set the width to 2 times the radius-input
             +26       //     + 2 times 8 pixels for the frame borders
                       //     + 2 times 5 pixels for the required padding
             2*r       //    Set the height to 2 times the radius-input
             +56);     //     + 2 times 8 pixels for the frame borders
                       //     + 30 pixels for the frame title-bar
                       //     + 2 times 5 pixels for the required padding
     show();}          //    And show the Frame at the end
   public void paint(Graphics g){
                       //   Overwrite its paint method to draw on
     g.drawOval(13,43, //    With 5,5 for the required padding as top-left
                       //    x,y-coordinate of the surrounding rectangle + the same 8+30
                       //    pixels adjustment for the frame and frame title-bar,
         2*r,2*r);}}   //    draw the circle with a size of 2 times the radius-input

참고 : (3) 바이트를 저장 하는 (r*=2),r,r,r대신 사용할 수 없습니다 2*r,2*r,2*r,2*r. 왜냐하면 r내부 프레임 클래스 내에서 사실상 최종적이어야 하기 때문 입니다.

3 elementiro Sep 24 2020 at 07:01

MATLAB, 38 37 바이트

-Tom Carpenter 덕분에 1 바이트

ezpolar(@(x)r);axis((r+5)*cospi(1:4))

r작업 공간에 변수 로 입력합니다 .
산출:

2 GalenIvanov Sep 22 2020 at 15:31

빨간색 , 90 바이트

func[r][d: r + 5 view compose/deep[base(as-pair d * 2 d * 2)draw[circle(as-pair d d)(r)]]]

온라인으로 시도하십시오!

f 200

2 BradC Sep 22 2020 at 23:52

T-SQL, 47 바이트

SELECT geometry::Point(0,0,0).STBuffer(r)FROM t

입력은 기존의 테이블을 통해 촬영 t 플로트 필드와 R , 우리의 IO 규칙 당 .

SQL Management Studio 결과 창에 표시되는 SQL 지리 공간 함수를 사용합니다 .

2 AZTECCO Sep 23 2020 at 13:26

JavaScript (V8) , 158 바이트

r=>document.write(`<p style="border-radius:50%;border:solid;position:fixed;width:${r*2}px;height:${r*2}px;top:50%;left:50%;transform:translate(-50%,-50%);">`)

온라인으로 시도하십시오!

@Razetime 덕분에 jsfiddle

  • @Razetime 덕분에 1 개 저장
  • 템플릿 리터럴을 사용하여 2 개 저장

p테두리 반경이 50 % 인 가운데에 배치 된 고정 된 요소를 HTML에 직접 씁니다.

2 J42161217 Sep 22 2020 at 14:32

Wolfram 언어 (Mathematica) , 16 바이트

Graphics@*Circle

Circle에 대한 Wolfram 문서 참조

예를 들어 여기에 중심이 (0,0)이고 반지름이 r = 42 인 원이 있습니다.

@ LegionMammal978에서 -6 바이트

1 Lyxal Sep 22 2020 at 13:13

Desmos, 13 바이트

x^2+y^2=r^2
r

$$ x^2 + y^2 = r^2 \\{} r $$

그것을 Desmos

1 schnaader Sep 23 2020 at 17:33

Shadertoy (GLSL), 142 바이트

void mainImage(out vec4 f,in vec2 v){vec2 S=iResolution.xy;vec2 u=v/S-vec2(0.5);u.y/=S.x/S.y;vec4 c;if(abs(length(u)-0.2)<8e-4)c=vec4(1);f=c;}

Shadertoy 링크

산출:

1 Kaddath Oct 01 2020 at 17:14

PHP , 131 바이트

($f=imagecolorallocate)($i=imagecreate($d=10+$argn*2,$d),0,0,0);imageellipse($i,$d/2,$d/2,$d-10,$d-10,$f($i,9,9,9));imagepng($i,a);

온라인으로 시도하십시오!

실제로는 이미지 기능을 비활성화하기 때문에 온라인 PHP 테스터에서 실행할 수 없습니다. 이미지를 "a"라는 파일에 저장합니다. 1 바이트를 사용하여 저장할 수 imagegd있지만 "gd"형식을 몰랐고 작동하는지 확인하기 위해 열 수 없습니다.

원은 매우 진한 회색이지만 보이는 것으로 간주합니다. 그렇지 않은 경우 댓글을 남기고 수정하겠습니다. 1 바이트 이상 추가 $f($i,99,0,0)하면 훨씬 더 명확 해집니다.

와 함께 $f($i,9,9,9):

와 함께 $f($i,99,0,0):

1 corvus_192 Oct 28 2020 at 18:00

LaTeX, 66 바이트

\input tikz\def\f#1{~\vfill\centering\tikz\draw circle(#1);\vfill}

이 도전에 필요한 "캔버스"가 라텍스 페이지의 기본 텍스트 영역이라고 생각합니다. 이 코드는 \fcm 단위의 반경을 인수로 사용하는 매크로 를 정의합니다 .

예제 코드

\documentclass{article}

\input tikz\def\f#1{~\vfill\centering\tikz\draw circle(#1);\vfill}

\begin{document}
\f{3}
\enddocument

PDF를 출력합니다.

KjetilS. Sep 25 2020 at 04:42

Perl 5 , 92 바이트

$r=$_;
$w=$r*2+11;
$_="P1 $w $w @{[map{($_%$w-$r-5)**2+($_/$w-$r-5)**2<$r**2?1:0}0..$w**2-1]}"

온라인으로 시도하십시오!

검정색으로 채워진 원. 위의 92 바이트를 program.pl에 넣고 다음과 같이 실행합니다.

echo 50 | perl -p program.pl > circle.pbm  # radius 50
feh circle.pbm                             # view with feh or other image viewer