トップページ⇒tech
116コメント42KB

GUIの作り方

■ このスレッドは過去ログ倉庫に格納されています
00011NGNG
GUIの実装についてのスレです。
0002デフォルトの名無しさんNGNG
         ∧_∧
         < `ш´>  >>1 お前の感じている感情は精神疾患の一種だ。
       _φ___⊂)     しずめる方法は俺が知っている。俺に任せろ
      /旦/三/ /|
    | ̄ ̄ ̄ ̄ ̄|  |
    | 流鬱百円 |/
0003デフォルトの名無しさんNGNG
ハァ?
0004デフォルトの名無しさんNGNG
>>1
関連リンクすら貼らずにスレを立てる人間は、
目立ちたがりのくせに能力は著しく人に劣る無能者
0005デフォルトの名無しさんNGNG
自分以外の人間を指す言葉「ヒト」を、「他人」ではなく「人」と書いてしまう奴は、
聞きかじった言葉を深く考えずに右から左に流す知ったかぶりの無教養。

だが>>1よりはマシ。
0006デフォルトの名無しさんNGNG
/三/ /| >>6ゲトずざー
    | ̄ ̄ ̄ ̄ ̄| 
0007デフォルトの名無しさんNGNG
>>5
「ヒト」を「他人」と書くのはただの当て字なので、
表現の一つとして当て字好きな漫画などでよく使われるが標準的なものではない
http://dictionary.goo.ne.jp/search.php?MT=%A4%D2%A4%C8&kind=jn&mode=0&base=1&row=3

聞きかじった言葉を深く考えずに右から左に流す知ったかぶりの無教養。
だが>>1よりはマシ。
0008デフォルトの名無しさんNGNG
イベントドリヴン&heart;
0009デフォルトの名無しさんNGNG
●5気圧防水機能 ●「テレメモ」機能:電話番号を最大30件メモリー(名前部:8文字、電話番号部:16桁)
 ●ワールドタイム:世界50都市(27タイムゾーン)の時刻表示、NOCコード表示、サマータイム設定機能付き
 ●ストップウオッチ(1/100秒、60分計、スプリット付き) ●時刻アラーム2本(曜日設定が可能) ●ELバックライト(残照機能付き)
0010デフォルトの名無しさんNGNG
9げっと
0011デフォルトの名無しさんNGNG
GUIを「ぐい」と読むのはダメ人間ですか?
0012デフォルトの名無しさんNGNG
>>5
人というのは他人ではなく人類を示しているということ。
聞きかじった言葉を深く考えずに右から左に流す知ったかぶりの無教養。
だが>>1よりマシ。
0013デフォルトの名無しさんNGNG
日本酒ならぐい飲みでやりたいものだ。
0014デフォルトの名無しさんNGNG
>>8
sが抜けてる罠。
0015デフォルトの名無しさんNGNG
VBなら楽勝で作れますよ
0016デフォルトの名無しさんNGNG
Delphiなら楽勝で作れますよ
00171NGNG
このスレはGUIに必要な関数を勉強していくスレにしたいと思っています。
関連する情報は必要と思った人が、該当する箇所をリンクしてください。
0018デフォルトの名無しさんNGNG
http://www.google.co.jp/search?hl=ja&lr=&ie=UTF-8&oe=UTF-8&q=GAY&spell=1
0019デフォルトの名無しさんNGNG
button .b -text {あぼーん} -command exit
pack .b
0020デフォルトの名無しさんNGNG
ttp://www.google.com
0021デフォルトの名無しさんNGNG
まず、リストとキューを実装する。
あとは力技で書くべし!
0022デフォルトの名無しさんNGNG
>>1
は?GUI?
そんなのドラッグアンドドロップで一発だぜ。
0023デフォルトの名無しさんNGNG
>>22
アホか。
だが>>1よりはマシ。
00241NGNG
グラフィックスプログラミング入門 中山茂 技報堂出版
グラフィックスプログラミング応用
という本を買ったのでまず参考にします。
00251NGNG
ドロー関数

直線を描く
現在位置から指定の点まで直線を引く
現在位置から指定の長さの直線を引く
現在位置を指定の点に移動する
現在位置を指定の長さだけ移動する
長方形を描く
円を描く
円弧を描く
楕円を描く
多角形を描く
線幅と線のスタイルを設定する
00261NGNG
フィル関数

長方形を描いて内部を塗りつぶす
3次元の直方体を描いて前面を塗りつぶす
多角形を描いて塗りつぶす
扇形を描いて塗りつぶす
楕円の扇型を描いて塗りつぶす
楕円を描いて塗りつぶす
閉じた領域を塗りつぶす
塗りつぶしパターンと色を設定
ユーザー定義の塗りつぶしパターンと色を設定
0027デフォルトの名無しさんNGNG
いつからそのしょうもない図形描画機能がGUIと呼ばれるようになったんだ?
0028デフォルトの名無しさんNGNG
たしかに UI では無いな。
0029デフォルトの名無しさんNGNG
>1
TRONで言うとディスプレイプリミティブっていうやつだな。
http://www.sakamura-lab.org/TRON/BTRON/BTRON3/os_spec/dp/dp.html

この上にウィンドウマネージャーを載せるのがセオリーだ。

で、グラフィックス描画について語りたいのか、ウィンドウ管理手法について語るのか
どっちよ?
それとも単にアプリケーションでGUI部品を使う方法を知りたいだけか?
0030デフォルトの名無しさんNGNG
ディスプレイプリミティブによるユーザの描画と、
ウィンドウマネージャーによるシステムの描画は
同等?
0031デフォルトの名無しさんNGNG

プログラマはGUIのセンスが悪い奴が多い


ダイアログデザインなんてダサダサだし


カッコいいアイコンなんて作れんだろ
0032デフォルトの名無しさんNGNG
>>31
作れます。以上。
0033デフォルトの名無しさんNGNG
>>31
と、言うかGUIの本質は視覚的、直感的ななわかりやすさであってかっこよさではない。
使いやすいユーザインターフェースというのは納得いくがかっこいいユーザインターフェース、なんじゃそらと。
0034デフォルトの名無しさんNGNG

「窓の手」


非常に有名で使い勝手もいいがGUIがダサダサソフトの代表格


0035デフォルトの名無しさんNGNG
>>34
で、具体的にどこが悪いんですか?
それを話し合うスレっしょ?
ただダサいなら女子中学生でも言えるぞ。
0036デフォルトの名無しさんNGNG
かこいいアイコンは使いにくいことが多いので倫理的につくれません
0037デフォルトの名無しさんNGNG
センス無い奴はいくら頑張ってもたかがしれてるので、

GUI部分はセンスある奴にデザインを委託する
0038デフォルトの名無しさんNGNG
>>34
Winカスタマイザー
http://www.panda.co.jp/tweaknow/img/shot/scr_wc2003_05.jpg

窓の手と似たようなソフトだが、GUIにはこだわっている
0039デフォルトの名無しさんNGNG
ぐちょぐちょ うんこ いっとく?
0040デフォルトの名無しさんNGNG
もしかして、>>1 は、GUI と GDI を、勘違いしているのののののののののの
ののののののののののののののののののののののののののののののの
ののののののののののののののののののののののののののののののの
ののののののののののののののののののののののののののののののの
ののののののののののののののののののののののののののののののの
ののののののののののののののののののののののののののののののの
ののののののののののののののののののののののののののののののの
ののののののののののののののののののののののののののののののの
ののののののののののののののののののののののののののののののの
ののののののののののののののののののののののののののののののの
ののののののののののののののののののののののののののののののの
のののののののののののののののののののののののののののののの?
0041デフォルトの名無しさんNGNG
窓の手はコントロールの配置一つとってみても、スカスカだったり
又はその逆だったり。同じタブ内で並んでいるチェックボックスの
間隔くらい揃えてもいいと思うがバラバラ

中身がいくら丁寧に作りこんであってもGUIがいい加減だと中身もい
い加減と思われると思われ
0042デフォルトの名無しさんNGNG
GDIって三菱の車のエンジンか?
0043デフォルトの名無しさんNGNG
逆に中身がヘタレでもGUIがそれなりのもんだったら、素人は騙せると思われ
0044デフォルトの名無しさんNGNG
ぐい生とかいうビール昔なかったか?
それのこと言ってんだろ?>>1
004540NGNG
>>42
GDI → Graphics Device Interface
GUI → Graphical User Interface
0046デフォルトの名無しさんNGNG
なぜこの時間にこんなスレが伸びてるの?
グラマラスユーザーインターフェース
0047デフォルトの名無しさんNGNG
どのタブも同じような量よりメリハリついてるほうが覚えやすいじゃん
上っ面だけじゃなく心理面も考えなくちゃね
0048デフォルトの名無しさんNGNG
現在のスレ状況

GUI と GDI の違い。
窓の手の GUI の話題。
勘違いに気づいた >>1 の逃走。
0049デフォルトの名無しさんNGNG
もしも、今日会社で
「GUI」って言う言葉を誰かが言ったら
笑ってしまうよきっと・・・
俺のほかにもニヤっとしてるやついたら
「てめーも朝から2chかよ」
と、言ってやりたい

グリコの社長 誘拐事件 いつだっけ?
0050デフォルトの名無しさんNGNG
FreeDownload>>1
0051デフォルトの名無しさんNGNG
デザイナとかに自分の作ったソフトのGUIデザインを頼みたい時、
どうしたらいい?

つーか、デザイナ仲介サイトとかない?無料もしくは格安で依頼したい
0052デフォルトの名無しさんNGNG

  ヽ,,.'"                      ,           ゙、
:::::::;:::',i゙i、,_   ,.'  ,     ,   .,  ,  .:,.' .:    ',..             、 ゙、
. :/::::::}r'、 `゙ ,'  .,'  .: ,' ,,、-/‐,ッ、:::/..:;:  .. l l;:..;.         ',. ',
./:: :::/::. ヽ i  l .::l:,、r'゙ ::,.'i../,'.:::,'i.:::;,'. .:,':''7i'it、l!:. ,       i,. !
'.::::::/:l::::::..  l.   l. ::;r':i l .:::,' l  l:::,' !::,',' .::;': /,'/ !:l'l;::. i  ,' l:.  i  !!,'
::::::/::!:',::::::::::l.   ::',/i l:|. l::;;!、ェ、,,l:i l::,'.!:..::,,'::/ / l:i l:゙:.,' /:. l::  | j.l'
::::,'!::::'::゙、:::::::!   ::::i、l. 'l,,;ン',,、ぃ,゙ヾ l:l l::::/,ソ.r''"ヾl, l:::/ン゙l:::: l::: i /l'
:::j ',:::::::::::::::::!. ! :::::l、゙,,ilr' ,il゙ _,,!i.   'l l::/ '  ,r゙゙'i;.ヾlン''/: l:::: ,'l:: ,'j ./ l
::i. ゙、::::::::r''''!. ! :::::!'''゙li. l;:゙'illlr;::!   ゙    i:!、r:'l. ;シ./::: .!:,r!,':;/,',.'l j
:l   ゙、:::i゙''、゙!. ! ::::|.  ゙. 'r,ン::::ソ       l;: ''゙:;' ' ,':::: .r' /ツ::ジ j j
:|.    ヾ゙、 '、i. ! ::::!   ''‐゙゙'='゙-       . ゞ-'',、 i:::::: j '"!:i::  j .,'
:l     `゙' 、', i :;::l          r‐‐‐-,.  ̄`  .j:::: ,'  l:,i:  ,' /
';!       ',.i. ';:!,_          |   /      , ':::: ,'  ,ソ!: ,'./  いっしょに氏のっ!>>1
,ヽ       ゙、, ';ヘ!ヽ、       ',. ,.'    ,、‐l:l::::: /  /.,' ,'/
:!          ',.',',l,_  ゙'ヽ 、,,_.  ゙'" ,、 ‐'"  ,',i::: /   / ,.シ
':',         '、',゙、゙''ー- 、、、、゙゙i,゙''''"     /'i::/     /,.'
ヾ、     ,,、 - '゙::ヾ,ヽ:...:...:...:...:...:{          ,'/    ,ン゙
   ,、- '"゙~ヽ、:...:...:..::゙、:...:...:...:...:...:.lヽ、 _     /
. 、r''ヽ、     ヽ:...:...:...:...:...:...:...:...:...:...:.゙j ゙''‐ 、 '
0053bloomNGNG
http://homepage.mac.com/ayaya16/
0054デフォルトの名無しさんNGNG
>>1は、本気だったんだ。ふざけていたわけじゃない。
ゲームが作りたくて、グラフィック関連を勉強していた。
だけど、なかなか思うように理解できなかった。
自分と同じところで、悩んでいる人々がいるかもしれないと思ったんだ。
それで、このスレを立てた。
だけど、結局はこんな事になってしまった。

>>1 は、コンクリートジャングルから、逃げるように走り出した。
激しい雨が降りだし、>>1 に、たたきつける。
人々の罪のない笑顔すら >>1 には、自分をあざ笑っているように見えた。
人気のいない所へ逃げようと、山に逃げ込んだ。
>>1 は、朝になれば何事もなかったようになるはずだと考えていた。
だが、なぜか >>1 のスレは急浮上。

>>1 よ。 誰にでも、間違いはある。帰って来い。
0055デフォルトの名無しさんNGNG
漏れはGDIで挫折したけどDirectXはすんなりうまくいったよ

……とかいう体験談を書けばいいのか?
0056デフォルトの名無しさんNGNG
>>49
それじゃGYI
0057デフォルトの名無しさんNGNG
ここ GDI のスレ? スレ違いだったらゴメノ。
例えば Windows の RegisterClassEx やら CreateWindowEx て,
必要なパラメータがやたらと多くて面倒臭いっす。
だから builder パターンかなんかをを適用して (デザパタあんまし分かってない),

 ButtonBulder *bbuilder = new ButtonBuilder();
 bbuilder->setParam( hoge ); // いろいろ設定
  ... いろいろ設定 ...
 mainForm->addComponent( bbuilder->build() ); // フォームに追加
 bbuilder->setTop( bbuilder->getTop() + height ); // ちょこっと修正
 mainForm->addComponent( bbuilder->build() ); // フォームに追加
  ... 以下,"ちょこっと修正" と "フォームに追加" が繰り返される ...

これが綺麗かなと思ったけど,こんなやり方はあんまし見ないスね。
この欠点つーと,どんなもんが挙げられますですか?
0058デフォルトの名無しさんNGNG
アプリのアイコンをデザイナーに外注したこと有る香具師いる?
何円ぐらい取られるのかな?
0059デフォルトの名無しさんNGNG
新しいUIの仕様作りました。

eXtream User Interface (XUI)

XUIは、従来のUIを優良的に進化させたものであり、
XUIに準拠することにより、ユーザーにあらゆる操作が
生産的・感覚的であることを実感させることが出来ます。
0060デフォルトの名無しさんNGNG
直線を描く場合、傾きによって場合分けする。
傾きが0から1までを、まず考える。
点(0,0)から点(5,3)までの直線を描く場合、
傾きは3/5で、
Xが1増えると、Yは判定によってそのままか1増える。

X 計算上のY 判定数 判定数-1/2 画面上のY  
0  0      0    -1/2    0     
1  3/5     3/5 1/10    1
2 6/5     1/5 -3/10 1
3 9/5 4/5 2/10 2
4 12/5 2/5 -1/10 2
5 15/5 5/5 5/10 3

判定数というのは前に画面上のYと、次の計算上のYとの差になっている。
前の画面上のYが1増えていたときには、
前の判定数に3/5足した値から1を引いている。

表のように、判定数-1/2 が プラスかマイナスかで
画面上のYを1増やすかそのままか決めている。
四捨五入みたいな感じ。
0061デフォルトの名無しさんNGNG
判定数-1/2 をプログラムのために実数にしたい。
表を見れば、10掛けると良さそう。
これは、点(X0,Y0) から(X1,Y1)の直線だと、
2(X1-X0)を掛けることと同じらしい。
実際に上の例だと2(5-0)で10で合ってる。

それで、一般的に判定数-1/2の初めの値は、
-1/2 * 2(X1-X0) = -(X1-X0)
3/5足してるのは、傾きだから
(Y1-Y0)/(X1-X0) * 2(X1-X0) = 2(Y1-Y0)
前の画面上のYが増えていたときに判定数から1引くというのは補正値として、
1 * 2(X1-X0) = 2(X1-X0)
つまり、
判定数-1/2の初期値   -(X1-X0)
判定数-1/2の増分    2(Y1-Y0)
判定数-1/2の補正値   2(X1-X0)
0062デフォルトの名無しさんNGNG
>>59
おい、それは「仕様」ではなくて、「理想」というのだよ。
その文章から、どうやって実装すればいいんだ?
0063デフォルトの名無しさんNGNG
X  計算上のY  判定数   判定数-1/2  画面上のY  
0   0      0      -1/2     0     
1   3/5     3/5     1/10     1
2   6/5     1/5     -3/10    1
3   9/5     4/5     2/10     2
4   12/5     2/5    -1/10     2
5   15/5     5/5     5/10     3
0064デフォルトの名無しさんNGNG
直線・円を描く場合はDDAでOK
0065XUINGNG
Level 1
スクロールバーの端についてる[▲]や[▼]のボタンをホイールクリックすると
それに応じて一番上や一番下に瞬間的に移動できる。
0066デフォルトの名無しさんNGNG
>>65
マウスのホイール使えよ
0067デフォルトの名無しさんNGNG
?
0068デフォルトの名無しさんNGNG
フリテンだよ
単に上がり牌が無くなっただけ待ちは変わらないからね
それが認められるなら、リーチ後に待ちが変えられる(1−4から1の国士っぽい待ち{単騎待ちとは言わない})というおかしなことになる
0069デフォルトの名無しさんNGNG
/* 点(XO, Y0)から点(X1, Y1)まで線を描く(仮)*/

関数 直線を描く(X0, Y0, X1, Y1, 色)
int X0,Y0,X1,Y1,色;
{
int E,x,y,i; /* E= 判定数-1/2 */

x = X0;
y = Y0;

E = -( X1 - X0 ); /* 初期値 */
for( i = 0; i <= ( X1 - X0 ); i++ ) {
点を描画する( x, y, 色 );
x += 1;
E += 2 * ( X1 - X0 ); /* 増分を足す */
if ( E >= 0 ) {
y += 1;
E -= 2 * ( Y1 - Y0 );    /* 補正値を引く */   
}
}
0070デフォルトの名無しさんNGNG
http://www.people.or.jp/~fussy/algo/algo1-1.htm
参考ウェブ
0071デフォルトの名無しさんNGNG
わけわからんスレになってるな…
0072デフォルトの名無しさんNGNG
つかね、GUIの実装の話するのかと思ったら描画アルゴリズムの実装のお勉強してるのね
マジな話、取り合えずそれは済んでるとこから始めない?
0073デフォルトの名無しさんNGNG
最近の、このスレの傾向。

>>1 の復帰を待つ。
>>51、>>58 スルーしてくれといわんばかりの話題を放出。
>>59 理想は高く、>>65 現実は激しく低く、>>66 で、あっさり撃沈。

それと、大きな声じゃ言えないけど・・・

実は >>1 は、すでに帰ってきてるんだよ。
非常に、ローレベルなアルゴズムを書き込んでる、彼の事だ。

だけど、なんか変なんだ。
グラフィクス関数って言うから、もっと違うものを想像してたんだけど、
直線のアルゴズムから、おっぱじめやがっているんだ。
それで、彼が買ったという >>24 の参考書をグッグって見たら・・・

Turbo C, Turbo C++ グラフィクスプログラミング入門 (1992/?)
Turbo C++、Borland C++グラフィックスプログラミング応用 (1994/12)
Java2 グラフィックスプログラミング入門―Java 2D,Swing,Java 3D対応 (1999/03)

こんなのが出てきた、たぶん、Turbo C関連の方だと思うんだけど、
初版の日付を見て欲しい。まだ、Win95すら発売されてない日付だ。
Win3.1は有っただろうけど、まだ、DOSの現役の頃だ。

願わくば >>1 が、「DOSのVRAMアドレスっていくつでしたっけ」なんて質問を、
しないこと願わんばかりだ。がんがれ >>1 よ。
0074デフォルトの名無しさんNGNG
早朝浮上
0075デフォルトの名無しさんNGNG
>DOSのVRAM

何を訳の分からんことを?
0076デフォルトの名無しさんNGNG
>>75
訳判らん質問の例えなんだから、判んなくて当然だと思うが。
0077デフォルトの名無しさんNGNG
いきなりレベル高いの出したら付いてこれないかと思ってね
ちなみにホイール使えって言うのは何?
クリックしてずらすやつ?生産的とはいえないね
0078デフォルトの名無しさんNGNG
ではレベルの高いのを出してください。
0079山崎渉NGNG
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
0080デフォルトの名無しさんNGNG
マイノリティ レポートのGUIを作ってくだちい。

個人的には使いづらいと思うが・・・まぁ未来的のGUIってことで。
0081デフォルトの名無しさんNGNG
なにがしたいの山崎渉
0082bloomNGNG
http://homepage.mac.com/ayaya16/
0083デフォルトの名無しさんNGNG
長方形を描く
は直線を4本描く。
0084デフォルトの名無しさんNGNG
OpenGL でウィジェット作ってみようかな。
008572NGNG
>84
実は同じ事言おうかどうか考えていた
0086デフォルトの名無しさんNGNG
直線の場合分けについて具体的に考える。
つぎのようなパターンで検証してみる。
(0,0)->(2,0)
(0,0)->(2,1)
(0,0)->(1,2)
(0,0)->(0,2)
(0,0)->(-1,2)
(0,0)->(-2,1)
(0,0)->(-2,0)
(0,0)->(-2,-1)
(0,0)->(-1,-2)
(0,0)->(0,-2)
(0,0)->(1,-2)
(0,0)->(2,-1)
0087デフォルトの名無しさんNGNG
(0,0)->(2,0), (0,2), (-2,0), (0,-2)
(0,0)->(2,1), (-2,1), (2,-1), (-2,-1)
(0,0)->(1,2), (-1,2), (1,-2), (-1,-2)
傾きによって上の三つのパターンに大別できる。



0088デフォルトの名無しさんNGNG
>85
日本語入力対応とかが面倒くさそう。Anthy とかを組み込んだら楽かな?
008972NGNG
IM とかまでは考えてなかったよ

GLUI の潔い仕様がインターフェースとしては結構気に入っているんだけど、
C++ 用のAPI としてはダサすぎ、ソース汚すぎでどうにかならんかと
んで、GLUTで使う代替GUIが欲しいかなとずっと思っていたり
0090デフォルトの名無しさんNGNG
イベントモデルの実装ってどんなのがあるのかな。
009172NGNG
「特定の表示系と分離された、C++での実装」でつか?

そゆもので良いものがあるなら、是非漏れも教えて欲しいでつ
0092デフォルトの名無しさんNGNG
>>91
作ったらどうだ?POSIXみたいなGUI API共通規格。
0093デフォルトの名無しさんNGNG
line(){
if(x0==x1 && y0==y1){
}
elseif(x0==x1){
}
elseif(y0==y1){
}
else{
if(dx >= dy){
}
else{
}
}
}
009472NGNG
>92
「特定の表示系や処理系と独立な共通規格」という意味でつか?

様々な表示系との統合とかなると結構抽象化は難しいし、
特定の処理系とも独立とかなると、それこそOpenGLみたいな
状態機械実装くらいしか方法は思いつかないんでつが、
経験的にはこれはオブジェクト指向ととても親和性が良くないし…

どなたかいいアイデアありませんか?
# こゆのって最初にアイデアがないと議論にならんのですよね…
# 漏れとしてはもっとコンパクトで現実的なとこから始めたいなぁ
0095デフォルトの名無しさんNGNG
円の描画は直線と同じように
y座標が一つ増えるたびに次にを打つx座標の点を考える。
yの初期値が0
xの初期値がR(半径)
yの次の点はy+1
xの次の点はxか、x-1になる。
xか、x−1かは、
その座標と原点との距離のどちらが半径に近いかで決める。
0096デフォルトの名無しさんNGNG
>>95
ネタかも知れんが…
その処理だけじゃ、開始点より45度までしか描けんぞ。
ま、90度地点から逆に描けば良いけどね。
F-BASICはそんな感じで円描いてた記憶があるなぁ。
0097デフォルトの名無しさんNGNG
>>96
円は対称なので、座標を反転/交換すれば一度に8点描けるわけだが。
0098デフォルトの名無しさんNGNG
>>97
そのことが、>>96の三行目に書いてあるんだと思うが。
0099デフォルトの名無しさんNGNG
>>98
なら最初から「ネタかも」などとは書かんだろうと。
0100デフォルトの名無しさんNGNG
実際の円と打つ点の誤差 は 平方根(X二乗 + Y二乗) - 半径(R)
だが、平方根を使わずに
  誤差=X二乗 + Y二乗 − R二乗
でもいいので、それを使う。
  点(X,Y+1)の誤差  = X二乗 + (Y+1)二乗 − R二乗
  点(X-1,Y+1)の誤差 = (x−1)二乗 + (Y+1)二乗 − R二乗
なので、点(X,Y+1)の誤差のほうが点(X-1,Y+1)の誤差より小さければ、(X,Y+1)を選択すれば良い。
つまり|点(X,Y+1)の誤差| − |点(X-1,Y+1)の誤差| < 0 なら(X,Y+1)
|点(X,Y+1)の誤差| − |点(X-1,Y+1)の誤差| > 0 なら(X-1,Y+1)
 |点(X,Y+1)の誤差| − |点(X-1,Y+1)の誤差| < 0 は
{点(X,Y+1)の誤差}二乗 − {点(X-1,Y+1)の誤差}二乗 < 0 と同じ。
因数分解して、上の式を代入して整理すると、
  (2X-1)(2X二乗-2X+2Y二乗+4Y+3-2R二乗)<O
(2X-1)は正の値だから両辺割って
  (2X二乗-2X+2Y二乗+4Y+3-2R二乗)<O で、これを判定式にする。
  (2X二乗-2X+2Y二乗+4Y+3-2R二乗)<O なら 打つ点は(X,Y+1)となり、
そうでないなら(X-1,Y+1)となる。
0101デフォルトの名無しさんNGNG
>>100
いろいろ間違ってるよ。
それと、X二乗って読み難い。
X*Xの方が計算もしやすいでしょ。
0102デフォルトの名無しさんNGNG
>>101
基本的に>>70のリンク先の方の書かれた説明を自分が理解しやすいように
勝手に書き換えているだけなので、リンク先のほうを見て、万が一間違いがあるなら
リンク先の方にメールをしてもらえませんか?
自分はアルゴリズムが合ってるとか間違ってるとか判断できません。
0103デフォルトの名無しさんNGNG
判定式のX,Yに実際に(r, 0)を代入してみると、-2X+3になる。
これがマイナスで、(X, Y+1)の点を選んだ場合、
判定式にそれを代入してみると、4Y+6だけ増加するので、それを足せば良い。
プラスで、(X-1, Y+1)の点を選んだ場合は、同様に-4X+4Y+10だけ増加するので
それを足す。
いままでの説明は8分円だったので、直線のときと同じように、対称性を利用して、
あとは中心の座標を足せば良い。
0104デフォルトの名無しさんNGNG
関数 円( x0, y0, r, color )
int x0,y0,r,color;
{
int x,y,F;
x = r;
y = 0;
F = -2 * r + 3;

while ( x >= y ) {
PSET( x0 + x, y0 + y, color );
PSET( x0 - x, y0 + y, color );
PSET( x0 + x, y0 - y, color );
PSET( x0 - x, y0 - y, color );
PSET( x0 + y, y0 + x, color );
PSET( x0 - y, y0 + x, color );
PSET( x0 + y, y0 - x, color );
PSET( x0 - y, y0 - x, color );
if ( F >= 0 ) {
F += 4 * y - 4 * x + 10 ;
--x;
++y;
}else{
F += 4 * y + 6;
++y;
}
}
0105デフォルトの名無しさんNGNG
103訂正
-2X+3 ×
-2r+3 ○
0106デフォルトの名無しさんNGNG
楕円は4分の1円で考える。
中心(0,0)の楕円の式をaX*X+bY*Y=R*R(Rは長いほうの半径)とする。
点(X,Y)の次に描く点は、
真上の点(X,Y+1)
左上の点(X-1,Y+1)
真左の点(X-1,Y)
のいずれかになる。
0107デフォルトの名無しさんNGNG
楕円の式を
XX / aa + YY / bb = 1
に変える。
そして誤差の比較を
E = bbXX + aaYY - aabb
の式でする。
真上の点(X,Y+1)を打ったら誤差はbbXX + aa(YY + 2Y + 1) - aabb これをE上とする。
左上の点(X-1,Y+1)を打ったら誤差はbb(XX - 2X + 1) + aa(YY +2Y +1) - aabb これをE左上とする。
左の点(X-1,Y)を打ったら誤差はbb(XX -2X +1) + aaYY - aabb これをE左とする。
ここで、
(1)|E上|−|E左上|<0 かつ|E上|−|E左|<0 ならば 真上に点を打つ。
(2)|E左上|−|E左|<0 かつ|E上|−|E左上|>=0 ならば 左上に点を打つ。
(3)|E上|−|E左|>=0 かつ|E左上|−|E左|>=0 ならば 左に点を打つ。

(1)はE上二乗 − E左上二乗 < 0 かつ E上二乗 − E左二乗 < 0と等価だから
因数分解して代入して整理すると、
bb(2X-1){2bb(XX-2x+1)+2aa(YY+2Y+1)-2aabb} < 0 かつ
bb{(2X-1)+2Y+1}{bb(2XX+2X+1)+aa(2YY+2Y+1)-2aabb} < 0
ここで、{2bb(XX-2x+1)+2aa(YY+2Y+1)-2aabb}の部分をFし、  
{bb(2XX+2X+1)+aa(2YY+2Y+1)-2aabb}の部分をGとする。
0108デフォルトの名無しさんNGNG
(2)の場合は、E左上二乗 − E左二乗 < 0 かつ E上二乗 − E左上二乗 => 0と等価だから
因数分解して代入して整理すると、
(2Y+1){2bb(XX-2X+1)+aa(2YY+2Y+1)-2aabb} < 0 かつ
bb(2X-1){ F } => 0
ここで、上の式の{2bb(XX-2X+1)+aa(2YY+2Y+1)-2aabb}の部分をHとする。

(3)の場合は、E上二乗 − E左二乗 => 0 かつ E左上二乗 − E左二乗 => 0
と等価だから、同様にして
{(2X-1)+2Y+1}{ G } => 0 かつ (2Y-1){ H } => 0

ここで、 X=>1 かつ Y=>0の場合、
F<0 かつ G<0 ならば、(1)
F=>0 かつ H<0 ならば (2)
G=>0 かつ H=>0 ならば (3)
ということが言える。
さらに、
F=G+2aaY+aa H=G-(2bbx-bb)であるので、F>G>Hと言える。
なので、
F<0 ならば (1)
F=>0 かつ H>0 ならば(2)
H=>0 ならば (3)
が成り立つとまとめることが出来る。
0109デフォルトの名無しさんNGNG
FはXが1減ったとき、F(X-1,Y) - F(X,Y) = bb(-4X+4)
FはYが1増えたとき、F(X,Y+1) - F(X,Y) = aa(4Y+6)
HはXが1減ったとき、H(X-1,Y) - H(X,Y) = bb(-4X+6)
HはYが1増えたとき、H(X,Y+1) - H(X,Y) = aa(4Y+4)

(1)F<0で、真上の点を打ったら、次のF,Hは、
F = F + aa(4Y+6)
H = H + aa(4Y+4)
(2)F=>0かつH<0で、左上の点を打ったら、次のF,Hは、
F = F + aa(4Y+6)-bb(4X-4)
H = H + aa(4Y+4)-bb(4X-6)
(3)H=>0で、左の点を打ったら、次のF,Hは、
F = F − bb(4X-4)
H = H − bb(4X-6)

初期値F0 = -2abb+bb+2aa
初期値H0 = -4abb+2bb+aa
0110デフォルトの名無しさんNGNG
/* 楕円(X-x0)(X-x0) / aa + (Y-y0)(Y-y0) / bb = 1を描く */
void ellipse( x0, y0, a, b, color )
int x0,y0,a,b,color;
{
int x,y,F,H;
x = a;
y = 0;
F = -2abb+bb+2aa;
H = -4abb+2bb+aa;
while ( x > 0 ) {
PSET( x0 + x, y0 + y, color );
PSET( x0 - x, y0 + y, color );
PSET( x0 + x, y0 - y, color );
PSET( x0 - x, y0 - y, color );
if ( F < 0 ) {
F += aa(4y+6);
H += aa(4y+4);
y++;
} else if ( H >= 0 ) {
F -= bb(4X-4);
H -= bb(4X-6);
x--;
} else {
F += aa(4y+6)-bb(4x-4);
H += aa(4Y+4)-bb(4X-6);
x--;
y++;
}
}
}
0111デフォルトの名無しさんNGNG
 
0112デフォルトの名無しさんNGNG
  
0113山崎 渉NGNG

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
0114デフォルトの名無しさんNGNG
日本酒ならぐい飲みでやりたいものだ。
0115山崎 渉NGNG
(^^)
0116山崎 渉NGNG
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
■ このスレッドは過去ログ倉庫に格納されています