|
|
2011/10/20(Thu) 14:57:07|NO.42547
HSPで円を描くプログラムをlineを使って描いてみました。
#include "hspmath.as"
#define WIN 700
#define PITCH 1
screen 0,win,win,,000,000
color 255,000,000
circle 000,000,WIN,WIN,0
color 000,000,000
for angle,0,360,PITCH
line WIN/2,WIN/2,1.0*WIN/2+1.0*WIN/2*cos(deg2rad(angle)),1.0*WIN/2-1.0*WIN/2*sin(deg2rad(angle))
await 1
next
circle命令で書いた物と比較するといくらか円から線がはみ出てしまっています。
floorで丸めてもはみ出てしまうのですがこれはなにか理由があるのですか?
教えていただけたらありがたいです。よろしくお願い致します。
|
|
2011/10/20(Thu) 16:32:46|NO.42548
そもそも中心がおかしくない?
|
|
2011/10/20(Thu) 18:18:08|NO.42549
数学的には中心座標(350,350)の半径350で合っていますけど、
画面上のピクセルは点ではなく面なので、解答は他にも何パターンか考えられますよね
円の大きさが(0,0)〜(699,699)で、
左端右端上端下端がそれぞれピクセルの中心を通ると仮定するなら、半径は349.5なので
↓みたいな計算が一番正確な円になりますが、これでもcircleとはちびっと差が出ますね^^;
#include "hspmath.as"
#define WIN 700
#define PITCH 1
screen 0, win, win, , 000, 000
color 255, 000, 000
x1 = 000
x2 = WIN
y1 = 000
y2 = WIN
circle x1, y1, x2, y2, 0
sizeX = abs( x2 - x1 ) - 1
sixeY = abs( y2 - y1 ) - 1
// 中心座標
cX = 0.5f * sizeX
cY = 0.5f * sixeY
// 半径
rX = 0.5f * sizeX
rY = 0.5f * sixeY
color 000, 000, 000
for angle, 0, 360, PITCH
x = round( cX + rX * cos( deg2rad( angle ) ) )
y = round( cY - rY * sin( deg2rad( angle ) ) )
line cX, cY, x, y
next
|
|
2011/10/20(Thu) 22:34:22|NO.42556
circle命令で描画する円も少し小さいようです。
ウィンドウのサイズが変数WIN*WINならば、
右端のx座標はWIN-1、下端のy座標はWIN-1になるはずです。
その状態でcircle命令の第3引数と第4引数にWINを指定するなら、
円は右と下がウィンドウの外に出るはずです。
ただ、circle命令で第3引数と第4引数を1大きくして試してみましたが、
それでも線で描いた円の方が少し大きいようです。
|
|
2011/10/21(Fri) 04:14:31|NO.42564
lineの始点と終点を逆にするとはみ出ないような?
終点は描画されないので、元のやり方だと真ん中が空白になってますね。
間違えやすいけど最初の二つが終点です。
line 終点X座標, 終点Y座標, 始点X座標, 始点Y座標
>これはなにか理由があるのですか?
GDIの仕様じゃないかと。
|
|
2011/10/21(Fri) 08:50:35|NO.42566
>>HK2さん
HSPに限ったことじゃないですけども、何気に左上と右下を指定する系の命令って、
言語や関数によって解釈がバラバラなんですよね
座標(0,0)-(100,100)に内接する円の直径は100なので、
100ピクセルの円が描画される、というのもひとつの解釈です
(一般に「右下座標 − 左上座標 = サイズ」という仕様のほうが
計算量が小さくなりやすいので、この仕様でほぼ統一されてる言語もあります)
ただ、boxfとかはきっちり101ピクセルの大きさになるので、
確かに人によっては混乱するかも
|
|
2011/10/21(Fri) 15:17:53|NO.42569
皆様教えていただきありがとうございます。
lineの始点と終点を入れ替えた所、ずれる事が無くなりました。
コレで行こうと思います。ありがとうございました。
#include "hspmath.as"
#define WIN 700
#define PITCH 1
screen 0,win,win,,000,000
color 255,000,000
circle 000,000,WIN,WIN,0
color 000,000,000
for angle,0,360,PITCH
line 1.0*WIN/2+1.0*WIN/2*cos(deg2rad(angle)),1.0*WIN/2-1.0*WIN/2*sin(deg2rad(angle)),WIN/2,WIN/2
await 1
next
|
|