切线多边形扩展


11

绘制如下所示的内容:

在此处输入图片说明

更精确地说,画一个半径为r的圆,其中n个长度为l的n个均匀间隔的切线。连接这些线的末端以形成一个新的n边正多边形。

规则

r =圆半径
n =切线的数量-必须围绕圆均匀间隔(n> = 3)
l =切线的边长

创建一个接受参数{r,n,l}并绘制所需输出的程序。

单位以像素为单位。

只要可以看到所有图形,图形位置就没有限制。

图片很不言自明。

这是代码高尔夫球,因此以字节为单位的最短代码胜出!


我假设n将> = 3,是否有最大值?您是否也要切线和圆?
MickyT 2014年

是的,n> = 3,(如果l不够长,则在ok中相交)。您应该绘制圆和切线。我认为最大值基本上是在输出为阴影圆时。换句话说,最大值是这种图形的实际最大值。
2014年

如果我们生成矢量图形,像素单位甚至适用吗?因为在这种情况下,像素实际上定义不清。还是我们必须产生栅格化的图形?
马丁·恩德2014年

@MartinBüttner,如果存在某种比例(例如轴),则可以忽略带有(精美)矢量图形的像素单位。
2014年

Answers:


5

数学,135个 132 131 123字节

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

此代码期望输入(通过提示)与问题中指定的完全相同:例如{100, 6, 150}。它会产生一个矢量图形,因此我要包括一个轴,如OP的注释中所指定。

切线和多边形实际上都是一条直线,通过遍历“多边形角,切点,多边形角,下一个多边形角,切点,多边形角...”

在此处输入图片说明

如果不是轴,我什至可以用107个字节来做:

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

Axes->1>0我现在可以按来重新缩放所有内容r,这除了节省了额外的费用外,还简化了Circle产生单位圆的调用。


{0,0}~Circle~r
DavidC 2014年

@DavidCarraher呵呵,我实际上已经在135个字节中完成了此操作,但是却忘记了将其复制回我的笔记本中,因此当我进行Unicode更改时它被还原了。谢谢!
Martin Ender 2014年

8

Python,133个字节

到目前为止,唯一符合“以像素为单位”规则的答案...

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()如果您不希望窗口立即关闭,请添加到末尾。

输出:

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

在此处输入图片说明

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

在此处输入图片说明


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,2014年


7

T-SQL 440 483

不会赢得任何奖项,但我喜欢画画:)

编辑专业!只是注意到我弄乱了画在圆上的多边形。固定费用。

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

用以下变量执行

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

在Sql Server Management Studio 2012+中运行,它将在空间结果选项卡中返回以下内容。 在此处输入图片说明

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

在此处输入图片说明

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

在此处输入图片说明

扩展了

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字节

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

的示例函数输出n = 8, r = 4, l = 6(包含的轴表示单位长度): Circpoly输出

的示例函数输出n = 1024, r = 4, l = 2Circpoly输出


我正在采摘,但单位是像素
Digital Trauma

3
@DigitalTrauma:啊。没注意到。MATLAB图形没有固定单位。他们缩放到窗口。无论如何,这都是有争议的。您在Python中基于LOGO的解决方案取得了不错的成绩。在今天之前,我还没有想到会有人将LOGO移植到Python中,但是确实如此。我一直在学习。:P
COTO 2014年

不管怎么说,井+1 :)
Digital Trauma

图像几乎是光圈的徽标。
骄傲的haskeller 2014年

4

HTML + JavaScript(E6)298

要进行测试,请另存为html文件并使用FireFox打开。将参数r,n,l插入输入字段,以逗号分隔,然后跳出。

或尝试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>

样品输出

50,20,140

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.