绘制如下所示的内容:
更精确地说,画一个半径为r的圆,其中n个长度为l的n个均匀间隔的切线。连接这些线的末端以形成一个新的n边正多边形。
规则
r =圆半径
n =切线的数量-必须围绕圆均匀间隔(n> = 3)
l =切线的边长
创建一个接受参数{r,n,l}并绘制所需输出的程序。
单位以像素为单位。
只要可以看到所有图形,图形位置就没有限制。
图片很不言自明。
这是代码高尔夫球,因此以字节为单位的最短代码胜出!
绘制如下所示的内容:
更精确地说,画一个半径为r的圆,其中n个长度为l的n个均匀间隔的切线。连接这些线的末端以形成一个新的n边正多边形。
r =圆半径
n =切线的数量-必须围绕圆均匀间隔(n> = 3)
l =切线的边长
创建一个接受参数{r,n,l}并绘制所需输出的程序。
单位以像素为单位。
只要可以看到所有图形,图形位置就没有限制。
图片很不言自明。
这是代码高尔夫球,因此以字节为单位的最短代码胜出!
Answers:
{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
到目前为止,唯一符合“以像素为单位”规则的答案...
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"
:
for i in n*[0]:c(r,360/n);fd(l);bk(l)
->exec'c(r,360/n);fd(l);bk(l)'*n;
不会赢得任何奖项,但我喜欢画画:)
编辑专业!只是注意到我弄乱了画在圆上的多边形。固定费用。
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
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
(包含的轴表示单位长度):
的示例函数输出n = 1024, r = 4, l = 2
:
要进行测试,请另存为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>
样品输出