接線ポリゴン拡張


11

次のようなものを描きます。

ここに画像の説明を入力してください

より正確に言えば、半径rの円を描き、長さlのnの等間隔接線を描く。これらの線の端を接続して、新しいn辺の正多角形を形成します。

ルール

r =円の半径
n =接線の数-円の周りに等間隔である必要がある(n> = 3)
l =接線の辺の長さ

引数{r、n、l}を受け入れ、必要な出力を描画するプログラムを作成します。

単位はピクセルです。

図面がすべて表示されている限り、図面の場所に制限はありません。

写真は一目瞭然です。

これはコードゴルフなので、バイト単位の最短コードが勝ちです!


nは3以上になると思いますが、最大値はありますか?接線と円も必要ですか?
MickyT 14年

はい、n> = 3(lの長さが足りない場合はokの交差点)。円と接線を描く必要があります。基本的には、出力が影付きの円であるときに最大になると思います。つまり、最大値は、このような図面の現実的な最大値です。
ストレッチマニア14年

ベクターグラフィックを作成する場合、ピクセル単位も適用されますか?そのような場合、ピクセルは実際には非常に不明確です。または、ラスタライズされたグラフィックを作成する必要がありますか?
マーティンエンダー14年

@MartinBüttner、何らかのスケール(軸など)がある場合、(派手な)ベクトルグラフィックスのピクセル単位を無視できます。
ストレッチマニア14年

回答:


5

Mathematica、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 14年

@DavidCarraherええ、私は実際に135バイトですでにそれを行っていましたが、それをノートブックにコピーするのを忘れていたので、ユニコードの変更を行ったときに元に戻りました。ありがとう!
マーティンエンダー14年

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 14年


7

T-SQL 440 483

これで賞品を獲得するつもりはありませんが、絵を描くのが好きです:)

let辞を編集します!円を横切って描かれたポリゴンがめちゃくちゃになっていることに気付いた。コストで修正。

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(単位長さを示すために軸が含まれています)のサンプル関数出力: Circupoly出力

のサンプル関数出力n = 1024, r = 4, l = 2Circupoly出力


私はピッキングをしていますが、単位はピクセル単位です
デジタルトラウマ14年

3
@DigitalTrauma:ああ。気づかなかった。MATLABの図には固定単位がありません。ウィンドウに合わせて拡大縮小します。とにかく、それは論点です。Pythonでのロゴベースのソリューションは、私のものよりも優れています。今日まで、私は誰かがLOGOをPythonに移植するとは考えていませんでしたが、それはあります。私は一緒に学んでいます。:P
COTO 14年

とにかく+1 :)
デジタルトラウマ14年

画像はほぼ開口部のロゴです。
誇り高いhaskeller 14年

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.