Extensiones de polígono tangente


11

Dibuja algo que se vea así:

ingrese la descripción de la imagen aquí

En términos más precisos, dibuje un círculo de radio r, con n líneas tangentes de longitud uniforme l. Conecte los extremos de estas líneas para formar un nuevo polígono regular de n lados.

Reglas

r = radio del círculo
n = número de líneas tangentes: debe estar uniformemente espaciado alrededor del círculo (n> = 3)
l = longitud lateral de las líneas tangentes

Cree un programa que acepte los argumentos {r, n, l} y dibuje el resultado requerido.

Las unidades están en píxeles.

No hay restricciones en la ubicación del dibujo, siempre y cuando todo esté visible.

La imagen se explica por sí misma.

Este es el código de golf, por lo que gana el código más corto en bytes.


Supongo que n será> = 3, ¿hay un máximo? ¿Quieres las tangentes y el círculo también?
MickyT

Sí, n> = 3, (intersección en ok si l no es lo suficientemente larga). Debes dibujar el círculo y las tangentes. Creo que el máximo es básicamente cuando la salida es un círculo sombreado. En otras palabras, el máximo es el máximo realista para un dibujo como este.
Stretch Maniac

¿Se aplican las unidades de píxeles incluso si producimos un gráfico vectorial? Porque en tal caso, los píxeles están bastante mal definidos. O hacer que tenemos para producir gráficos rasterizadas?
Martin Ender

@ MartinBüttner, puede ignorar la unidad de píxeles con sus gráficos vectoriales (elegantes) si hay algún tipo de escala (como un eje).
Stretch Maniac

Respuestas:


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]

Este código espera la entrada (a través de una solicitud) exactamente como se especifica en la pregunta: por ejemplo {100, 6, 150}. Produce un gráfico vectorial, por lo que incluyo un eje, como se especifica en los comentarios del OP.

Tanto las tangentes como el polígono son en realidad una sola línea, al atravesar "esquina de polígono, punto de tangente, esquina de polígono, siguiente esquina de polígono, punto de tangente, esquina de polígono ..."

ingrese la descripción de la imagen aquí

Si no fuera por el eje, incluso podría hacer esto en 107 bytes:

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

Los ahorros adicionales (aparte de Axes->1>0) provienen del hecho de que ahora puedo reescalar todo r, lo que simplifica la llamada a Circleproducir un círculo unitario.


{0,0}~Circle~r
DavidC

@DavidCarraher je, en realidad ya lo había hecho en los 135 bytes, pero olvidé copiarlo de nuevo en mi cuaderno, por lo que se revirtió cuando hice el cambio Unicode. ¡Gracias!
Martin Ender

8

Python, 133 bytes

La única respuesta hasta ahora para cumplir con la regla "Las unidades están en píxeles" ...

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)

Agregue exitonclick()al final si no desea que la ventana se cierre inmediatamente.

Salida:

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí


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

No voy a ganar ningún premio con este, pero me gusta dibujar imágenes :)

Editar improperio! Acabo de notar que me equivoqué por los polígonos dibujados a través del círculo. Fijo 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

Ejecutado con las siguientes variables

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

Ejecutar en SQL Server Management Studio 2012+ devolverá lo siguiente en la pestaña de resultados espaciales. ingrese la descripción de la imagen aquí

Con

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

ingrese la descripción de la imagen aquí

con

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

ingrese la descripción de la imagen aquí

Ampliado

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

Salida de función de muestra para n = 8, r = 4, l = 6(ejes incluidos para indicar la longitud de la unidad): salida de circuito

Salida de función de muestra para n = 1024, r = 4, l = 2: salida de circuito


Estoy buscando cosas, pero las unidades están en píxeles
Digital Trauma

3
@ Digital Trauma: Ah. No me di cuenta de eso. Las figuras de MATLAB no tienen unidades fijas; escalan a la ventana. Y es un punto discutible de todos modos. Su solución basada en LOGO en Python ha superado la mía. Antes de hoy no habría concebido que alguien portara LOGO en Python, pero ahí está. Estoy aprendiendo a medida que avanzo. : P
COTO

Bueno +1 de todos modos :)
Trauma digital

La imagen es casi el logo de la apertura.
orgulloso Haskeller 01 de

4

HTML + JavaScript (E6) 298

Para probar, guárdelo como un archivo html y ábralo con Firefox. Inserte los parámetros r, n, l en el campo de entrada, separados por comas, luego separe.

O prueba 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>

Salida de muestra

50,20,140

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.