ひし形が本当に欲しかったのですが、得たのはこの愚かな長方形だけでした


33

直定規とコンパスのみが与えられた場合、与えられた長方形の内側に菱形を刻み、2つの反対の点を共有します。

長方形の菱形

入力

入力は長方形の寸法です。示されている例では、それはになります125, 50。最も便利な方法(2つの整数、リスト、文字列など)で入力を受け取ることができます。

大きい方の寸法は最小100で、小さい方の寸法は最小25です。両方のキャップは200です。

出力

出力は、画面に表示されるかファイルとして保存される画像です

  • 入力長方形
  • すべての「作業」線/円
  • 刻まれた菱形

異なる色で。上の画像では、長方形は黒、作業線は青、菱形はオレンジです。線はリストに表示されている順序で描画する必要があります(たとえば、菱形は作業線と長方形を上書きします)。

出力画像は、すべてを含むのに十分な大きさである必要があります。たとえば、表示されている円は範囲を超えることはできません。

方法

上記の画像例で使用されている方法は次のとおりです。

  • 左下隅を中心として、右上を境界上の点として使用して円を描き、長方形の対角線に等しい半径を与えます。
  • 同じことを行いますが、中心点と周辺点を交換します。
  • 2つの円の交点の間に線を引き、長方形の対角線に垂直な二等分線を与えます。
  • 新しい線と長方形の交点を使用して、菱形を描きます。

これは、菱形の内部の対角線が常に互いに垂直に二等分するために機能します。ただし、このことの完全な証拠はここには含めません。

これが菱形を取得する唯一の方法ではなく、あなたが何をしているのかを説明すれば、別の菱形を使用することもできます。おそらく最も簡単と思います。

ルール

円と線(または線分)のみを描画できます。円は、中心点と周辺点で定義されます。線は任意の2点で定義されます。線は、指定された長さである必要はありませんが、少なくとも定義点をカバーする必要があります(例の画像に注意してください:線は円の交差点を少し過ぎますが、端までは行かない)。円の場合、中心から選択した境界点までの半径は作業線と見なされ、表示する必要があります。

行をラスタライズするには、認識されたアルゴリズム(Bresenhamなど)を使用するか、言語に組み込まれているものに依存します。出力がベクトルベースの場合、少なくともピクセル単位の入力矩形と同じ大きさの解像度表示されることを確認してください。また、プレーンキャンバスに描画するため、グリッドマークや無関係な出力を抑制してください。

不正行為はありません!これまでに設定したものを使用してのみ、ポイント/ライン/円の配置を決定できます。作業線/円を使用して菱形であることを示す方法を説明できない場合、それは間違っています。

必要な反対のポイントのペアを使用でき、出力が正しい限り、長方形を軸に沿って描画する必要ありません。

入力は常に非正方形の長方形になりますので、特別な場合は心配しないでください。

最後に、これは標準コードゴルフであるため、バイト単位の最小サイズが優先されます。


数式を使用して、たとえば、描かれた円の交差点の間に描かれた線の端点を決定できますか(実際に交差点の場所を確認するために画像を解析することなく)?
ETHproductions

@ETHproductions私はイエスと言います。なぜなら、それらと半径の間の角度が各辺で60度であり、正三角形を形成していることを示すのはかなり簡単だからです。異議がある人がいれば、私もそれを聞いて喜んでいます。
ジオビット

3
最初の入力が2番目の入力よりも大きい(またはその逆)と仮定できますか、または回答は垂直方向と水平方向の両方の長方形を処理できる必要がありますか?
マーティンエンダー

長方形内の短い線分セグメントの目的は何ですか?
12Me21

回答:


11

HTML + JavaScript(ES6)、34 + 353 = 387バイト

入力はの形式で指定する必要があります[125,50]

[w,h]=eval(prompt(c=C.getContext("2d"))).sort();d=q=>(c.strokeStyle=q,b);l=(x,y=Z)=>x?c.lineTo(x,y)||l:c.stroke();b=(x,y=H,r)=>(c.beginPath(),r?c.arc(x,y,Math.sqrt(r),0,2*Math.PI):c.moveTo(x,y),l);b(Z=300,Z)(W=Z+w)(W,H=Z+h)(Z,H)(Z)();d`red`(Z,H,s=w*w+h*h)();b(W,Z,s)();b(Z)(W)();b(Z+w/2-h,Z+h/2-w)(H+w/2,W+h/2)();d`lime`(Z)(W-s/2/w)(W)(Z+s/2/w,H)(Z,H)()
<canvas id=C width=800 height=800>

多くの数学と描画...高さが幅よりも大きい場合、長方形は横に描画されます。


Oooh、10バイト未満444:P
Kritixi Lithos

@KritixiLithos今、私は10バイト未満です400;-)
ETHproductions

高さが幅よりも大きい場合、長方形は菱形に内接します。
ラーケイス

1
@Larkeith Oops、これらのケースをカバーしなければならないことを知りませんでした。42バイトのコストで修正されました。
ETHproductions

「getContext `2d` "(スペースなし)を使用して数バイトを節約できます(なぜ`と
markdown

10

Mathematica、157 148 158バイト

いつもの高品質のコメントを寄せてくれたMartin Enderに感謝します!この場合、9バイトが保存されました。

引数がどちらの順序でも来ることができることが明らかになった後に編集されました。補償するために10バイトが追加されました。

Graphics@{(m=Line)@{o=0{,},{#,0},c={##},{0,#2},o},Blue,m[l={o,c}],Circle[#,(c.c)^.5]&/@l,m[{k={#2,-#},-k}+{c,c}/2],Red,m@{o,p={0,c.c/2/#2},c,c-p,o}}&@@Sort@#&

繰り返しますが、これはMathematicaが輝くところです:数学計算を伴う高レベルのグラフィックス出力。人間が読みやすいようにスペースと改行を使用した同じコード:

Graphics@{
  (m=Line)@{o = 0{,}, {#, 0}, c = {##}, {0, #2}, o},
  Blue, m[l = {o, c}], Circle[#, (c.c)^.5] & /@ l, 
  m[{k = {#2, -#}, -k} + {c, c}/2],
  Red, m@{o, p = {c.c/2/#2, 0}, c, c - p, o}
} & @@ Sort@# &

正数の順序付けられたペアである単一引数の名前のない関数。最後は、@@ Sort@# &そのペアを最初の数値が小さい2つの数値引数に変換します。Lineポイントからポイントへのポリゴンパスを生成します。最初と最後のポイントが同じ場合、閉じたポリゴンになります。Circle与えられた中心と半径を持つ円を生成します。特別なポイントoc(左下および右上の長方形の角)、p(数式で与えられる3番目の菱形の角)、およびk(垂直二等分線の描画を支援する)は、再度呼び出されたときにバイトを保存する途中で名前が与えられます、ポイントの特別なペアと同様にl = {o,c}。Mathematicaは点を直接追加し、両方の座標を同じ係数で乗算し、それらの内積をとるなど、コードを単純化します。

引数125とを含むサンプル出力50

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


1
不要な空白を再。このトリックを使用して、バイトをに保存できます{0,0}。青とオレンジを使用する必要がないため、のRed代わりにを使用してバイトを節約できますOrangeLine4回使用していますが、これはバイトを節約するのに十分な量ですi=Line;(経験則として、式にn文字mがあり(m-1)*(n-1) > 4、必要な回数使用する場合、括弧なしで最初の使用中に変数を割り当てることができる場合は少なくなります)。
マーティンエンダー

その0{,}トリックは素晴らしいです:D
グレッグマーティン

2番目のサイドが1番目のサイドよりも長い場合、これは機能しないと思います。ただし、方向は一貫している必要はありません。したがって、コード全体で追加@@Sort@#&と交換#を行う#2か、代わりに縦向きの長方形で動作するように適応させることで修正できます。
マーティンエンダー

はい、それは意図的なものでした...私たちは、次元が望む順序で来ると仮定できるかどうかの明確化を待っているようです。
グレッグマーティン


9

MetaPost、473(色付き)353(色なし)

色付き(473バイト):

A:=170;B:=100;pair X,Y;path C,D,E,F,G,R,T;X=(0,0);Y=(A,B);R=X--(A,0)--Y--(0,B)--cycle;T=(0,B)--(A,B);draw R;E=X--Y;C=X..Y*2..cycle;D=Y..-Y..cycle;F=(D intersectionpoint C)--(C intersectionpoint D);draw C withcolor green;draw D withcolor green;draw E withcolor red;draw F withcolor red;draw (F intersectionpoint R)--Y withcolor blue;draw X--(F intersectionpoint T) withcolor blue;draw (F intersectionpoint T)--Y withcolor blue;draw (F intersectionpoint R)--X withcolor blue;

色なし(353バイト):

A:=170;B:=100;pair X,Y;path C,D,E,F,G,R,T;X=(0,0);Y=(A,B);R=X--(A,0)--Y--(0,B)--cycle;T=(0,B)--(A,B);draw R;E=X--Y;C=X..Y*2..cycle;D=Y..-Y..cycle;F=(D intersectionpoint C)--(C intersectionpoint D);draw C;draw D;draw E;draw F;draw (F intersectionpoint R)--Y;draw X--(F intersectionpoint T);draw (F intersectionpoint T)--Y;draw (F intersectionpoint R)--X;

EVER前にこれを使用していない、と私はそれを虐殺確信している...決して
しかし、あなたがこのウェブサイト上でそれを実行すると:

http://www.tlhiv.org/mppreview/

円の交点を使用して2番目の軸を描画し、軸と長方形の交点を使用して最終的な菱形を描画します。不正行為をして、最初の軸に垂直に線を引くこともできましたが。

寸法を変更するには、AとBを変更します。

とにかく、次のようになります(L = 170、H = 100の場合):

画像


3

デモ、375(または163)バイト

w=125
h=50
\left(wt,\left[0,h\right]\right)
\left(\left[0,w\right],ht\right)
\left(x-\left[0,w\right]\right)^2+\left(y-\left[0,h\right]\right)^2=w^2+h^2
\frac{h}{w}x\left\{0\le x\le w\right\}
-\frac{w}{h}\left(x-\frac{w}{2}\right)+\frac{h}{2}
a=\frac{h^2}{2w}+\frac{w}{2}
\left(t\left(w-a\right)+\left[0,1\right]a,ht\right)
\left(at-\left[0,a-w\right],\left[0,h\right]\right)

wそしてh入力です。Desmosで試してみてください!

代替の163バイトバージョン:

w=125
h=50
(wt,[0,h])
([0,w],ht)
(x-[0,w])^2+(y-[0,h])^2=w^2+h^2
hx/w\left\{0\le x\le w\right\}
-w(x-w/2)/h+h/2
a=h^2/2/w+w/2
(t(w-a)+[0,1]a,ht)
(at-[0,a-w],[0,h])

このバージョンでは、各行をコピーして各行にDesmosに貼り付ける必要があります。メタは、これが有効なカウント方法であるかどうかを判断する必要がありますが、前者の方法は間違いなく問題ありません。


これは、入力長方形が横向きであると想定しているように見えますが、これはタスクで指定されていません。
ヘニングマクホルム

1
私にとって、「長方形を軸に沿って描画する必要はありません」とは、長方形に横向きと縦向きなど、保持する必要がある所定の方向がないことを意味します。
グレッグマーティン

サイズのみが指定されるため(座標ではなく)、サイズが正しいと仮定して、出力を好きなように整列させることができます。
ジオビット

初めてDesmosがゴルフの言語として使用されるのを見ました:)
Kritixi Lithos

3

ImageMagickバージョン7.0.3 + bash + sed、496バイト

M=magick
L=$((400-$(($1))/2)),$((400+$(($2))/2))
R=$((400+$(($1))/2)),$((400-$(($2))/2))
Z=" $L $R" Y=" -1 x";D=' -draw' K=' -stroke'
A=' -strokewidth 3 +antialias -fill'
$M xc:[800x]$A none$K \#000$D "rectangle$Z"$D "line$Z"$K \#00F8$D "circle$Z"$K \#0F08$D "circle $R $L" -depth 8 png:a
$M a txt:-|sed "/38C/!d;s/:.*//">x;P=`head$Y`;Q=`tail$Y`
$M a$A \#F008$K \#F008$D "line $P $Q" b
$M b txt:-|sed "/C70/!d;s/:.*//">x;S=`head$Y`;T=`tail$Y`
$M b$A \#F804$K \#F80$D "polyline $L $S $R $T $L" x:

「rhombus.sh 180 120」の結果

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

より正確(800x800ではなく6400x6400キャンバスを使用)、570バイト

交差点は正確ではありません。"strokewidth"ディレクティブは、少なくとも1つのピクセル全体が2つの交差する線の色と混ざり合うように線を十分に広くしますが、最悪の場合(25x200および200x25)交差が小さい角度であるため、雲混合ピクセルの長さは数ピクセルで、最初と最後の混合ピクセルを選択するため、わずかなエラーがあります。同じストローク幅で8倍大きいキャンバスを使用し、結果を縮小すると、エラーが1ピクセル未満に減少しますが、約64倍の時間ペナルティがあります。

M=magick
L=$((3200-$(($1))*4)),$((3200+$(($2))*4))
R=$((3200+$(($1))*4)),$((3200-$(($2))*4))
K=-stroke;A='-strokewidth 3 +antialias'
$M xc:[6400x] $A -fill none $K \#000 -draw "rectangle $L $R" \
-draw "line $L $R" $K \#00F8 -draw "circle $L $R" \
$K \#0F08 -draw "circle $R $L" -depth 8 png:a 
$M a txt:-|grep 38C077|sed -e "s/:.*//p">x
P=`head -1 x`;Q=`tail -1 x`
$M a $A -fill \#F008 $K \#F008 -draw "line $P $Q" png:b
$M b txt:-|grep C70000|sed -e "s/:.*//p">x
S=`head -1 x`;T=`tail -1 x`
$M b $A -fill \#F804 $K \#F80 -draw "polyline $L $S $R $T $L" -resize 800 x:

通常の800x800と正確な6400x6400の結果:

通常の結果と正確な結果

ゴルフをしていない:

# rhombus.sh
# Inscribe a rhombus in the rectangle with dimensions 2*$1, 2*$2

# Run with "rhombus.sh W H"

M=magick

W=${1:-100};H=${2:-40}

# L locates the lower left corner of the rectangle
L=$((400-$((W))/2)),$((400+$((H))/2))

# R locates the upper right corner of the rectangle
R=$((400+$((W))/2)),$((400-$((H))/2))

# We'll need this several times
A='-strokewidth 3 +antialias'

# Establish 800x800 canvas (white) (circles + rectangle will
# always fit in 764x764)
#
# Draw the W x H rectangle (black) in center of canvas
#
# Draw two circles (blue, 50% alpha [#00F8] and green, 50% alpha [#0F08])
#  one centered at point L with peripheral point R
#  the other centered at point R with peripheral point L

$M xc:[800x] $A -fill none \
       -stroke \#000  -draw "rectangle $L $R" \
                      -draw "line      $L $R" \
       -stroke \#00F8 -draw "circle    $L $R" \
       -stroke \#0F08 -draw "circle    $R $L" \
       -depth 8 a.png 

# Find P and Q, the 2 intersections of the circles,
# that have mixed color #38C077 
$M a.png txt:-|grep 38C077|sed -e "s/:.*//p">x
P=`head -1 x`;Q=`tail -1 x`

# Draw line connecting the intersections P and Q
$M a.png $A -fill \#F008 -stroke \#F008 -draw "line $P $Q" b.png

# Find S and T, the 2 intersections of the line with the original rectangle,
# that have mixed color #C70000
$M b.png txt:-|grep C70000|sed -e "s/:.*//p">x
S=`head -1 x`;T=`tail -1 x`

# Draw the rhombus
$M b.png $A -fill \#F804 -stroke \#F80 -draw "polyline $L $S $R $T $L" d.png

交差点を検出する方法がとても気に入っています。最後の混合色は正しいですか?菱形と長方形の線が少しずれているように見えるので、お願いします。アンチエイリアシング(おそらくストローク幅も)のために、色がわずかにずれた場所で検出されているのではないかと思いました。
ジオビット

2

R、290バイト

function(A,B,p=polygon){R=A^2+B^2
D=2*A
a=sqrt(R)*cbind(cos(t<-seq(0,2*pi,.01)),sin(t))
b=t(t(a)+c(A,B))
x=range(a,b)
plot(NA,xli=x,yli=x,as=1,ax=F,an=F)
rect(0,0,A,B)
segments(0,0,A,B,c=4)
p(a,b=4)
p(b,b=4)
curve(B/2-A*x/B+A^2/2/B,co=4,a=T)
p(cbind(c((R-2*B^2)/D,A,R/D,0),c(B,B,0,0)),b=3)}

匿名関数、出力は画面に表示されます。コメント付きでわずかに制限なし:

function(A,B){
    R=A^2+B^2
    D=2*A
    t=seq(0,2*pi,.01)
    a=sqrt(R)*cbind(cos(t),sin(t)) #Circle with (0,0) as center
    b=t(t(a)+c(A,B)) #Second circle transposed to (A,B) center
    x=range(a,b)
    #Empty plot, large enough to fit the 2 circles:
    plot(NA,xlim=x,ylim=x,asp=1,axes=F,ann=F)
    rect(0,0,A,B) #Initial rectangle
    segments(0,0,A,B,col=4) #Rectangle diagonal
    polygon(a,border=4) #Circle 1 (border is b thanks to partial matching)
    polygon(b,border=4) #Circle 2
    curve(B/2-A*x/B+A^2/2/B,col=4,add=T) #Line joining circles intersection
    polygon(cbind(c((R-2*B^2)/D,A,R/D,0),c(B,B,0,0)),border=3) #Rhombus
}

(120,100)の出力例:

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


2

LibreLogo、270バイト

ユーザー入力は配列として取得されます:[width, height]または[height, width]

コード:

fc [24]
D=180
R=sorted(eval(input "))
W=R[1]
H=R[0]
L=sqrt W**2+H**2
A=D/π*asin(H/L)
Z=A*2
S=L/2/cos A*π/D rectangle[W,H]pc 255 lt A fd 400 bk 800 fd 400 rt A pu bk H/2 lt 90 fd W/2 pd circle L*2 rt D-A fd L circle L*2 pc [5]lt D-A fd S lt Z fd S rt D+Z fd S lt Z fd S

結果:

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

説明:

fc [24]                        ; Fill Color = Invisible
D = 180                        ; D = 180° (Saved Bytes)
R = sorted( eval( input " ) )  ; R = Sorted Array of Rectangle Width and Height (User Input)
W = R[1]                       ; W = Rectangle Width
H = R[0]                       ; H = Rectangle Height
L = sqrt W**2 + H**2           ; L = Rectangle Diagonal Length
A = D / π * asin( H / L )      ; A = Rectangle Diagonal Angle°
Z = A * 2                      ; Z = Rectangle Diagonal Angle° * 2 (Saved Bytes)
S = L / 2 / cos A * π / D      ; S = Rhombus Side Length
rectangle [W, H]               ; Draw Rectangle
pc 255                         ; Pen Color = Blue
lt A                           ; Left = Rectangle Diagonal Angle°
fd 400                         ; Forward = 400 pt
bk 800                         ; Back = 800 pt
fd 400                         ; Forward = 400 pt
rt A                           ; Right = Rectangle Diagonal Angle°
pu                             ; Pen Up
bk H / 2                       ; Back = Rectangle Height / 2
lt 90                          ; Left = 90°
fd W / 2                       ; Forward = Rectangle Width / 2
pd                             ; Pen Down
circle L * 2                   ; Draw Left Circle (Radius = Rectangle Diagonal Length)
rt D - A                       ; Right = 180° - Rectangle Diagonal Angle°
fd L                           ; Forward = Rectangle Diagonal Length
circle L * 2                   ; Draw Right Circle (Radius = Rectangle Diagonal Length)
pc [5]                         ; Pen Color = Red
lt D - A                       ; Left = 180° - Rectangle Diagonal Angle°
fd S                           ; Forward = Rhombus Side Length
lt Z                           ; Left = Rectangle Diagonal Angle° * 2
fd S                           ; Forward = Rhombus Side Length
rt D + Z                       ; Right = 180° + Rectangle Diagonal Angle° * 2
fd S                           ; Forward = Rhombus Side Length
lt Z                           ; Left = Rectangle Diagonal Angle° * 2
fd S                           ; Forward = Rhombus Side Length

1

Python 3.5 + Tkinter、433または515バイト

色なし(433バイト):

from tkinter import*
def V(a,b):S=500;Y,Z=S+a,S-b;M=(a**2+b**2)**0.5;D=Tk();C=Canvas(D);B=C.create_oval;X=C.create_line;B(S+M,S-M,S-M,S+M);B(Y-M,Z+M,Y+M,Z-M);X(Y,Z,S,S);C.create_rectangle(Y,S,S,Z);Q=-((Z-S)/(Y-S))**-1;U,V=(Y+S)/2,(Z+S)/2;X(U+M,V+M*Q,U-M,V-M*Q);P=[(Y,Q*(Y-U)+V),(((Z-V)/Q)+U,Z)][a>b];L=[(S,Q*(S-U)+V),(((S-V)/Q)+U,S)][a>b];X(S,S,P[0],P[1]);X(Y,Z,P[0],P[1]);X(Y,Z,L[0],L[1]);X(S,S,L[0],L[1]);C.pack(fill=BOTH,expand=1)

色付き(515バイト):

from tkinter import*
def V(a,b):S=500;t='blue';Y,Z=S+a,S-b;M=(a**2+b**2)**0.5;D=Tk();C=Canvas(D);B=C.create_oval;X=C.create_line;B(S+M,S-M,S-M,S+M,outline=t);B(Y-M,Z+M,Y+M,Z-M,outline=t);X(Y,Z,S,S,fill=t);C.create_rectangle(Y,S,S,Z);Q=-((Z-S)/(Y-S))**-1;U,V=(Y+S)/2,(Z+S)/2;X(U+M,V+M*Q,U-M,V-M*Q,fill=t);P=[(Y,Q*(Y-U)+V),(((Z-V)/Q)+U,Z)][a>b];L=[(S,Q*(S-U)+V),(((S-V)/Q)+U,S)][a>b];o='orange';X(S,S,P[0],P[1],fill=o);X(Y,Z,P[0],P[1],fill=o);X(Y,Z,L[0],L[1],fill=o);X(S,S,L[0],L[1],fill=o);C.pack(fill=BOTH,expand=1)

2つのコンマ区切りの数値として入力を受け取る名前付き関数。出力は別のウィンドウに表示されるため、完全な出力を表示するにはサイズを変更する必要があります。以下に、サンプルのカラー出力を示しV(180,130)ます。

サンプル出力


0

SmileBASIC、280バイト

INPUT W,H
W=MAX(W,H)/4H=MIN(W,H)/4D=SQR(W*W+H*H)N=D+W
M+D+H
GBOX D,D,N,M,#RED
GCIRCLE D,M,D
GCIRCLE N,D,D
GLINE D,M,N,D
X=D+W/2Y=D+H/2A=ATAN(W,H)E=D*H/W/2S=E*COS(A)T=E*SIN(A)GLINE X-S*9,Y-T*9,X+S*9,Y+T*9GCOLOR-#L
GLINE D,M,X-S,Y-T
GLINE D,M,X+S,M
GLINE N,D,X+S,Y+T
GLINE N,D,X-S,D

(スクリーンショット/説明は近日中に公開されます)背景色は黒、長方形は赤、円と線は白、菱形は黄色です。

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