Tangenten-Polygon-Erweiterungen


11

Zeichne etwas, das so aussieht:

Geben Sie hier die Bildbeschreibung ein

Genauer gesagt, zeichnen Sie einen Kreis mit dem Radius r mit n Tangentenlinien der Länge l mit gleichmäßigen Abständen. Verbinden Sie die Enden dieser Linien, um ein neues n-seitiges reguläres Polygon zu bilden.

Regeln

r = Kreisradius
n = Anzahl der Tangenten - muss gleichmäßig um den Kreis verteilt sein (n> = 3)
l = Seitenlänge der Tangenten

Erstellen Sie ein Programm, das die Argumente {r, n, l} akzeptiert und die erforderliche Ausgabe zeichnet.

Einheiten sind in Pixel.

Es gibt keine Einschränkungen für die Position der Zeichnung, solange alles sichtbar ist.

Das Bild ist ziemlich selbsterklärend.

Dies ist Code-Golf, also gewinnt der kürzeste Code in Bytes!


Ich gehe davon aus, dass n> = 3 sein wird. Gibt es ein Maximum? Willst du auch die Tangenten und den Kreis?
MickyT

Ja, n> = 3 (Schnittpunkt in ok, wenn l nicht lang genug ist). Sie sollten den Kreis und die Tangenten zeichnen. Ich denke, das Maximum ist im Grunde, wenn die Ausgabe ein schattierter Kreis ist. Mit anderen Worten, das Maximum ist das realistische Maximum für eine Zeichnung wie diese.
Stretch Maniac

Treffen die Pixeleinheiten überhaupt zu, wenn wir eine Vektorgrafik erstellen? Denn in einem solchen Fall sind Pixel eigentlich ziemlich schlecht definiert. Oder haben wir haben zu gerasterten Grafiken produzieren?
Martin Ender

@ MartinBüttner, Sie können die Pixeleinheit mit Ihren (ausgefallenen) Vektorgrafiken ignorieren, wenn es eine Art Skalierung gibt (wie eine Achse).
Stretch Maniac

Antworten:


5

Mathematica, 135 132 131 123 Bytes

{r,n,l}=Input[];Graphics[{{0,0}~Circle~r,Line[Join@@Array[{b=(a=r{c=Cos[t=2Pi#/n],s=Sin@t})-l{s,-c},a,b}&,n+1]]},Axes->1>0]

Dieser Code erwartet die Eingabe (über eine Eingabeaufforderung) genau wie in der Frage angegeben: z {100, 6, 150}. Es wird eine Vektorgrafik erstellt, daher füge ich eine Achse hinzu, wie in den Kommentaren des OP angegeben.

Sowohl die Tangenten als auch das Polygon sind tatsächlich ein einzelner Linienstreifen, indem "Polygonecke, Tangentenpunkt, Polygonecke, nächste Polygonecke, Tangentenpunkt, Polygonecke ..." durchlaufen werden.

Geben Sie hier die Bildbeschreibung ein

Wenn die Achse nicht wäre, könnte ich dies sogar in 107 Bytes tun:

{r,n,l}=Input[];Graphics@{Circle[],Line[Join@@Array[{b=(a={c=Cos[t=2Pi#/n],s=Sin@t})-l/r{s,-c},a,b}&,n+1]]}

Zusätzliche Einsparungen (abgesehen von Axes->1>0) ergeben sich aus der Tatsache, dass ich jetzt alles neu skalieren kann r, was den Aufruf zur CircleBildung eines Einheitskreises vereinfacht .


{0,0}~Circle~r
DavidC

@DavidCarraher heh, ich hatte das tatsächlich schon in den 135 Bytes gemacht, aber vergessen, es wieder in mein Notizbuch zu kopieren, so dass es zurückgesetzt wurde, als ich die Unicode-Änderung vornahm. Vielen Dank!
Martin Ender

8

Python, 133 Bytes

Die einzige Antwort, die bisher der Regel "Einheiten sind in Pixel" entspricht ...

from turtle import*
c=circle
r,n,l=input()
lt(90)
exec'c(r,360/n);fd(l);bk(l);'*n
fd(l)
lt(towards(-r,0)-180)
c(distance(-r,0),360,n)

exitonclick()Zum Ende hinzufügen , wenn das Fenster nicht sofort geschlossen werden soll.

Ausgabe:

python tangentpoly.py <<< "20, 6, 30"::

Geben Sie hier die Bildbeschreibung ein

python tangentpoly.py <<< "100, 8, 200"::

Geben Sie hier die Bildbeschreibung ein


1
for i in n*[0]:c(r,360/n);fd(l);bk(l)->exec'c(r,360/n);fd(l);bk(l)'*n;
isaacg


7

T-SQL 440 483

Ich werde mit diesem keinen Preis gewinnen, aber ich zeichne gerne Bilder :)

Expletive bearbeiten ! Ich habe gerade bemerkt, dass ich es mit Polygonen vermasselt habe, die über den Kreis gezogen wurden. Auf Kosten behoben.

SELECT Geometry::UnionAggregate(Geometry::Point(0,0,0).STBuffer(@r).STExteriorRing().STUnion(Geometry::STGeomFromText(CONCAT('LINESTRING(',@r*SIN(a),' ',@r*COS(a),',',@r*SIN(a)+@l*SIN(b),' ',@r*COS(a)+@l*COS(b),')'),0))).STUnion(Geometry::ConvexHullAggregate(Geometry::Point(@r*SIN(a)+@l*SIN(b),@r*COS(a)+@l*COS(b),0)).STExteriorRing())p FROM(SELECT RADIANS(360./@*N)a,RADIANS((360./@*N)-90)b FROM(SELECT TOP(@)row_number()OVER(ORDER BY(SELECT\))-1N FROM sys.types a,sys.types b)t)r

Wird mit den folgenden Variablen ausgeführt

declare @r float = 1.0
declare @ int = 10
declare @l float = 3.0

Wenn Sie es in SQL Server Management Studio 2012+ ausführen, wird auf der Registerkarte "Räumliche Ergebnisse" Folgendes zurückgegeben. Geben Sie hier die Bildbeschreibung ein

Mit

declare @r float = 1.0
declare @ int = 360
declare @l float = 3.0

Geben Sie hier die Bildbeschreibung ein

mit

declare @r float = 10.0
declare @ int = 3
declare @l float = 10.0

Geben Sie hier die Bildbeschreibung ein

Erweitert

SELECT Geometry::UnionAggregate(    --group together lines
    Geometry::Point(0,0,0)          --Set origin
    .STBuffer(@r)                   --Buffer to @r
    .STExteriorRing()               --Make it a line
    .STUnion(                       --Join to the floowing tangent
        Geometry::STGeomFromText(   --Create a tangent line
            CONCAT('LINESTRING(',@r*SIN(a),' ',@r*COS(a),',',@r*SIN(a)+@l*SIN(b),' ',@r*COS(a)+@l*COS(b),')'),0)
        )
    ).STUnion( --Generate polygon around exterior points
    Geometry::ConvexHullAggregate(Geometry::Point(@r*SIN(a)+@l*SIN(b),@r*COS(a)+@l*COS(b),0)).STExteriorRing()
    )
    p
FROM(
    SELECT RADIANS(360./@*N)a,      --calclate bearings
        RADIANS((360./@*N)-90)b
    FROM(                           --make enough rows to draw tangents
        SELECT TOP(@)row_number()OVER(ORDER BY(SELECT\))-1N 
        FROM sys.types a,sys.types b
        )t
    )r 

5

MATLAB - 233 Bytes

function C(n,r,l),t=2*pi/n;c=cos(t);s=sin(t);M=[c,s;-s,c];F=@(y)cell2mat(arrayfun(@(x){M^x*y},1:n));P=F([0;r]);Q=F([l;r]);v='k';t=1e3;t=2*pi/t*(0:t);R=[1:n 1];q=Q(1,R);s=Q(2,R);plot(r*cos(t),r*sin(t),v,[P(1,R);q],[P(2,R);s],v,q,s,v);

Beispielfunktionsausgabe für n = 8, r = 4, l = 6(Achsen zur Angabe der Längeneinheit): Circpoly-Ausgabe

Beispielfunktionsausgabe für n = 1024, r = 4, l = 2: Circpoly-Ausgabe


Ich nehme keine Auswahl, aber die Einheiten sind in Pixel angegeben
Digital Trauma

3
@ DigitalTrauma: Ah. Hab das nicht bemerkt. MATLAB-Figuren haben keine festen Einheiten; Sie skalieren zum Fenster. Und es ist sowieso ein strittiger Punkt. Ihre LOGO-basierte Lösung in Python hat meine solide übertroffen. Bis heute hätte ich nicht gedacht, dass jemand LOGO in Python portieren würde, aber da ist es. Ich lerne, während ich weiter mache. : P
COTO

Naja +1 sowieso :)
Digital Trauma

Das Bild ist fast das Logo der Blende.
stolzer Haskeller

4

HTML + JavaScript (E6) 298

Speichern Sie zum Testen als HTML-Datei und öffnen Sie sie mit FireFox. Fügen Sie die Parameter r, n, l in das Eingabefeld ein, durch Kommas getrennt, und tippen Sie sie dann aus.

Oder versuchen Sie es mit jsfiddle

<input onblur="
[r,n,l]=this.value.split(','),
z=r-~l,t=D.getContext('2d'),w='lineTo',
D.width=D.height=z*2,
t.arc(z,z,r,0,7);
for(C=1,S=i=0;i++<n;)
  t[w](x=z+r*C,y=z+r*S),
  t[w](x-l*S,y+l*C),
  C=Math.cos(a=6.283*i/n),
  S=Math.sin(a),
  t[w](z+r*C-l*S,z+r*S+l*C);
t.stroke()">
<canvas id=D>

Beispielausgabe

50, 20, 140

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.