Нарисуйте правильный многоугольник

21

Цель этого кода golf - нарисовать правильный многоугольник (один с равными длинами сторон), учитывая количество сторон и радиус (расстояние от центра до вершины).

  • Количество сторон и радиус можно ввести с помощью файла, STDIN или просто старой переменной. Используйте все, что короче на вашем языке.
  • -25% от общего количества символов / байтов, если изображение фактически нарисовано вместо ASCII-рисунка.
Taconut
источник
3
Каков радиус многоугольника? Радиус его окружности? Его внешний круг?
Питер Тейлор
Там. Я починил это. Извините за это: P.
Такон
2
@PeterTaylor Радиус правильного многоугольника - это расстояние до любой вершины (радиус, окружность или окружность ). Радиус вписанного (или расстояние до сторон) называется апофемой . Это не должно быть «неясно, что вы спрашиваете», так как оно имеет легко найденное определение (результат # 1 для «радиуса многоугольника» в Google).
Geobits
@ Geobits Я согласен, но я все равно отредактировал его.
Такон
@PeterTaylor Я отмечу это как оба тогда: я
Taconut

Ответы:

20

ЛОГОТИП 37 - 25% = 27,75 (с переменными)

REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

ЛОГОТИП 49 - 25% = 36,75 (как функция)

TO P:R:S REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]END

Треугольник

Вызывается с переменными

Make "R 100
Make "S 3
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Используется как функция P 100 3

введите описание изображения здесь

Площадь

Вызывается с переменными

Make "R 100
Make "S 4
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Используется как функция P 100 4

введите описание изображения здесь

пятиугольник

Вызывается с переменными

Make "R 100
Make "S 5
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Используется как функция P 100 5

введите описание изображения здесь

декагон

Вызывается с переменными

Make "R 100
Make "S 10
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Используется как функция P 100 10

введите описание изображения здесь

Круг

Вызывается с переменными

Make "R 100
Make "S 360
REPEAT:S[FD:R*2*sin(180/:S)RT 360/:S]

Используется как функция P 100 360

введите описание изображения здесь

Abhijit
источник
2
Можете ли вы опубликовать снимок экрана?
Гейб
На мой взгляд, полигоны имеют одну и ту же сторону, а не радиус.
Росс Милликен
@RossMillikan: изображения были не в масштабе. Я только что обновил изображения
Abhijit
17

Mathematica, 40 - 25% = 30

ListPolarPlot[r&~Array~n]/.PointPolygon

введите описание изображения здесь

рассекать
источник
Отлично. Это побило то, что я пытался с Graphics.
DavidC
2
Нечестно! Слишком легко!
Робби Wxyz
Хорошо сделано, это никогда бы не пришло мне в голову.
Майкл Стерн
Разве Graphics@RegularPolygonне разрешено?
Грег Мартин
@GregMartin Это разрешено, но с ним гораздо сложнее указать радиус.
Только для ASCII
12

Java 8: 533 322 - 25% = 241,5

Ну, это Java: / Просто рисует линии, указывает на точку. Должен работать для любого многоугольника произвольного размера. Сократите это немного от оригинального размера. Огромная благодарность Вулкану (в комментариях) за урок гольфа.

import java.awt.*;class D{public static void main(String[]v){new Frame(){public void paint(Graphics g){int i=0,r=Short.valueOf(v[0]),s=Short.valueOf(v[1]),o=r+30,x[]=new int[s],y[]=x.clone();for(setSize(o*2,o*2);i<s;x[i]=(int)(Math.cos(6.28*i/s)*r+o),y[i]=(int)(Math.sin(6.28*i++/s)*r+o));g.drawPolygon(x,y,s);}}.show();}}

Разрывы строк:

import java.awt.*;
class D{
    public static void main(String[]v){
        new Frame(){
            public void paint(Graphics g){
                int i=0,r=Short.valueOf(v[0]),s=Short.valueOf(v[1]),o=r+30,x[]=new int[s],y[]=x.clone();
                for(setSize(o*2,o*2);i<s;x[i]=(int)(Math.cos(6.28*i/s)*r+o),y[i]=(int)(Math.sin(6.28*i++/s)*r+o));
                g.drawPolygon(x,y,s);
            }
        }.show();
    }
}

Ввод аргументов [радиус] [стороны]:

java D 300 7

Выход:

многоугольник!

Geobits
источник
2
Удалите 12 байтов, импортировав java.awt.image.*вместо нихjava.awt.image.BufferedImage
FThompson
1
Я уменьшил его до 500 байт, используя несколько трюков. 1) Используйте Short.valueOfвместо того, Integer.valueOfчтобы сохранить четыре байта, так как ввод никогда не должен превышать диапазон коротких замыканий. 2) y[]=x.clone()сохраняет один байт y[]=new int[s]. 3) Используйте устаревший f.show();вместо того, f.setVisible(1>0);чтобы сохранить дополнительно девять байтов. 4) Используйте 6.28вместо Math.PI*2, так как оценка достаточно точна для этой цели, сохраняя три байта. 5) Объявлять Graphics gвместо того, чтобы Graphics2D gпри создании графического экземпляра сохранить два байта.
FThompson
1
@Vulcan Я получил его еще на 120 (в основном, уничтожая BufferedImageи все Graphicsвместе и просто бросая все paint()). Это действительно изменило цвет изображения, хотя все еще выглядит хорошо IMO. Спасибо, что заставили меня еще раз взглянуть на это :)
Geobits
1
@Geobits Большие улучшения. Работая с вашей сокращенной версией, я сократил ее до 349 байт , исключив Frameлокальную переменную, удалив dцелое число и использовав / использовав цикл for для сохранения нескольких символов, в основном точек с запятой. Вот версия с пробелами .
FThompson
1
Уменьшено до 325 байт при использовании drawPolygonвместо drawLine. Пробельная версия .
FThompson
11

TeX / TikZ (60 - 80,25)

Файл polygon.tex:

\input tikz \tikz\draw(0:\r)\foreach\!in{1,...,\n}{--(\!*360/\n:\r)}--cycle;\bye

(80 байт)

Радиус и количество сторон указываются в виде переменных / макросов \rи \n. Любая единица TeX может быть дана для радиуса. Без единицы используется единица по умолчанию cm. Примеры:

\def\r{1}\def\n{5}    % pentagon with radius 1cm
\def\r{10mm}\def\n{8} % octagon with radius 10mm

(16 байтов без значений)

Если номер страницы должен быть подавлен, то это может быть сделано

\footline{}

(11 байт)

Примеры для создания файлов PDF:

pdftex "\def\r{1}\def\n{3}\input polygon"

Треугольник

pdftex "\def\r{1}\def\n{5}\input polygon"

многоугольник

pdftex "\def\r{1}\def\n{8}\input polygon"

восьмиугольник

pdftex "\def\r{1}\def\n{12}\input polygon"

двенадцатиугольник

Гол:

Не понятно, для чего нужен счет. Диапазон для оценки будет:

  • Базовый код составляет 80 байтов минус 25% = 60

  • Или все включено (определения входных переменных, без номера страницы): (80 + 16 + 11) минус 25% = 80,25

  • Если соединение между первой и последней точкой не должно быть гладким, то --cycleможно удалить, сохранив 7 байтов.

Хайко Обердиек
источник
8

GeoGebra , 42 - 25% = 31,5 байта

Если вы посчитаете в символах вместо байтов, это будет 41 - 25% = 30,75 символов.

(То есть, если вы считаете геогебру языком ...)

Предполагается, что радиус хранится в переменной, rа количество сторон хранится в переменной s.

Polygon[(0,0),(sqrt(2-2cos(2π/s))r,0),s]

Здесь используется теорема косинуса c 2 = a 2 + b 2 - 2 ab cos C для расчета длины стороны по заданному радиусу.

Пример вывода для s= 7, r= 5

введите описание изображения здесь

user12205
источник
6

C: 229 180

#include<stdio.h>
#include<math.h>
main(){float n=5,r=10,s=tan(1.57*(1.-(n-2.)/n))*r*2.,i=0,j,x,c,t;int u,v;for(;i<n;i++)for(j=0;j<s;j++)x=i*6.28/n,c=cos(x),t=sin(x),x=j-s/2.,u=c*r+t*x+r*2.,v=-t*r+c*x+r*2,printf("\e[%d;%dH*",v,u);}

(r - радиус окружности)

Пожалуйста, запустите в терминале ANSI

Редактировать:

  • принять предложение туза
  • использовать старые переменные (или #define) в качестве входных данных
  • используйте радиус окружности сейчас
u;main(v){float p=3.14,r=R*cos(p/n),s=tan(p/n)*r*2,i=0,j,x,c,t;for(;i++<n;)for(j=0;j<s;)x=i*p/n*2,c=cos(x),t=sin(x),x=j++-s/2,u=c*r+t*x+r*2,v=c*x-t*r+r*2,printf("\e[%d;%dH*",v,u);}

компиляции:

gcc -opoly poly.c -Dn=sides -DR=radius -lm
cybcaoyibo
источник
Когда вы используете gcc, вы можете опустить #includes. Кроме того, вы можете объявить vкак глобальный снаружи main, и объявить uкак параметр main, то вам не нужно int(то есть v;main(u){//...). Наконец, вы можете изменить последний forцикл наfor(j=0;j<s;)/*...*/x=j++-s/2.,//...
user12205
5

C 359 символов

Моя первая попытка игры в гольф. По крайней мере, это лучше, чем решение Java ;-)

int r,n,l,g,i,j,x,y;char* b;float a,c,u,z,p,q,s,t;main(int j,char**v){r=atoi(v[1]);b=malloc(g=(l=r*2+1)*r*2+1);memset(b,32,g);for(j=g-2;j>0;j-=l){b[j]='\n';}b[g-1]=0;a=2*3.14/(n=atoi(v[2]));for(;i<=n;i++,p=s,q=t){c=i*a;s=sin(c)*r+r;t=cos(c)*r+r;if(i>0){u=(s-p)/r,z=(t-q)/r;for(j=0;j<r;j++){x=p+u*j;y=q+z*j;if(x>=0&&y>=0&&y<r*2&&x<l-1)b[y*l+x]='#';}}}puts(b);}

ungolfed:

int r,n,l,g,i,j,x,y;
char* b;
float a,c,u,z,p,q,s,t;
main(int j,char**v){
    r=atoi(v[1]);
    b=malloc(g=(l=r*2+1)*r*2+1);
    memset(b,32,g);
    for(j=g-2;j>0;j-=l){b[j]='\n';} 
    b[g-1]=0;
    a=2*3.14/(n=atoi(v[2]));
    for(;i<=n;i++,p=s,q=t){
        c=i*a;s=sin(c)*r+r;t=cos(c)*r+r;
        if(i>0){
            u=(s-p)/r,z=(t-q)/r;
            for(j=0;j<r;j++){
                x=p+u*j;y=q+z*j;
                if(x>=0&&y>=0&&y<r*2&&x<l-1)b[y*l+x]='#';
            }
        }
    }
    puts(b);
}

И это единственная программа, которая выводит многоугольник в ASCII вместо его рисования. Из-за этого и некоторых проблем с округлением с плавающей точкой выходные данные выглядят не особенно красиво (символы ASCII не так высоки, как широкие).

                 ######
               ###    ###
            ####        ####
          ###              ###
        ###                  ####
     ###                        ###
     #                            #
     #                            ##
    #                              #
    #                              #
   ##                              ##
   #                                #
  ##                                ##
  #                                  #
  #                                  #
 ##                                  ##
 #                                    #
##                                    ##
#                                      #
#                                      #
#                                      #
#                                      #
##                                    ##
 #                                    #
 ##                                  ##
  #                                  #
  #                                  #
  ##                                ##
   #                                #
   ##                              ##
    #                              #
    #                              #
     #                            ##
     #                            #
     ###                        ###
        ###                  ####
          ###              ###
            ###         ####
               ###    ###
                 ######
MarcDefiant
источник
Первый intможет быть удален, поскольку предполагается, что он intсоставлен компилятором. Кроме того, последний forцикл может быть изменен наfor(j=0;j<r;){x=p+u*j;y=q+z*j++;//...
user12205
if(i<0)Может быть изменен if(i). Который все еще нужен только в одной итерации, но не смог найти эффективный способ его
устранения
4

Mathematica, 54 * 75% = 40,5

Graphics@Polygon@Table[r{Cos@t,Sin@t},{t,0,2Pi,2Pi/n}]

Я даже не думаю, что есть смысл для негольфированной версии. Это будет содержать только больше пробелов.

Ожидается радиус в переменной rи количество сторон в переменной n. Радиус немного бессмысленный без отображения осей, потому что Mathematica масштабирует все изображения, чтобы соответствовать.

Пример использования:

введите описание изображения здесь

Мартин Эндер
источник
Graphics@Polygon@Array[r{Sin@#,Cos@#}&,n+1,{0,2π}]
Chyanog
@ Чьяонг ах, я склонен забывать о Array .
Мартин Эндер
4

HTML / JavaScript: 215 - 25% = 161,25 , 212 - 25% = 159

<canvas><script>R=100;i=S=10;c=document.currentScript.parentNode;c.width=c.height=R*2;M=Math;with(c.getContext("2d")){moveTo(R*2,R);for(;i-->0;){a=M.PI*2*(i/S);lineTo(R+M.cos(a)*R,R+M.sin(a)*R)}stroke()}</script>

Безголовая версия:

<canvas><script>
    var RADIUS = 100;
    var SIDES_COUNT = 10;
    var canvas = document.currentScript.parentNode;
    canvas.width = canvas.height = RADIUS * 2;
    var context = canvas.getContext("2d");
    context.moveTo(RADIUS * 2, RADIUS);
    for(i = 1 ; i <= SIDES_COUNT ; i++) {
        var angle = Math.PI * 2 * (i / SIDES_COUNT);
        context.lineTo(
            RADIUS + Math.cos(angle) * RADIUS,
            RADIUS + Math.sin(angle) * RADIUS
        );
    }
    context.stroke();
</script>
sebcap26
источник
Сохранить 4 символа i=S=5;и for(;i-->0;).
Мэтт
@Matt Спасибо! Я не знал этот синтаксис и не могу найти никакой информации о нем. Как это называется?
sebcap26
@ sebcap26 Вы имеете в виду i-->0роль? Это так же, как i-- > 0. Некоторые люди также называют это оператором стрелки или оператором
перехода
Не беспокойтесь :) Как сказал @ sebcap26, он просто уменьшается каждый раз, когда цикл for вычисляет условие.
Мэтт
Я думаю, что вы можете сохранить удаление символов c=document.currentScript.parentNode;и замену <canvas>на<canvas id="c">
Хеди
3

Постскриптум 156 - 25% = 117

translate exch 1 exch dup dup scale div currentlinewidth mul setlinewidth
1 0 moveto dup{360 1 index div rotate 1 0 lineto}repeat closepath stroke showpage

Передайте радиус, число сторон и центральную точку в командной строке

gs -c "100 9 300 200" -- polyg.ps

или приписать к источнику

echo 100 9 300 200 | cat - polyg.ps | gs -

Перевести в центр, масштабировать до радиуса, перейти к (1,0); затем повторите n раз: поверните на 360 / n, проведите линию до (1,0); нарисовать последнюю линию, обвести и испустить страницу.

Люзер Дрог
источник
3

Шалфей , 44 - 25% = 33

Предполагается, что количество сторон хранится в sпеременной, а радиус - в rпеременной.

polytopes.regular_polygon(s).show(figsize=r)

Пример вывода:

s= 5, r= 3

введите описание изображения здесь

s= 5, r= 6

введите описание изображения здесь

s= 12, r= 5

введите описание изображения здесь

user12205
источник
Масштабирование осей вводит в заблуждение. Это поправимо? (например, первая точка в (0,3), когда радиус = 3, вместо (0,1))
Цифровая травма
1
@DigitalTrauma Моя программа в основном генерирует «стандартный» правильный многоугольник, а затем увеличивает изображение с помощью масштабного коэффициента. Насколько я знаю, regular_polygonфункция всегда генерирует полигоны с первой вершиной в точке (0,1). Исправление будет состоять в том, чтобы не отображать оси с дополнительными 7 байтами ( ,axes=0после figsize=r)
user12205
3

bc + ImageMagick + xview + bash, 104,25 (139 байт - 25%)

Эта задача была бы неполной без ответа ImageMagick ...

convert -size $[$2*2]x$[$2*2] xc: -draw "polygon `bc -l<<Q
for(;i++<$1;){t=6.28*i/$1;print s(t)*$2+$2,",";c(t)*$2+$2}
Q`" png:-|xview stdin

Например, ./polygon.sh 8 100выдает это изображение:

введите описание изображения здесь

Цифровая травма
источник
2

JavaScript 584 (867 без золота)

Этот код использует N сложных корней единицы и переводит углы в точки X, Y. Затем происхождение перемещается в центр холста.

Golfed

function createPolygon(c,r,n){
c.width=3*r;
c.height=3*r;
var t=c.getContext("2d");
var m=c.width/2;
t.beginPath(); 
t.lineWidth="5";
t.strokeStyle="green";
var q=C(r, n);
var p=pts[0];
var a=p.X+m;
var b=p.Y+m;
t.moveTo(a,b);
for(var i=1;i<q.length;i++)
{
p=q[i];
t.lineTo(p.X+m,p.Y+m);
t.stroke();
}
t.lineTo(a,b);
t.stroke();
}
function P(x,y){
this.X=x;
this.Y=y;
}
function C(r,n){
var p=Math.PI;
var x,y,i;
var z=[];
var k=n;
var a;
for(i=0;i<k;i++)
{
a = 2*i*p/n;
x = r*Math.cos(a);
y = r*Math.sin(a);
z.push(new P(x,y));
}
return z;
}

Пример вывода:

Вывод в Chrome

Ungolfed

function createPolygon(c,r,n) {
c.width = 3*r;
c.height = 3*r;
var ctx=c.getContext("2d");
var mid = c.width/2;
ctx.beginPath(); 
ctx.lineWidth="5";
ctx.strokeStyle="green";
var pts = ComplexRootsN(r, n);
if(null===pts || pts.length===0)
{
alert("no roots!");
return;
}
var p=pts[0];
var x0 = p.X + mid;
var y0 = p.Y + mid;
ctx.moveTo(x0,y0);
for(var i=1;i<pts.length;i++)
{
p=pts[i];
console.log(p.X +"," + p.Y);
ctx.lineTo(p.X + mid, p.Y + mid);
ctx.stroke();
}
ctx.lineTo(x0,y0);
ctx.stroke();
}

function Point(x,y){
this.X=x;
this.Y=y;
}

function ComplexRootsN(r, n){
var pi = Math.PI;
var x,y,i;
var arr = [];
var k=n;
var theta;
for(i=0;i<k;i++)
{
theta = 2*i*pi/n;
console.log('theta: ' + theta);
x = r*Math.cos(theta);
y = r*Math.sin(theta);
console.log(x+","+y);
arr.push(new Point(x,y));
}
return arr;
}

Для этого кода требуется элемент холста HTML5, c - объект холста, r - радиус, а n - количество сторон.

bacchusbeale
источник
2

PHP 140 - 25% = 105

<?
for(;$i++<$p;$a[]=$r-cos($x)*$r)$a[]=$r-sin($x+=2*M_PI/$p)*$r;
imagepolygon($m=imagecreatetruecolor($r*=2,$r),$a,$p,0xFFFFFF);
imagepng($m);

Предполагается две предопределенные переменные: $pколичество точек и $rрадиус в пикселях. В качестве альтернативы, можно добавить list(,$r,$p)=$argv;и использовать аргументы командной строки вместо этого. Вывод будет png, который должен быть передан в файл.


Выход

$r=100; $p=5;

$r=100; $p=6;

$r=100; $p=7;

$r=100; $p=50;

Примо
источник
1

TI-80 BASIC, 25 байтов - 25% = 18,75

PARAM
2π/ANS->TSTEP
"COS T->X1ᴛ
"SIN T->Y1ᴛ
DISPGRAPH

Предполагается, что все настройки установлены на значения по умолчанию. Запустите программу как 5:PRGM_POLYGON(для пятиугольника)

Это работает, рисуя круг с очень небольшим количеством шагов. Например, пятиугольник будет иметь шаги 2/5 радиан.

Параметры окна достаточно хороши по умолчанию, и TMINи TMAXустанавливаются 0и , поэтому все , что нам нужно изменить это TSTEP.

12Me21
источник
1

SmileBASIC 3, 183 159 - 25% = 119,25 байт

Берет стороны и радиус от INPUT, вычисляет и сохраняет точки, а затем рисует их с помощью GLINE. Я чувствую, что это может быть короче, но это как 1 час ночи, что угодно. Предполагается чистое и стандартное отображение env, поэтому вам может понадобиться ACLSпри запуске его из DIRECT.

INPUT S,R
DIM P[S,2]FOR I=0TO S-1
A=RAD(I/S*360)P[I,0]=COS(A)*R+200P[I,1]=SIN(A)*R+120NEXT
FOR I=0TO S-1GLINE P[I,0],P[I,1],P[(I+1)MOD S,0],P[(I+1)MOD S,1]NEXT

Скриншот

snail_
источник
1
Байт - это байт, вы не можете сказать, что это только половина.
12Me21
Вычитая правило 25%.
Мэтью Ро
1

OpenSCAD: 31 минус 25% = 23,25

module p(n,r){circle(r,$fn=n);}

Первый пост здесь! Я знаю, что опаздываю на вечеринку, но этот вопрос показался мне таким же хорошим, как и любой другой. Звоните используя p(n,r).

Юлианский волк
источник
Добро пожаловать на сайт!
Пшеничный волшебник
0

ActionScript 1, Flash Player 6: 92 - 25% = 69

n=6
r=100
M=Math
P=M.PI*2
lineStyle(1)
moveTo(r,0)
while((t+=P/n)<=P)lineTo(M.cos(t)*r,M.sin(t)*r)
canadianer
источник
0

C # в LINQPAD

Благодарность за математическую часть достается Geobits (надеюсь, вы не против!) С ответом Java. Я безнадежен в математике :)

Я сделал это в LINQPAD, поскольку у него есть встроенное окно вывода. По сути, вы можете перетащить в него следующее, и он нарисует многоугольник. Просто переключите его на «C # Program» и импортируйте библиотеку System.Drawing в свойства запроса.

//using System.Drawing;

void Main()
{
// Usage: (sides, radius)
    DrawSomething(4, 50);
}

void DrawSomething(int sides, int radius)
{
    var points = new Point[sides];
    var bmpSize = radius*sides;
    var bmp = new Bitmap(bmpSize,bmpSize);
    using (Graphics g = Graphics.FromImage(bmp))
    {   
        var o = radius+30;
        for(var i=0; i < points.Length; i++)
        {
            // math thanks to Geobits
            double w = Math.PI*2*i/sides;
            points[i].X = (int)(Math.Cos(w)*radius+o);
            points[i].Y = (int)(Math.Sin(w)*radius+o);
        }
        g.DrawPolygon(new Pen(Color.Red), points);
    }
    Console.Write(bmp);
}

введите описание изображения здесь

jzm
источник
0

Matlab 58 байт - 25% = 43,5

Не видел решения Matlab, так что вот одно довольно простое:

f=@(n,r) plot(r*cos(0:2*pi/n:2*pi),r*sin(0:2*pi/n:2*pi));

Вы можете сбрить некоторые байты, если r и n уже находятся в рабочей области.

Пример вызова:

f(7,8)

7-гон с радиусом 8

ptev
источник
0

Python 2, 222 байта

from math import*
def f(s,r):
 r*=cos(pi/s)
 v,R=2*pi/s,[(2*t)/98.-1for t in range(99)]
 print"P1 99 99 "+" ".join(["0","1"][all(w*(w-x)+z*(z-y)>0for w,z in[(r*cos(a*v),r*sin(a*v))for a in range(s)])]for x in R for y in R)

Проверяет, находится ли пиксель на внутренней стороне всех гиперплоскостей (линий) многоугольника. Радиус затронут, потому что на самом деле используется апотема.

введите описание изображения здесь введите описание изображения здесь

Карл Напф
источник
0

Mathematica 27 (= 36 - 25%)

Graphics[Polygon[CirclePoints[r, n]]]

Когда мы отправляем код Mathematica, мы часто забываем о новых функциях, которые продолжают встраиваться в язык, а текущий словарь языка насчитывает около 5000 основных функций . Большой и расширяющийся словарный запас языка, кстати, весьма удобен для игры в гольф. CirclePoints были введены в текущей версии 11.X. Конкретный пример 7-стороннего радиуса 5:

введите описание изображения здесь

Также вам просто нужно ввести параметр угла, чтобы контролировать ориентацию полигона:

Graphics[Polygon[CirclePoints[{1, 2}, 5]]]

введите описание изображения здесь

Виталий Кауров
источник
0

Python 2, 74 байта - 25% = 55,5

Ввод в переменных r,n. Если бы он был включен в подсчет, он был бы r,n=input()на 12 байт больше.

import math,turtle as t
exec"t.fd(2*r*math.sin(180/n));t.rt(360/n);"*n

Попробуйте онлайн - (использует другой код, поскольку execон не реализован в онлайн-переводчике)

mbomb007
источник
0

SmileBASIC, 85 75 - 25% = 56,25 байт

FOR I=0TO S
A=I/S*6.28N=X
M=Y
X=R+R*COS(A)Y=R+R*SIN(A)GLINE N,M,X,Y,-I
NEXT

Переменные S и R используются для ввода.

Разъяснение:

FOR I=0 TO Sides        'Draw n+1 sides (since 0 is skip)
 Angle=I/Sides*6.28     'Get angle in radians
 OldX=X:OldY=Y          'Store previous x/y values
 X=Radius+Radius*COS(A) 'Calculate x and y
 Y=Radius+Radius*SIN(A)
 GLINE OldX,OldY,X,Y,-I 'Draw line. Skip if I is 0 (since old x and y aren't set then)
NEXT

Стороны нарисованы с использованием цвета -I, который обычно близок к -1 (& HFFFFFFFF белый) (за исключением случаев, когда I0, когда он прозрачный).

Вы также можете нарисовать заполненный многоугольник, используя GTRI N,M,X,Y,R,R,-IвместоGLINE...

12Me21
источник
0

Тикз, 199 байт

\documentclass[tikz]{standalone}\usetikzlibrary{shapes.geometric}\begin{document}\tikz{\def\p{regular polygo}\typein[\n]{}\typein[\r]{}\node[draw,minimum size=\r,\p n,\p n sides=\n]{}}\end{document}

Это решение использует библиотеку tikz shapes.geometric.

Вот как выглядит многоугольник со 5сторонами и радиусом 8inпри просмотре в evince .

Обязательная картина

Мастер пшеницы
источник