Narysuj regularny wielokąt

21

Celem tego kodu golfa jest narysowanie regularnego wielokąta (o tej samej długości boków), biorąc pod uwagę liczbę boków i promień (odległość od środka do wierzchołka).

  • Liczbę boków i promień można wprowadzić za pomocą pliku, STDIN lub zwykłej starej zmiennej. Używaj tego, co jest krótsze w twoim języku.
  • -25% wszystkich znaków / bajtów, jeśli obraz jest rysowany zamiast grafiki ASCII.
Taconut
źródło
3
Jaki jest promień wielokąta? Promień jego koła? Jego wychylenie?
Peter Taylor
Tam. Naprawiłem to. Przepraszam za to: P.
Taconut
2
@PeterTaylor Promień zwykłego wielokąta jest odległością do dowolnego wierzchołka (promień outcircle lub circumradius ). Promień koła (lub odległość od boków) nazywa się apothemem . Nie powinno to być „niejasne, o co pytasz”, ponieważ ma łatwą do znalezienia definicję (wynik nr 1 dla „promienia wielokąta” w Google).
Geobits
@Geobits Zgadzam się, ale i tak to edytowałem.
Taconut
@PeterTaylor Oznaczę to jako oba wtedy: I
Taconut

Odpowiedzi:

20

LOGO 37 - 25% = 27,75 (ze zmiennymi)

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

LOGO 49 - 25% = 36,75 (jako funkcja)

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

Trójkąt

Wywoływany ze zmiennymi

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

Używany jako funkcja P 100 3

wprowadź opis zdjęcia tutaj

Plac

Wywoływany ze zmiennymi

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

Używany jako funkcja P 100 4

wprowadź opis zdjęcia tutaj

Pięciokąt

Wywoływany ze zmiennymi

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

Używany jako funkcja P 100 5

wprowadź opis zdjęcia tutaj

Dekagon

Wywoływany ze zmiennymi

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

Używany jako funkcja P 100 10

wprowadź opis zdjęcia tutaj

okrąg

Wywoływany ze zmiennymi

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

Używany jako funkcja P 100 360

wprowadź opis zdjęcia tutaj

Abhijit
źródło
2
Czy możesz opublikować zrzut ekranu?
Gabe
Moim zdaniem wielokąty mają tę samą stronę, a nie promień.
Ross Millikan
@RossMillikan: Obrazy nie były skalowane. Właśnie zaktualizowałem zdjęcia
Abhijit
17

Mathematica, 40–25% = 30

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

wprowadź opis zdjęcia tutaj

śmigać
źródło
Świetny. To pokonało to, czego próbowałem Graphics.
DavidC
2
Nie fair! Zbyt łatwe!
Robbie Wxyz
Dobrze zrobione, nigdy by mi to nie przyszło do głowy.
Michael Stern
Jest Graphics@RegularPolygonniedozwolone?
Greg Martin
@GregMartin Jest to dozwolone, ale znacznie trudniej jest określić za jego pomocą promień.
Tylko ASCII,
12

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

Cóż, to Java: / Po prostu rysuje linie, punkt do punktu. Powinien działać dla dowolnego wielokąta o dowolnym rozmiarze. Wytnij trochę z oryginalnego rozmiaru. Ogromne uznanie dla Vulcan (w komentarzach) za lekcję golfa.

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();}}

Podziały wierszy:

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();
    }
}

Dane wejściowe to argumenty [promień] [strony]:

java D 300 7

Wydajność:

wielokąt!

Geobity
źródło
2
Wyeliminuj 12 bajtów, importując java.awt.image.*zamiastjava.awt.image.BufferedImage
FThompson
1
Mam obniżyła ją do 500 bajtów za pomocą kilku sztuczek. 1) Użyj Short.valueOfzamiast, Integer.valueOfaby zapisać cztery bajty, ponieważ dane wejściowe nigdy nie powinny przekraczać zakresu zwarć. 2) y[]=x.clone()oszczędza jeden bajt y[]=new int[s]. 3) Użyj przestarzałego f.show();zamiast, f.setVisible(1>0);aby zapisać dodatkowe dziewięć bajtów. 4) Użyj 6.28zamiast Math.PI*2, ponieważ oszacowanie jest wystarczająco dokładne do tego celu, oszczędzając trzy bajty. 5) Zadeklaruj Graphics gzamiast Graphics2D gprzy tworzeniu wystąpienia grafiki, aby zapisać dwa bajty.
FThompson
1
@Vulcan mam go następne 120 (głównie przez trashing BufferedImagei Graphicscałkowicie i po prostu rzuca wszystko paint()). Zmieniło kolor obrazu, choć nadal wygląda dobrze IMO. Dzięki, że
kazałem
1
@Geobits Świetne ulepszenia. Pracując nad zredukowaną wersją, zmniejszyłem ją do 349 bajtów , eliminując Framezmienną lokalną, usuwając dliczbę całkowitą i używając / nadużywając pętli for do zapisania kilku znaków, głównie średników. Oto wersja z białymi spacjami .
FThompson
1
Zmniejszony do 325 bajtów przy użyciu drawPolygonzamiast drawLine. Wersja spacji .
FThompson
11

TeX / TikZ (60 - 80,25)

Plik polygon.tex:

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

(80 bajtów)

Promień i liczba boków są podane jako zmienne / makra \ri \n. Dla promienia można podać dowolną jednostkę TeX. Bez jednostki cmużywana jest jednostka domyślna . Przykłady:

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

(16 bajtów bez wartości)

Jeśli numer strony powinien zostać pominięty, można to zrobić przez

\footline{}

(11 bajtów)

Przykłady generowania plików PDF:

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

Trójkąt

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

Wielokąt

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

Ośmiokąt

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

Dodekagon

Wynik:

Nie jest jasne, co trzeba liczyć. Zakres punktacji wynosiłby:

  • Kod podstawowy to 80 bajtów minus 25% = 60

  • Lub wszystkie włącznie (definicje zmiennych wejściowych, brak numeru strony): (80 + 16 + 11) minus 25% = 80,25

  • Jeśli połączenie między pierwszym a ostatnim punktem nie musi być gładkie, --cyclemożna je usunąć, oszczędzając 7 bajtów.

Heiko Oberdiek
źródło
8

Geogebra , 42–25 % = 31,5 bajtów

Jeśli policzysz znaki zamiast bajtów, będzie to 41 - 25% = 30,75 znaków.

(To znaczy, jeśli uważasz Geogebra za język ...)

Zakłada, że ​​promień jest przechowywany w zmiennej, ra liczba stron jest przechowywana w zmiennej s.

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

Wykorzystuje to twierdzenie cosinus c 2 = a 2 + b 2 - 2 ab cos C do obliczenia długości boku z podanego promienia.

Przykładowe dane wyjściowe dla s= 7, r= 5

wprowadź opis zdjęcia tutaj

użytkownik12205
źródło
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 jest promieniem koła)

Uruchom w terminalu ANSI

Edytować:

  • weź sugestię asa
  • użyj starych zmiennych (lub #define) jako danych wejściowych
  • użyj teraz promienia okręgu
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);}

skompilować:

gcc -opoly poly.c -Dn=sides -DR=radius -lm
cybcaoyibo
źródło
Kiedy używasz gcc, możesz faktycznie pominąć #includes. Ponadto możesz zadeklarować vjako globalny na zewnątrz maini zadeklarować ujako parametr main, wtedy nie potrzebujesz int(tj v;main(u){//....). Na koniec możesz zmienić ostatnią forpętlę nafor(j=0;j<s;)/*...*/x=j++-s/2.,//...
user12205
5

C, 359 znaków

Moja pierwsza próba gry w golfa. Przynajmniej wyprzedza rozwiązanie 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);}

bez golfa:

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);
}

Jest to jedyny program, który wyświetla wielokąt w ASCII zamiast go rysować. Z powodu tego i niektórych problemów z zaokrąglaniem zmiennoprzecinkowym wynik nie wygląda szczególnie ładnie (znaki ASCII nie są tak wysokie jak szerokość).

                 ######
               ###    ###
            ####        ####
          ###              ###
        ###                  ####
     ###                        ###
     #                            #
     #                            ##
    #                              #
    #                              #
   ##                              ##
   #                                #
  ##                                ##
  #                                  #
  #                                  #
 ##                                  ##
 #                                    #
##                                    ##
#                                      #
#                                      #
#                                      #
#                                      #
##                                    ##
 #                                    #
 ##                                  ##
  #                                  #
  #                                  #
  ##                                ##
   #                                #
   ##                              ##
    #                              #
    #                              #
     #                            ##
     #                            #
     ###                        ###
        ###                  ####
          ###              ###
            ###         ####
               ###    ###
                 ######
MarcDefiant
źródło
Pierwszy intmożna usunąć, ponieważ zakłada się, że intjest to kompilator. Ponadto ostatnia forpętla może zostać zmieniona nafor(j=0;j<r;){x=p+u*j;y=q+z*j++;//...
użytkownik12205
if(i<0)Można zmienić na if(i). Co jest nadal potrzebne tylko w jednej iteracji, ale nie udało się znaleźć skutecznego sposobu na usunięcie go :(
Allbeert
4

Mathematica, 54 * 75% = 40,5

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

Nie sądzę nawet, żeby istniała wersja bez golfisty. Zawierałby tylko więcej białych znaków.

Oczekuje promienia w zmiennej ri liczby boków w zmiennej n. Promień jest nieco pozbawiony znaczenia bez wyświetlania osi, ponieważ Mathematica skaluje wszystkie obrazy, aby pasowały.

Przykładowe użycie:

wprowadź opis zdjęcia tutaj

Martin Ender
źródło
Graphics@Polygon@Array[r{Sin@#,Cos@#}&,n+1,{0,2π}]
chyanog
@chyaong ah, mam tendencję do zapominania o Array .
Martin Ender
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>

Wersja bez golfa:

<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
źródło
Zaoszczędź 4 znaki przez i=S=5;i for(;i-->0;).
Matt
@Matt Dziękujemy! Nie znałem tej składni i nie mogę znaleźć żadnych informacji na jej temat. Jak to sie nazywa ?
sebcap26
@ sebcap26 Czy masz na myśli tę i-->0część? To jest tak samo jak i-- > 0. Niektórzy nazywają to również operatorem strzałek lub idzie do operatora ;)
ComFreek
Bez obaw :) Jak powiedział @ sebcap26, po prostu zmniejsza się za każdym razem, gdy pętla for ocenia warunek.
Matt
Myślę, że można zapisać znaki usunięcie c=document.currentScript.parentNode;i zastąpienie <canvas>przez<canvas id="c">
Hedi
3

Postscript 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

Podaj promień, liczbę boków i punkt środkowy linii poleceń

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

lub dołącz do źródła

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

Przetłumacz na środek, skaluj do promienia, przejdź do (1,0); następnie powtórz n razy: obróć o 360 / n, narysuj linię do (1,0); narysuj ostatnią linię, obrysuj i wyślij stronę.

luser droog
źródło
3

Szałwia , 44 - 25% = 33

Zakłada, że ​​liczba stron jest przechowywana w szmiennej, a promień jest przechowywany w rzmiennej.

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

Przykładowe dane wyjściowe:

s= 5, r= 3

wprowadź opis zdjęcia tutaj

s= 5, r= 6

wprowadź opis zdjęcia tutaj

s= 12, r= 5

wprowadź opis zdjęcia tutaj

użytkownik12205
źródło
Skalowanie osi jest mylące. Czy to da się naprawić? (np. pierwszy punkt w (0,3), gdy promień = 3, zamiast (0,1))
uraz cyfrowy
1
@DigitalTrauma Mój program zasadniczo generuje „standardowy” regularny wielokąt, a następnie powiększa obraz o współczynnik skali. O ile mi wiadomo, regular_polygonfunkcja zawsze generuje wielokąty z pierwszym wierzchołkiem przy (0,1). Rozwiązaniem byłoby nie pokazywanie osi z dodatkowymi 7 bajtami ( ,axes=0po figsize=r)
użytkownik12205
3

bc + ImageMagick + xview + bash, 104,25 (139 bajtów - 25%)

To wyzwanie byłoby niepełne bez odpowiedzi 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

Na przykład ./polygon.sh 8 100tworzy ten obraz:

wprowadź opis zdjęcia tutaj

Cyfrowa trauma
źródło
2

JavaScript 584 (867 bez golfa)

Ten kod używa N złożonych pierwiastków jedności i tłumaczy kąty na punkty X, Y. Następnie początek jest przenoszony na środek płótna.

Grał w golfa

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;
}

Przykładowe dane wyjściowe:

Wyjście w Chrome

Nie golfił

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;
}

Ten kod wymaga elementu płótna HTML5, c jest obiektem płótna, r jest promieniem, a n jest liczbą boków.

Bacchusbeale
źródło
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);

Zakłada dwie predefiniowane zmienne: $pliczbę punktów i $rpromień w pikselach. Alternatywnie można list(,$r,$p)=$argv;zamiast tego użyć argumentów wiersza poleceń i użyć ich. Wyjście będzie png, które powinno być potokowane do pliku.


Wydajność

$r=100; $p=5;

$r=100; $p=6;

$r=100; $p=7;

$r=100; $p=50;

primo
źródło
1

TI-80 BASIC, 25 bajtów - 25% = 18,75

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

Zakłada, że ​​wszystkie ustawienia są ustawione na wartości domyślne. Uruchom program jak 5:PRGM_POLYGON(dla pięciokąta)

Działa poprzez narysowanie koła z bardzo małą liczbą kroków. Na przykład pięciokąt ma stopnie 2π / 5 radianów.

Ustawienia okna są wystarczająco dobre TMINi TMAXsą ustawione na 0i , więc wszystko, co musimy zmienić, to TSTEP.

12Me21
źródło
1

SmileBASIC 3, 183 159 - 25% = 119,25 bajtów

Bierze boki i promień INPUT, oblicza i przechowuje punkty, a następnie rysuje je za pomocą GLINE. Wydaje mi się, że może to być krótsze, ale jest jak pierwsza w nocy, cokolwiek. Zakłada czyste i domyślne środowisko wyświetlania, więc może być konieczne ACLSpodczas uruchamiania go z 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

zrzut ekranu

ślimak_
źródło
1
Bajt to bajt, nie można powiedzieć, że to tylko połowa.
12Me21
Odejmowanie reguły 25%.
Matthew Roh
1

OpenSCAD: 31 mniej 25% = 23,25

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

Pierwszy post tutaj! Wiem, że spóźniłem się na przyjęcie, ale na początku wydawało mi się, że to równie dobre pytanie. Zadzwoń za pomocą p(n,r).

Julian Wolf
źródło
Witamy na stronie!
Wheat Wizard
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)
kanadyjczyk
źródło
0

C # w LINQPAD

Podziękowania dla części matematycznej należą do Geobits (mam nadzieję, że nie masz nic przeciwko!) Z odpowiedzią Java. Jestem beznadziejna z matematyki :)

Zrobiłem to w LINQPAD, ponieważ ma wbudowane okno wyjściowe. W zasadzie możesz przeciągnąć i upuścić w nim następujące elementy, a to narysuje wielokąt. Po prostu zmień go na „Program C #” i zaimportuj bibliotekę System.Drawing do właściwości zapytania.

//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);
}

wprowadź opis zdjęcia tutaj

jzm
źródło
0

Matlab 58 bajtów - 25% = 43,5

Nie widziałem rozwiązania Matlab, więc oto jedno, które jest dość proste:

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

Możesz zgolić niektóre bajty, jeśli r i n są już w obszarze roboczym.

Przykładowe wywołanie:

f(7,8)

7-gon o promieniu 8

ptev
źródło
0

Python 2, 222 bajty

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)

Sprawdza, czy piksel znajduje się po wewnętrznej stronie wszystkich hiperpłaszczyzn (linii) wielokąta. Promień jest dotknięty, ponieważ faktycznie używany jest apothem.

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Karl Napf
źródło
0

Mathematica 27 (= 36 - 25%)

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

Kiedy przesyłamy kod Mathematica, często zapominamy o nowych funkcjach, które wciąż są wbudowywane w język, a obecne słownictwo językowe gromadzi około 5000 podstawowych funkcji . Duże i rozwijające się słownictwo językowe jest bardzo przydatne podczas gry w golfa. CirclePoints zostały wprowadzone w aktualnej wersji 11.X. Konkretnym przykładem 7-stronnego promienia 5 jest:

wprowadź opis zdjęcia tutaj

Musisz także wprowadzić parametr kąta, aby kontrolować orientację wielokąta:

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

wprowadź opis zdjęcia tutaj

Witalij Kaurow
źródło
0

Python 2, 74 bajty - 25% = 55,5

Dane wejściowe są w zmiennych r,n. Jeśli zostanie uwzględniony w liczniku, będzie to r,n=input()o 12 bajtów więcej.

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

Wypróbuj online - (używa innego kodu, ponieważ execnie jest zaimplementowany w tłumaczu online)

mbomb007
źródło
0

SmileBASIC, 85 75–25 % = 56,25 bajtów

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

Zmienne S i R są używane jako dane wejściowe.

Wyjaśnił:

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

Boki są rysowane przy użyciu koloru -I, który zwykle jest bliski -1 (i biały HFFFFFFFF) (z wyjątkiem sytuacji, gdy Ima wartość 0, gdy jest przezroczysty).

Możesz również narysować wypełniony wielokąt za pomocą GTRI N,M,X,Y,R,R,-IzamiastGLINE...

12Me21
źródło
0

Tikz, 199 bajtów

\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}

To rozwiązanie wykorzystuje bibliotekę tikz shapes.geometric.

Oto jak wygląda wielokąt o 5bokach i promieniu, 8ingdy oglądany jest w evince .

Obowiązkowe zdjęcie

Kreator pszenicy
źródło