중심 원 플로팅
소개
주어진 반경 \$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 입니다. 각 언어에서 가장 짧은 답변이 이깁니다.
답변
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에서 사용해보세요
Desmos , 1 바이트
r
Desmos에서 사용해보기
다른 Desmos 답변과 동일한 입력 방법을 사용합니다. 이름이 사용되지 않는 변수는 r기본적으로 반지름이 r 인 원을 그리는 것입니다.
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);}
온라인으로 시도하십시오!
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>
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 " 에서 거의 첫 번째 결과 로 아이디어를 생각해 냈습니다 .
SageMath , 24 바이트
lambda r:circle((0,0),r)
온라인으로 시도하십시오!
예
자바 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내부 프레임 클래스 내에서 사실상 최종적이어야 하기 때문 입니다.
MATLAB, 38 37 바이트
-Tom Carpenter 덕분에 1 바이트
ezpolar(@(x)r);axis((r+5)*cospi(1:4))
r작업 공간에 변수 로 입력합니다 .
산출:
빨간색 , 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
T-SQL, 47 바이트
SELECT geometry::Point(0,0,0).STBuffer(r)FROM t
입력은 기존의 테이블을 통해 촬영 t 플로트 필드와 R , 우리의 IO 규칙 당 .
SQL Management Studio 결과 창에 표시되는 SQL 지리 공간 함수를 사용합니다 .
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에 직접 씁니다.
Wolfram 언어 (Mathematica) , 16 바이트
Graphics@*Circle
Circle에 대한 Wolfram 문서 참조
예를 들어 여기에 중심이 (0,0)이고 반지름이 r = 42 인 원이 있습니다.
@ LegionMammal978에서 -6 바이트
Desmos, 13 바이트
x^2+y^2=r^2
r
$$ x^2 + y^2 = r^2 \\{} r $$
그것을 Desmos
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 링크
산출:
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):
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를 출력합니다.
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