コンソールの文字を使用して、特定の半径の円を作成する方法を見つけます。フォント名とサイズを指定してください。また、出力の例を少なくとも1つ提供してください。
例えば:
入力:
3
出力:
******
** **
** **
* *
** **
** **
******
...まあ、半径3の「手描き」「円」よりも見栄えが良いもの。
ボーナス質問:楕円。:)
コンソールの文字を使用して、特定の半径の円を作成する方法を見つけます。フォント名とサイズを指定してください。また、出力の例を少なくとも1つ提供してください。
例えば:
入力:
3
出力:
******
** **
** **
* *
** **
** **
******
...まあ、半径3の「手描き」「円」よりも見栄えが良いもの。
ボーナス質問:楕円。:)
回答:
function c(r){var f=1.83;var e=2*Math.PI/(r*r*r*r*r);var s=r*2+1;var g=Array(s);for(var i=0;i<s;i++){g[i]=Array(Math.round(s*f))};for(var i=0;i<=2*Math.PI;i+=e) {var x=Math.round(f*r*Math.cos(i)+f*r);var y=Math.round(r*Math.sin(i))+r;g[y][x]=1;}for(var j=0;j<g.length;j++){for(var i=0;i<g[j].length;i++)document.write((g[j][i]==1)?'*':' ');document.writeln()}}
http://jsfiddle.net/YssSb/3/(f
は、行の高さ/フォントの幅の比率の修正係数です。正方形のフォント設定を使用する場合、つまり、line-height = font-sizeを設定すると、次のように設定できますf = 1で「正方形」の円を取得します。またはf
、楕円に対して任意に設定します。)
3の出力(興味深いことに、誤ってOPとまったく同じ形状)、5、15:
******
** **
** **
* *
** **
** **
******
*********
*** ****
*** **
** **
* *
* *
* *
** **
*** **
*** ****
*********
***************
****** ******
**** *****
*** ***
*** ***
*** ***
** **
** **
** **
** **
** **
* *
** **
* *
* *
* *
* *
* *
** **
* *
** **
** **
** **
** **
** **
*** ***
*** ***
*** ***
**** *****
****** ******
***************
Bresenham-アルゴリズムには2つの主要なポイントがあります。
どうやってするの:
2 1 DCBABCD GFE | EFG IJ y | ---- JI GJ | / JG F | / | F DE | r / | ED C | / | C B 4 | / | B 3 A + ------- A B 4 'x B 3' CC DE ED FF GJ JG IJ JI GFE EFG DCBABCD 2'1 '
これはゴルフのコードではありませんが、既存のソリューションの一番上にある数字はすべてそれを考えさせてくれたので、私のソリューションをゴルフすることに無駄な時間を費やしました。したがって、私も上に無駄な数を追加しました。Piを丸めた11倍です。
object BresenhamCircle extends App {
var count = 0
val r = args(0).toInt
// ratio > 1 means expansion in horizontal direction
val ratio = args(1).toInt
val field = ((0 to 2 * r).map (i=> (0 to 2 * r * ratio).map (j=> ' ').toArray)).toArray
def square (x: Int, y: Int): Int = x * x + y * y
def setPoint (x: Int, y: Int) {
field (x)(y*ratio) = "Bresenham"(count)
field (y)(x*ratio) = "Bresenham"(count)
}
def points (x: Int, y: Int)
{
setPoint (r + x, r + y)
setPoint (r - x, r + y)
setPoint (r + x, r - y)
setPoint (r - x, r - y)
}
def bresenwalk () {
var x = 0;
var y = r;
val rxr = r * r
points (x, y);
do
{
val (dx, dy) = { if (math.abs (rxr - square ((x+1), y)) < math.abs (rxr - square (x, (y-1))))
(1, 0)
else
(0, -1)
}
count = (count + 1) % "Bresenham".length
x += dx
y += dy
points (x, y)
}while ((x <= y))
}
bresenwalk ()
println (field.map (_.mkString ("")).mkString ("\n"))
}
フォントの質問は、サイトのウェブサーバーとブラウザの設定によって決まります。今、私が探しているのは
'Droid Sans Mono',Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif
フォントサイズは12pxです。あなたが私に尋ねればかなり役に立たない情報ですが、誰がしますか?
ボーナス:楕円とサンプル出力:
呼び出しは
scala BresenhamCircle SIZE RATIO
例えば
scala BresenhamCircle 10 2
s e r B r e s
h n e e n h
e m a a m e
e r r e
m m
h a a h
n n
s e e s
e e
r r
B B
r r
e e
s e e s
n n
h a a h
m m
e r r e
e m a a m e
h n e e n h
s e r B r e s
A ratio of 2 will print a circular shape for most fonts which happen to be about twice as tall than wide. To compensate for that, we widen by 2.
# As smaller value than 2 only 1 is available:
scala BresenhamCircle 6 1
erBre
aes sea
ah ha
e e
es se
r r
B B
r r
es se
e e
ah ha
aes sea
erBre
# widening it has more freedom:
scala BresenhamCircle 12 5
s e r B r e s
a h n e e n h a
B m m B
e r r e
e s s e
B r r B
a m m a
h h
n n
s e e s
e e
r r
B B
r r
e e
s e e s
n n
h h
a m m a
B r r B
e s s e
e r r e
B m m B
a h n e e n h a
s e r B r e s
Intのratioパラメータを制限してシンプルにしていますが、フロートを許可するように簡単に拡張できます。
2つの必須改行を含む172文字。円錐曲線にBresenhamアルゴリズムを使用(除算または乗算なし)。正方形フォントの円のみを出力しますが、階段効果を免除する必要があります(つまり、常に同じ幅です)。
y=input();t=[y*[' ']for x in range(y)];x=0;y-=1;p=3-2*y
while x<=y:t[x][y]=t[y][x]='*';n,y=((x-y+1,y-1),(x,y))[p<0];p+=4*n+6;x+=1
for s in t[::-1]+t:print"".join(s[::-1]+s)
それほどきれいではありませんが、まあ、私はそれを試してみると思いました。
****
* *
* *
* *
* *
* *
* *
****
********
*** ***
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
*** ***
********
編集:タイプミス、加算を除算に置き換え。
私は「ボーナス質問」に行って、楕円を描くためにキャラクターのアスペクト比を利用させました:)
($w)=@ARGV;for$x(-$w..$w){$p.=abs($x*$x+$_*$_-$w*$w)<$w?'*':$"for(-$w..$w);$p.=$/;}print $p;
出力例:
>perl circle.pl 3
***
* *
* *
* *
* *
* *
***
>perl circle.pl 5
*****
* *
* *
* *
* *
* *
* *
* *
* *
* *
*****
>perl circle.pl 8
*****
** **
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
* *
** **
*****
g n=map(zipWith(?)f.repeat)f where x?y|abs(x^2+y^2-n^2)<n='*'|0<1=' ';f=[-n..n]
main=interact$unlines.g.read
これは、すべてのポイントでx²+y²-r²<nかどうかをチェックすることで機能します。これが当てはまるすべての点は星であり、他のすべての点は空白です。
$エコー3 | runhaskell circ.hs *** * * * * * * * * * * *** $エコー10 | runhaskell circ.hs ******* ** ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** ** *******
大きな例については、こちらをご覧ください:http : //www.ideone.com/t042u
フォントが正方形の場合、このコードは円を作成します。フォントの高さ/幅の比率がわかっている場合は、名目上の楕円を生成するように変更するのはかなり簡単です。
import math
r=input()
d=2*r+1
c=[' '*d]*d
for a in xrange(9*d):f=math.pi*a/r/9; x=int(r+r*math.sin(f)+.5);y=int(r+r*math.cos(f)+.5);c[y]=c[y][:x]+'*'+c[y][x+1:]
for s in c:print s
例:
4:
*****
** **
** **
* *
* *
* *
** **
** **
*****
7:
*****
** **
** **
** **
** **
* *
* *
* *
* *
* *
** **
** **
** **
** **
*****
#include<math.h>
main(){int r=10,c=r*2+1,q=c*c,d;for(;q--;)d=hypot(r-q%c,r-q/c),printf("%c%s",d>r-4&&d<=r?42:32,q%c?"":"\n");}
結果:
*********
*************
***************
*****************
****** ******
***** *****
***** *****
**** ****
**** ****
**** ****
**** ****
**** ****
**** ****
**** ****
***** *****
***** *****
****** ******
*****************
***************
*************
*********