Draw a regular polygon

21

3

The goal of this code golf is to draw a regular polygon (one with equal side lengths) given the number of sides and radius (distance from center to vertex).

  • The number of sides and the radius can be entered via a file, STDIN, or just a plain old variable. Use whatever is shorter in your language.
  • -25% of total characters/bytes if the image is actually drawn instead of ASCII art.

Taconut

Posted 2014-04-16T01:10:18.407

Reputation: 822

What should the polygon look like? Why should the side length defined by the relationship above ^^ always be an integer? Please clarify, – Erik the Outgolfer – 2016-09-16T22:19:38.273

3What is the radius of a polygon? The radius of its incircle? Its outcircle? – Peter Taylor – 2014-04-16T07:25:53.350

There. I fixed it. Sorry about that :P. – Taconut – 2014-04-16T13:49:18.193

2

@PeterTaylor The radius of a regular polygon is the distance to any vertex (radius outcircle or circumradius). The incircle's radius(or distance to sides) is called the apothem. This shouldn't be "unclear what you're asking", since it has an easily found definition (#1 result for "radius of a polygon" on google).

– Geobits – 2014-04-16T13:57:21.907

@Geobits I agree, but I still edited it anyway. – Taconut – 2014-04-16T14:03:09.837

@PeterTaylor I'll tag it as both then :I – Taconut – 2014-04-16T14:03:40.270

@Taconut It would become a better challenge if you take length of one side as second input instead of radius. – Mukul Kumar – 2014-04-16T16:24:17.393

@MukulKumar radius=length/(2*sin(180/sides)) ? (Or pi rather than 180 if using radians) – Geobits – 2014-04-16T17:55:05.823

@Geobits oops! just forgot that kind of relationship! – Mukul Kumar – 2014-04-17T01:47:45.463

Answers

20

LOGO 37 - 25% = 27.75 (with variables)

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

LOGO 49 - 25% = 36.75 (as a function)

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

Triangle

Called with variables

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

Used as a function P 100 3

enter image description here

Square

Called with variables

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

Used as a function P 100 4

enter image description here

Pentagon

Called with variables

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

Used as a function P 100 5

enter image description here

Decagon

Called with variables

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

Used as a function P 100 10

enter image description here

Circle

Called with variables

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

Used as a function P 100 360

enter image description here

Abhijit

Posted 2014-04-16T01:10:18.407

Reputation: 2 841

2Can you post a screen shot? – Gabe – 2014-04-16T12:22:31.253

To my eye the polygons have the same side, not radius. – Ross Millikan – 2014-04-16T16:06:27.270

@RossMillikan: The Images were not to scale. I just updated the images – Abhijit – 2014-04-16T16:10:48.357

17

Mathematica, 40 - 25% = 30

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

enter image description here

swish

Posted 2014-04-16T01:10:18.407

Reputation: 7 484

Is Graphics@RegularPolygon not allowed? – Greg Martin – 2016-09-16T23:50:34.553

@GregMartin It's allowed, but it's much harder to specify radius with it. – ASCII-only – 2016-10-16T04:41:26.243

Great. That beat what I tried with Graphics. – DavidC – 2014-04-17T00:04:52.360

2No fair! Too easy! – Robbie Wxyz – 2014-04-17T00:38:20.047

Nicely done, this would never have occurred to me. – Michael Stern – 2014-04-17T15:11:16.583

12

Java 8 : 533 322 - 25% = 241.5

Well, it's Java :/ Just draws lines, point to point. Should work for any arbitrarily sized polygon. Cut it down quite a bit from original size. Huge credit to Vulcan (in comments) for the golf lesson.

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

Line Breaks:

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

Input is arguments [radius] [sides]:

java D 300 7

Output:

a polygon!

Geobits

Posted 2014-04-16T01:10:18.407

Reputation: 19 061

1@Vulcan Actually, r=Short.valueOf(v[0]),s=Short.valueOf(v[1]) can be golfed to r=new Short(v[0]),s=new Short(v[1]) (-8 bytes) - and yes, I know this answer is from 2+ years ago. ;) And I agree, great work with this answer! – Kevin Cruijssen – 2016-10-18T13:49:47.837

@KevinCruijssen Hah nice one! – FThompson – 2016-10-18T17:22:06.743

Since you specified it as Java 8, you can change class D{public static void main( to interface D{static void main( to save 3 more bytes. – Kevin Cruijssen – 2017-02-09T09:10:45.170

Shave off a byte by replacing class by enum – RobAu – 2014-04-16T11:32:59.153

@RobAu The only way I can get that to compile is by adding a ; and losing the saved character. – Geobits – 2014-04-16T11:41:49.957

Oh yes, you are right.. An enum needs at least an enum definition – RobAu – 2014-04-16T11:59:27.647

2Eliminate 12 bytes by importing java.awt.image.* instead of java.awt.image.BufferedImage – FThompson – 2014-04-16T15:32:39.843

@Vulcan Not sure how I missed that, thanks! – Geobits – 2014-04-16T15:36:17.227

1

I've reduced it to 500 bytes using a few tricks. 1) Use Short.valueOf instead of Integer.valueOf to save four bytes, as input should never exceed the range of shorts. 2) y[]=x.clone() saves one byte over y[]=new int[s]. 3) Use the deprecated f.show(); instead of f.setVisible(1>0); to save an addition nine bytes. 4) Use 6.28 instead of Math.PI*2, as the estimation is accurate enough for this purpose, saving three bytes. 5) Declare Graphics g instead of Graphics2D g when creating the graphics instance to save two bytes.

– FThompson – 2014-04-16T22:15:30.533

1@Vulcan I got it down another 120 (mainly by trashing the BufferedImage and Graphics altogether and just throwing everything in paint()). It did change the color of the image, though it still looks good IMO. Thanks for making me take another look at this :) – Geobits – 2014-04-16T23:26:07.257

1

@Geobits Great improvements. Working off of your reduced version, I've cut it down further to 349 bytes by eliminating the Frame as a local variable, removing the d integer, and using/abusing the for-loop to save a few characters, mainly semicolons. Here's a version with whitespace as well.

– FThompson – 2014-04-17T02:37:45.230

@Vulcan Nice! I didn't think about pulling setSize() in, so I couldn't figure out a way to get rid of the Frame. – Geobits – 2014-04-17T02:42:03.297

1Reduced to 325 bytes by using drawPolygon instead of drawLine. Whitespace version. – FThompson – 2014-04-17T04:25:21.527

1@Vulcan Never knew about drawPolygon, nice. Might as well shave off 3 more by pulling the loop in. I'm running out of stuff to do here... – Geobits – 2014-04-17T19:44:15.000

1I can't think of anything else to further reduce the bytes either; great work. – FThompson – 2014-04-17T23:29:07.490

11

TeX/TikZ (60 – 80.25)

File polygon.tex:

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

(80 bytes)

The radius and number of sides are provided as variables/macros \r and \n. Any TeX unit can be given for the radius. Without unit, the default unit cm is used. Examples:

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

(16 bytes without values)

If the page number should be suppressed, then it can be done by

\footline{}

(11 bytes)

Examples for generating PDF files:

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

Triangle

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

Polygon

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

Octagon

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

Dodecagon

Score:

It is not clear to, what needs counting. The range for the score would be:

  • The base code is 80 bytes minus 25% = 60

  • Or all inclusive (input variable definitions, no page number): (80 + 16 + 11) minus 25% = 80.25

  • If the connection between the first and last point do not need to be smooth, then --cycle could be removed, saving 7 bytes.

Heiko Oberdiek

Posted 2014-04-16T01:10:18.407

Reputation: 3 841

8

Geogebra, 42 – 25% = 31.5 bytes

If you count in characters instead of bytes, this would be 41 – 25% = 30.75 characters.

(That is, if you consider Geogebra a language...)

Assumes the radius is stored in the variable r and the number of sides stored in the variable s.

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

This uses the cosine theorem c2 = a2 + b2 – 2 a b cos C to calculate the side length from the given radius.

Sample output for s=7, r=5

enter image description here

user12205

Posted 2014-04-16T01:10:18.407

Reputation: 8 752

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 is radius of incircle)

Please run in ANSI terminal

Edit:

  • take ace's suggestion
  • use old variables (or #define) as input
  • use circumcircle radius now
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);}

compile:

gcc -opoly poly.c -Dn=sides -DR=radius -lm

cybcaoyibo

Posted 2014-04-16T01:10:18.407

Reputation: 61

When you use gcc you can actually omit the #includes. Also, you can declare v as global outside main, and declare u as a parameter of main, then you don't need int (i.e. v;main(u){//...). Finally, you can change the last for loop into for(j=0;j<s;)/*...*/x=j++-s/2.,//... – user12205 – 2014-04-16T15:07:57.620

5

C, 359 Chars

My first attempt at golfing. At least it beats the Java solution ;-)

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

And it's the only program that outputs the polygon in ASCII instead of drawing it. Because of this and some floating point rounding issues, the output doesn't look particularly pretty (ASCII Chars are not as high as wide).

                 ######
               ###    ###
            ####        ####
          ###              ###
        ###                  ####
     ###                        ###
     #                            #
     #                            ##
    #                              #
    #                              #
   ##                              ##
   #                                #
  ##                                ##
  #                                  #
  #                                  #
 ##                                  ##
 #                                    #
##                                    ##
#                                      #
#                                      #
#                                      #
#                                      #
##                                    ##
 #                                    #
 ##                                  ##
  #                                  #
  #                                  #
  ##                                ##
   #                                #
   ##                              ##
    #                              #
    #                              #
     #                            ##
     #                            #
     ###                        ###
        ###                  ####
          ###              ###
            ###         ####
               ###    ###
                 ######

MarcDefiant

Posted 2014-04-16T01:10:18.407

Reputation: 996

The first int can be removed since they are assumed to be int by the compiler. Also, the last for loop can be changed to for(j=0;j<r;){x=p+u*j;y=q+z*j++;//... – user12205 – 2014-04-16T15:02:54.197

The if(i<0) could be changed to if(i). Which is still only needed in one iteration, but couldn't find an efficient way to take it out :( – Allbeert – 2014-04-16T19:10:24.547

4

Mathematica, 54 * 75% = 40.5

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

I don't even think there's a point for an ungolfed version. It would only contain more whitespace.

Expects the radius in variable r and number of sides in variable n. The radius is a bit meaningless without displaying axes, because Mathematica scales all images to fit.

Example usage:

enter image description here

Martin Ender

Posted 2014-04-16T01:10:18.407

Reputation: 184 808

Graphics@Polygon@Array[r{Sin@#,Cos@#}&,n+1,{0,2π}] – chyanog – 2014-06-15T08:19:02.150

@chyaong ah, I tend to forget about Array. – Martin Ender – 2014-06-15T08:24:43.267

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>

Ungolfed version :

<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

Posted 2014-04-16T01:10:18.407

Reputation: 1 301

I think you can save chars removing c=document.currentScript.parentNode; and replacing <canvas> by <canvas id="c"> – Hedi – 2016-09-16T21:24:39.907

Save 4 chars by i=S=5; and for(;i-->0;). – Matt – 2014-04-17T01:06:56.877

@Matt Thank you ! I didn't know this syntax, and can't find any information about it. How is it called ? – sebcap26 – 2014-04-17T14:49:01.133

@sebcap26 Do you mean the i-->0 part? It's the same as i-- > 0. Some people also call it the arrow operator or the goes to operator ;)

– ComFreek – 2014-04-17T19:19:40.177

No worries :) As @sebcap26 said, it's just decrementing every time the for loop evaluates the condition. – Matt – 2014-04-18T02:45:49.580

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

Pass the radius, number of sides, and center point on the command line

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

or prepend to the source

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

Translate to the center, scale up to the radius, move to (1,0); then repeat n times: rotate by 360/n, draw line to (1,0); draw final line, stroke and emit the page.

luser droog

Posted 2014-04-16T01:10:18.407

Reputation: 4 535

3

Sage, 44 - 25% = 33

Assumes the number of sides is stored in the s variable and the radius is stored in the r variable.

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

Sample output:

s=5, r=3

enter image description here

s=5, r=6

enter image description here

s=12, r=5

enter image description here

user12205

Posted 2014-04-16T01:10:18.407

Reputation: 8 752

The scaling of the axes is misleading. Is that fixable? (e.g first point at (0,3) when radius=3, instead of (0,1)) – Digital Trauma – 2014-04-17T15:30:29.070

1@DigitalTrauma My program basically generates the "standard" regular polygon, then enlarges the image by a scale factor. As far as I know the regular_polygon function always generates polygons with the first vertex at (0,1). A fix would be to not show the axes with an additional 7 bytes (,axes=0 after figsize=r) – user12205 – 2014-04-17T17:45:36.313

3

bc + ImageMagick + xview + bash, 104.25 (139 bytes - 25%)

This challenge would be incomplete without an ImageMagick answer...

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

For example, ./polygon.sh 8 100 produces this image:

enter image description here

Digital Trauma

Posted 2014-04-16T01:10:18.407

Reputation: 64 644

2

JavaScript 584 (867 ungolfed)

This code uses N Complex Roots of unity and translates the angles to X,Y points. Then the origin is moved to centre of the canvas.

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

Sample output:

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

This code requires HTML5 canvas element, c is canvas object, r is radius and n is # of sides.

bacchusbeale

Posted 2014-04-16T01:10:18.407

Reputation: 1 235

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

Assumes two predefined variables: $p the number of points, and $r the radius in pixels. Alternatively, one could prepend list(,$r,$p)=$argv; and use command line arguments instead. Output will be a png, which should be piped to a file.


Output

$r=100; $p=5;

$r=100; $p=6;

$r=100; $p=7;

$r=100; $p=50;

primo

Posted 2014-04-16T01:10:18.407

Reputation: 30 891

1

TI-80 BASIC, 25 bytes - 25% = 18.75

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

Assumes all settings are set to the default values. Run the program like 5:PRGM_POLYGON (for a pentagon)

It works by drawing a circle with a very low number of steps. For example, a pentagon would have steps of 2π/5 radians.

The window settings are good enough by default, and TMIN and TMAX are set to 0 and , so all we need to change is TSTEP.

12Me21

Posted 2014-04-16T01:10:18.407

Reputation: 6 110

1

SmileBASIC 3, 183 159 - 25% = 119.25 bytes

Takes the sides and radius from INPUT, calculates and stores the points, and then draws them by using GLINE. I feel like this could be shorter but it's like 1 AM, whatever. Assumes a clean and default display env, so you might need to ACLS when running it from 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

screenshot

snail_

Posted 2014-04-16T01:10:18.407

Reputation: 1 982

1A byte is a byte, you can't say it's only a half. – 12Me21 – 2017-02-09T08:09:10.480

Subtracting 25% rule. – Matthew Roh – 2017-02-13T15:17:05.467

1

OpenSCAD: 31 less 25% = 23.25

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

First post here! I know I'm late to the party, but this seemed like as good a question as any to start with. Call using p(n,r).

Julian Wolf

Posted 2014-04-16T01:10:18.407

Reputation: 1 139

Welcome to the site! – Post Rock Garf Hunter – 2017-03-13T22:41:07.383

0

SmileBASIC, 85 75 - 25% = 56.25 bytes

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

Variables S and R are used for input.

Explained:

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

The sides are drawn using the color -I, which is usually close to -1 (&HFFFFFFFF white) (except when I is 0, when it's transparent).

You can also draw a filled polygon by using GTRI N,M,X,Y,R,R,-I instead of GLINE...

12Me21

Posted 2014-04-16T01:10:18.407

Reputation: 6 110

0

Mathematica 27 ( = 36 - 25%)

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

When we submit Mathematica code we often forget about new functions that keep getting built into the language, with current language vocabulary amassing around 5000 core functions. Large and expanding language vocabulary is btw quite handy for code-golfing. CirclePoints were introduced in the current version 11.X. A specific example of 7-sided radius 5 is:

enter image description here

Also you just need to enter angle parameter to control orientation of your polygon:

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

enter image description here

Vitaliy Kaurov

Posted 2014-04-16T01:10:18.407

Reputation: 1 561

0

Tikz, 199 bytes

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

This solution uses the tikz library shapes.geometric.

Here is what a polygon with 5 sides and radius 8in looks like when viewed in evince.

Obligatory Picture

Post Rock Garf Hunter

Posted 2014-04-16T01:10:18.407

Reputation: 55 382

0

C# in LINQPAD

Credit for the math part goes to Geobits (I hope you don't mind!) with the Java answer. I'm hopeless at math :)

I did this in LINQPAD as it's got a built in output window. So essentially you can drag and drop the following in to it and it'll draw the polygon. Just switch it to 'C# Program', and import the System.Drawing lib into the query properties.

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

enter image description here

jzm

Posted 2014-04-16T01:10:18.407

Reputation: 369

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

Posted 2014-04-16T01:10:18.407

Reputation: 101

0

Python 2, 74 bytes - 25% = 55.5

Input is in the variables r,n. If included in the count, it would be r,n=input(), for 12 bytes more.

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

Try it online - (uses different code since exec is not implemented in the online interpreter)

mbomb007

Posted 2014-04-16T01:10:18.407

Reputation: 21 944

0

Matlab 58 bytes - 25% = 43.5

Saw no Matlab solution, so here is one which is pretty straightforward:

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

You can shave off some bytes if r and n are already in the workspace.

Example call:

f(7,8)

7-gon with radius 8

ptev

Posted 2014-04-16T01:10:18.407

Reputation: 111

0

Python 2, 222 bytes

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)

Checks if a pixel is on the inner side of all hyperplanes (lines) of the polygon. The radius is touched because actually the apothem is used.

enter image description here enter image description here

Karl Napf

Posted 2014-04-16T01:10:18.407

Reputation: 4 131