\begingroup

相关

由半径恒定的组成的。最著名的鲁洛多边形是,它有三条边1。在这个挑战中,你的任务是绘制一个给定边数的正鲁洛多边形。

鲁洛多边形的构造方法是取一个多边形,并将其每条边替换为以对顶点为中心的圆弧。

这种形状只能由奇数条边的多边形构成,因此您的输入将是一个大于或等于三的奇数。

鲁洛三角形(3 条边) 鲁洛五边形(5 条边) 鲁洛七边形(7 条边)
构造三角形 构造五边形 构造七边形
三角形 五角大楼 七边形

第一行中的圆圈用于演示构造;您的程序的输出应该更接近第二行的输出(尽管中心标记是可选的。)

给定一个奇数≥3,以及可选的圆弧半径,绘制一个具有该边数的正鲁洛多边形。如果不将圆弧半径作为输入,请确保图像的分辨率足够高,以便可以辨认曲线。

这是;每种语言中最短的解决方案获胜。



1按照标准定义,曲线不能有“边”,因为每条边都是一条线,但是为了完成这项任务,我为了简单起见,到处都使用术语“边”。

\endgroup

2

  • \begingroup
    如果轴不显示刻度,则圆弧半径无关紧要。我们可以选择不将圆弧半径作为输入吗?
    \endgroup


    – 


  • 2
    \begingroup
    是的,当然,我只是说这个要求是为了确保所有的解决方案都能以足够好的分辨率工作,以便你能够解读曲线,但我会删除这个要求并重新表述👍
    \endgroup


    – 


7 个回答
7

\begingroup

,64字节

from turtle import*
def f(n,d):
 for c in[0,d]*n:circle(c,180/n)


TIO 也不行。

历史:80,82,64。

如何?

观察到弧长总是等于半个完整的圆,我们让乌龟画一个圆,省略掉总共2 n2n2n等长弧

\endgroup

4

  • \begingroup
    f(7,40)似乎没有画出完整的形状:
    \endgroup


    – 

  • \begingroup
    @noodleperson 你确定这不是 Python 2 还是什么?在有除法的地方强制使用浮点数似乎可以解决这个问题。而且,它在我的电脑上运行得很好。
    \endgroup


    – 


  • \begingroup
    我相信你,它可能是 Python 2
    \endgroup


    – 

  • \begingroup
    @Albert.Lang 确实如此。修改代码以确保它是浮点数即可。
    \endgroup


    – 

\begingroup

152 142 字节

->n{s='<svg viewBox="-50-50 99 99"><path d="M40 0'
n.times{|j|s<<"A#{r=40/(k=1i**(1.0/n)).imag} #{r} 0 0,0 %f %f"%(40*k**(4*~j)).rect}
s+'">'}

返回包含 SVG 图像(例如下面的图像)的字符串的函数。n 个点始终落在半径为 40 的圆上。边的曲率半径根据 的值而变化n

<svg viewBox="-50-50 99 99"><path d="M40 0A80.00000000000001 80.00000000000001 0 0,0 -20.000000 -34.641016A80.00000000000001 80.00000000000001 0 0,0 -20.000000 34.641016A80.00000000000001 80.00000000000001 0 0,0 40.000000 0.000000">

\endgroup

3

  • \begingroup
    该属性的值viewBox是四个数字的列表<min-x>, <min-y>, <width> and <height>,以空格和/或逗号分隔。请在前两个数字之间添加一个。
    \endgroup


    – 

  • \begingroup
    “给定一个奇数≥3和一个圆弧半径”——这个代码实现了圆弧半径的选择吗?
    \endgroup


    – 

  • \begingroup
    @DominicvanEssen 我删除了该要求,因为它似乎没有增加任务。
    \endgroup


    – 

\begingroup

,62 字节

Graphics[ResourceFunction["ReuleauxPolygon"][Input[],Input[]]]

当然 Wolfram 有办法做到这一点。第一个输入是圆弧半径,第二个输入是nnn边数。


输入100,的示例5

\endgroup

\begingroup

139 132 119 字节

(或者在R ≥ 4.1 中通过将 3x 个function关键字替换为98 个字节\)。

编辑:不再需要r提供 adius 作为输入,从而节省 13 个字节。

function(n,i=1:396/99-2,v=1i^(1:n*4/n),R=abs(1-v[n/2]),`~`=sapply)image(i~function(x)i~function(y)all(abs(x+y*1i-v)<R))

\endgroup

\begingroup

,36字节

t:!=ZFt9W:8W/qt!J*+le-|wq|X>>a[]e0YG

尝试一下!

对于输入n,这将计算n次单位根,并且如果每个像素与所有根的距离为D或更短,则为每个像素着色,其中D是根对之间的最大距离。

代码使用(适用于 MATL)来计算单位根。

t      % Implicitly take input: n. Duplicate
:!     % Range, transpose. Gives the column vector [1; 2; ...; n]
=      % Equal? element-wise. Gives [0; 0; ...; 1]
ZF     % FFT. Gives roots of unity (*)
t      % Duplicate
9W:    % 2^9, range. Gives the row vector [0 1 ... 512]
8W/    % Divide each ech entry by 2^8
q      % Subtract 1. Gives [-0.99609375, -0.9921875, ..., 1]
t!J*   % Duplicate, transpose, multiply element-wise by imaginart unit
+      % Add element-wise with broadcast. Gives 512×512 complex grid from
       % -0.99609375 to 1 on each axis
le     % Linearize (in column-major order) to a row vector of length 512^2 (**)
-|     % Absolute difference between (*) and (**), element-wise with broadcast.
       % Gives an n×512^2 distance matrix
w      % Swap. Moves original copy of (*) to the top
q|X>   % Subtract 1, absolute value, maximum. Gives distance D
>      % Greater than? element-wise. Gives an n×512^2 logical matrix
a      % Any. Gives a row vector of length 512^2, containing 1 if the pixel
       % is at a distance greater than D from at least one circle center, and
       % 0 otherwise
[]e    % Reshape as a square (512×512) matrix
0YG    % Write as image file. Implicitly display

\endgroup

\begingroup

58 56 字节

由于未使用的变量分配而导致 -2 字节B←

获取边数并输出形状位图的 dfn。

{(C-C⊖⍨⌈⍵÷2)∧.>⍥|C∘.-I∘.+0J1×I←40÷⍨¯41+⍳81⊣C←¯1*⍵÷⍨+⍨⍳⍵}

它使用复数对二维平面上的点进行编码。

{(C-C⊖⍨⌈⍵÷2)∧.>⍥|C∘.-I∘.+0J1×I←40÷⍨¯41+⍳81⊣C←¯1*⍵÷⍨+⍨⍳⍵}
                                           C←¯1*⍵÷⍨+⍨⍳⍵  ⍝ vertces
                     I∘.+0J1×I←40÷⍨¯41+⍳81               ⍝ points on the plane
                 C∘.-                                    ⍝ displacement vectors to the vertices
 (C-C⊖⍨⌈⍵÷2)                                             ⍝ displacement vectors between oppisite vertices
            ∧.>⍥|                                        ⍝ are the points within the reuleaux polygon

\endgroup

0

\begingroup

徽标,61字节

to r:n
repeat :n[pd arc 90 180/:n pu fd 90 rt 180-180/:n]
end

不幸的是,我以前使用的在线徽标资源不再可用,但您可以将代码粘贴到上的文本框中并运行它。(还可以粘贴以下代码以实际运行任何内容。)

clear
r 5

(用您想要的值替换5。)

\endgroup