Estensioni poligonali tangenti


11

Disegna qualcosa che assomigli a questo:

inserisci qui la descrizione dell'immagine

In termini più precisi, disegna un cerchio di raggio r, con n linee tangenti di spazi pari di lunghezza l. Collegare le estremità di queste linee per formare un nuovo poligono regolare n-side.

Regole

r = raggio del cerchio
n = numero di linee tangenti - deve essere distribuito uniformemente attorno al cerchio (n> = 3)
l = lunghezza laterale delle linee tangenti

Creare un programma che accetta gli argomenti {r, n, l} e disegna l'output richiesto.

Le unità sono in pixel.

Non ci sono restrizioni alla posizione del disegno, purché tutto sia visibile.

L'immagine è piuttosto autoesplicativa.

Questo è code-golf, quindi vince il codice più breve in byte!


Presumo che n sarà> = 3, c'è un massimo? Vuoi anche le tangenti e il cerchio?
MickyT

Sì, n> = 3, (intersezione in ok se l non è abbastanza lungo). Dovresti disegnare il cerchio e le tangenti. Penso che il massimo sia fondamentalmente quando l'output è un cerchio ombreggiato. In altre parole, il massimo è il massimo realistico per un disegno come questo.
Stretch Maniac

Le unità pixel si applicano anche se produciamo una grafica vettoriale? Perché in tal caso i pixel sono in realtà abbastanza poco definiti. O dobbiamo avere per produrre grafica rasterizzati?
Martin Ender,

@ MartinBüttner, potresti ignorare l'unità pixel con la tua grafica vettoriale (di fantasia) se c'è una sorta di scala (come un asse).
Stretch Maniac

Risposte:


5

Mathematica, 135 132 131 123 byte

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

Questo codice prevede l'immissione (tramite un prompt) esattamente come specificato nella domanda: ad es {100, 6, 150}. Produce una grafica vettoriale, quindi includo un asse, come specificato nei commenti dall'OP.

Sia le tangenti che il poligono sono in realtà una striscia a linea singola, attraversando "angolo poligonale, punto tangente, angolo poligonale, angolo poligonale successivo, punto tangente, angolo poligonale ..."

inserisci qui la descrizione dell'immagine

Se non fosse per l'asse, potrei persino farlo in 107 byte:

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

Ulteriori risparmi (a parte Axes->1>0) derivano dal fatto che ora posso ridimensionare tutto r, il che semplifica la chiamata a Circleprodurre un cerchio unitario.


{0,0}~Circle~r
David C

@DavidCarraher eh, in realtà l'avevo già fatto nei 135 byte, ma ho dimenticato di copiarlo sul mio taccuino, quindi è stato ripristinato quando ho apportato la modifica Unicode. Grazie!
Martin Ender,

8

Python, 133 byte

L'unica risposta finora per rispettare la regola "Le unità sono in pixel" ...

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)

Aggiungi exitonclick()alla fine se non vuoi che la finestra si chiuda immediatamente.

Produzione:

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

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine


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

Non vincerò alcun premio con questo, ma mi piace disegnare immagini :)

Modifica Expletive! Ho appena notato che ho incasinato i poligoni disegnati attraverso il cerchio. Risolto a un costo.

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

Eseguito con le seguenti variabili

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

Eseguito in SQL Server Management Studio 2012+ restituirà quanto segue nella scheda dei risultati spaziali. inserisci qui la descrizione dell'immagine

Con

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

inserisci qui la descrizione dell'immagine

con

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

inserisci qui la descrizione dell'immagine

Espanso

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 byte

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

Uscita della funzione di esempio per n = 8, r = 4, l = 6(assi inclusi per indicare la lunghezza dell'unità): uscita circpoly

Uscita funzione di esempio per n = 1024, r = 4, l = 2: uscita circpoly


Sto selezionando la nitidezza, ma le Unità sono in pixel
Trauma digitale

3
@DigitalTrauma: Ah. Non l'ho notato. Le figure MATLAB non hanno unità fisse; si adattano alla finestra. Ed è comunque un punto controverso. La tua soluzione basata su LOGO in Python ha battuto profondamente il mio. Prima di oggi non avrei immaginato che qualcuno portasse LOGO in Python, ma è così. Sto imparando mentre vado avanti. : P
COTO

Bene +1 comunque :)
Digital Trauma

L'immagine è quasi il logo dell'apertura.
orgoglioso haskeller

4

HTML + JavaScript (E6) 298

Per provare, salva come file html e aprilo con FireFox. Inserisci i parametri r, n, l nel campo di input, separati da virgola, quindi fai un tab out.

Oppure prova 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>

Uscita campione

50,20,140

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.