Extensions de polygone tangent

11

Dessinez quelque chose qui ressemble à ceci:

entrez la description de l'image ici

En termes plus précis, tracez un cercle de rayon r, avec n espaces uniformément tangents de longueur l. Reliez les extrémités de ces lignes pour former un nouveau polygone régulier à n côtés.

Règles

r = rayon du cercle
n = nombre de lignes tangentes - doit être régulièrement espacé autour du cercle (n> = 3)
l = longueur latérale des lignes tangentes

Créez un programme qui accepte les arguments {r, n, l} et dessine la sortie requise.

Les unités sont en pixels.

Il n'y a aucune restriction à l'emplacement du dessin, tant qu'il est visible dans son intégralité.

L'image est assez explicite.

C'est le code-golf, donc le code le plus court en octets gagne!

Stretch Maniac
la source
Je suppose que n sera> = 3, y a-t-il un maximum? Voulez-vous également les tangentes et le cercle?
MickyT
Oui, n> = 3, (intersection en ok si l n'est pas assez long). Vous devez dessiner le cercle et les tangentes. Je pense que le maximum est essentiellement lorsque la sortie est un cercle ombré. En d'autres termes, le maximum est le maximum réaliste pour un dessin comme celui-ci.
Stretch Maniac
Les unités de pixels s'appliquent-elles même si nous produisons un graphique vectoriel? Parce que dans un tel cas, les pixels sont en fait assez mal définis. Ou nous avons à produire des graphiques tramée?
Martin Ender
@ MartinBüttner, vous pouvez ignorer l'unité de pixels avec vos graphiques vectoriels (fantaisistes) s'il y a une sorte d'échelle (comme un axe).
Stretch Maniac

Réponses:

5

Mathematica, 135 132 131 131 123 octets

{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]

Ce code attend l'entrée (via une invite) exactement comme spécifié dans la question: par exemple {100, 6, 150}. Il produit un graphique vectoriel, donc j'inclus un axe, comme spécifié dans les commentaires de l'OP.

Les tangentes et le polygone sont en fait une seule bande de ligne, en traversant "polygone-coin, point tangent, polygone-coin, polygone-coin suivant, point tangent, polygone-coin ..."

entrez la description de l'image ici

Si ce n'était pas pour l'axe, je pourrais même le faire en 107 octets:

{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]]}

Des économies supplémentaires (en dehors de Axes->1>0) viennent du fait que je peux maintenant tout redimensionner par r, ce qui simplifie l'appel à Circleproduire un cercle unitaire.

Martin Ender
la source
{0,0}~Circle~r
DavidC
@DavidCarraher heh, je l'avais déjà fait dans les 135 octets, mais j'ai oublié de le recopier dans mon cahier, donc il est revenu quand j'ai fait le changement Unicode. Merci!
Martin Ender, du
8

Python, 133 octets

La seule réponse à ce jour pour se conformer à la règle "Les unités sont en pixels" ...

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)

Ajoutez exitonclick()à la fin si vous ne voulez pas que la fenêtre se ferme immédiatement.

Production:

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

entrez la description de l'image ici

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

entrez la description de l'image ici

Traumatisme numérique
la source
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
1
Essayez-le en ligne
mbomb007
7

T-SQL 440 483

Je ne gagnerai aucun prix avec celui-ci, mais j'aime dessiner des images :)

Edit Expletive! Je viens de remarquer que j'ai foiré pour les polygones dessinés à travers le cercle. Fixé à un coût.

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

Exécuté avec les variables suivantes

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

Exécutez dans Sql Server Management Studio 2012+, il renverra ce qui suit dans l'onglet des résultats spatiaux. entrez la description de l'image ici

Avec

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

entrez la description de l'image ici

avec

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

entrez la description de l'image ici

Développé

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 
MickyT
la source
5

MATLAB - 233 octets

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

Exemple de sortie de fonction pour n = 8, r = 4, l = 6(axes inclus pour indiquer la longueur de l'unité): sortie circpoly

Exemple de sortie de fonction pour n = 1024, r = 4, l = 2: sortie circpoly

COTO
la source
Je suis à la traîne, mais les unités sont en pixels
Digital Trauma
3
@DigitalTrauma: Ah. Je n'ai pas remarqué ça. Les figurines MATLAB n'ont pas d'unités fixes; ils évoluent jusqu'à la fenêtre. Et c'est un point discutable de toute façon. Votre solution basée sur LOGO en Python a le mien battu à fond. Avant aujourd'hui, je n'aurais pas pensé que quelqu'un porterait LOGO en Python, mais ça y est. J'apprends au fur et à mesure. : P
COTO
Eh bien +1 quand même :)
Digital Trauma
L'image est presque le logo de l'ouverture.
fier haskeller
4

HTML + JavaScript (E6) 298

Pour tester, enregistrez en tant que fichier html et ouvrez avec FireFox. Insérez les paramètres r, n, l dans le champ de saisie, séparés par des virgules, puis tabulez.

Ou essayez 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>

Exemple de sortie

50,20,140

edc65
la source