HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
1001
窓口psetで円を書く5解決


窓口

リンク

2009/10/1(Thu) 08:05:23|NO.28074

下のスクリプトでpsetにて円を書いてみたのですが
なぜか、きれいな円に成らずに
ドットの間隔が開いてしまっているようです。
何か解決策は無いでしょうか?


#define N 360 #define posX 120 #define posY 120 #define R 100 redraw 0 repeat n t = M_PI * 2.0 * cnt / n x = cos(t) * R + posX : y = sin(t) * R + posY pset x,y loop redraw 1



この記事に返信する


トホホッティー

リンク

2009/10/1(Thu) 08:33:17|NO.28077


#define N 360 #define posX 120 #define posY 120 #define R 100 redraw 0 repeat n*2 t = M_PI * cnt / n x = cos(t) * R + posX : y = sin(t) * R + posY pset x,y loop redraw 1

でできました。



窓口

リンク

2009/10/1(Thu) 09:11:20|NO.28078

>>トホホッティー様
有難うございます。
解決しました。



SYAM

リンク

2009/10/1(Thu) 11:05:47|NO.28079

ループ1回ごとのtの変化量(および、ループ回数)は、半径から算出しないといけません。でないと、半径を変えるとまた途切れてしまいます。
円周の長さが伸びたら、描画するドットの数が増えないとおかしいですね。



M_PI = 3.1415927 #define N 360.0 #define posX 120.0 #define posY 120.0 #define R 100.0 #define DENSITY 8 redraw 0 repeat R*M_PI*2*DENSITY t = double(cnt) x = R * cos(t/DENSITY)+0.5 + posX : y = R * sin(t/DENSITY)+0.5 + posY pset x,y loop redraw 1

定数DENSITYは、tの変化量を調整するものです。8以上あればおよそどんな半径でも途切れにくくなるでしょう。


座標に0.5を足しているのは、実数を座標(整数)にするときに小数点以下を切り捨てではなく四捨五入にするためです。
小数点以下切捨てだと、たとえば半径と中心座標が整数だったときに右と下(sin(),cos()がちょうど1になるところ)に1ドットの出っ張りができてしまいます。



窓口

リンク

2009/10/2(Fri) 16:55:05|NO.28106

>>SYAMさん
ありがとうございます。
解決をチェックした後でその事に気づいて、色々試行錯誤した結果 N を 半径*7で求める方法に落ち着いていたのですが。
そんな方法もあるんですね。



SYAM

リンク

2009/10/3(Sat) 00:01:21|NO.28110

別解。

r=100 posx = ginfo_winx/2 posy = ginfo_winy/2 repeat r/sqrt(2) : x=cnt y = sqrt(r*r-x*x)+0.5 pset posx+x, posy+y pset posx-x, posy+y pset posx+x, posy-y pset posx-x, posy-y pset posx+y , posy+x pset posx+y , posy-x pset posx-y , posy+x pset posx-y , posy-x loop

たとえばX方向に1ドットずつ描くと、X方向の変化量をY方向の変化量が上回った時点で線が途切れてしまいます。
だったら、途切れない範囲だけ描いたものを8つ繋げたら、きれいに円になりますね。



ONION software Copyright 1997-2023(c) All rights reserved.