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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1020
DoubleQuote円を描くプログラムについて6解決


DoubleQuote

リンク

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

そもそも中心がおかしくない?



TTRUKO

リンク

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



HK2

リンク

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大きくして試してみましたが、
それでも線で描いた円の方が少し大きいようです。



pizza

リンク

2011/10/21(Fri) 04:14:31|NO.42564

lineの始点と終点を逆にするとはみ出ないような?

終点は描画されないので、元のやり方だと真ん中が空白になってますね。

間違えやすいけど最初の二つが終点です。
line 終点X座標, 終点Y座標, 始点X座標, 始点Y座標

>これはなにか理由があるのですか?
GDIの仕様じゃないかと。



TTRUKO

リンク

2011/10/21(Fri) 08:50:35|NO.42566

>>HK2さん
HSPに限ったことじゃないですけども、何気に左上と右下を指定する系の命令って、
言語や関数によって解釈がバラバラなんですよね

座標(0,0)-(100,100)に内接する円の直径は100なので、
100ピクセルの円が描画される、というのもひとつの解釈です
(一般に「右下座標 − 左上座標 = サイズ」という仕様のほうが
計算量が小さくなりやすいので、この仕様でほぼ統一されてる言語もあります)

ただ、boxfとかはきっちり101ピクセルの大きさになるので、
確かに人によっては混乱するかも



DoubleQuote

リンク

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



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