C言語相談室(上級者専用)

■ このスレッドは過去ログ倉庫に格納されています
2018/03/02(金) 22:48:03.65ID:2Cs+DkMh0
C言語の話題のみ取り扱います。C++の話題はC++スレへ。
上級者専用です。10,000行程度のソースを扱えない人は以下スレへ。

C言語なら俺に聞け
https://mevius.5ch.net/test/read.cgi/tech/1519046038/

適宜以下を使用してください。
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2019/02/20(水) 01:51:41.58ID:J4bEIWoi0
古い70年代後半や80年代前半のマイコン雑誌だと TK-80BS とか、プリンタに接続して文字を出力する事が
困難な機種に関してはプログラムリストを画面表示して写真撮影した状態で雑誌に載っていたと思う。
2019/02/20(水) 10:26:41.54ID:XdZkvkiSM
>>321
それやるツールも雑誌の中の人が手製で作ってそうだよね。
いろいろなことが解析すればなんとかなる範囲に収まってて楽しい時代だった。
2019/02/20(水) 13:50:59.85ID:majkFZDga
子供の頃はASCII形式セーブの有り難みがわからんかったわ。
325デフォルトの名無しさん (アウウィフ FF4b-wP4P)
垢版 |
2019/02/20(水) 19:02:11.40ID:v7iPz90JF
TK-80ってCRTに出せるのもあったんか
2019/02/20(水) 19:15:37.01ID:HQlG8gVaa
compo-80だな
父がプログラム入力してくれた
2019/02/20(水) 19:18:38.64ID:V5JGZApS0
調べたら TK-80BS っていう別売りのテレビ出力ボードがあったみたいね。
I/O誌あたりには、色んなワンボードマイコンに、汎用で安価なVRAMボードを
接続して使うハードウェア記事が載ってた。

あとI/O誌は、カセットテープのセーブデータの
フォーマット解析記事がやたら多かった気がする。
もしかすると一部の投稿者が、新機種の出る度に
手持ちの機材と技術で解析してたのかもしれないけど。
328デフォルトの名無しさん (アウウィフ FF4b-wP4P)
垢版 |
2019/02/20(水) 19:25:02.15ID:v7iPz90JF
https://ja.wikipedia.org/wiki/CRTC_(LSI)
https://en.wikipedia.org/wiki/Motorola_6845
この辺の載せてたのかな
2019/02/20(水) 19:32:08.59ID:L9lLctPa0
TK-80BS(Basic Stationだっけ)はTK-80にアドオンする拡張キット
東芝の奴が初めからTV出力持ってたな
330デフォルトの名無しさん (ワッチョイ a77c-/Ktc)
垢版 |
2019/02/20(水) 19:49:14.33ID:sr7oPl810
基板パターンカットωωω
2019/02/21(木) 05:00:32.48ID:k7mDakXF0
TK-80BS は、単なるテレビ出力ボードじゃなくて、
キーボードやら拡張RAMやらついてたのだな。
まさにBASICを使えるようにするための拡張キットか。

…なんだかコア構想っぽいね。
332デフォルトの名無しさん (ワッチョイ 9e02-rusg)
垢版 |
2019/02/22(金) 03:30:54.88ID:C6SOPE3a0
TK-80の互換機があるのな。

aitendo、TK-80を再現したマイコンボード「ZK-80組立てキット」を発売
https://hardware.srad.jp/story/19/02/07/0621259/
2019/02/22(金) 08:29:19.16ID:JzNhpi55a
Z80アセンブリ使う楽しさって特にないわ
2019/02/22(金) 13:08:41.40ID:XfTm47euM
バイナリのまま読むのが楽
335デフォルトの名無しさん (ワッチョイ 9e02-LfKm)
垢版 |
2019/02/23(土) 12:04:53.89ID:9pS68leH0
マイコンボードはやっぱI/O引っ張り出して何かのON/OFFをさせたりしないとつまんないよな。
2019/02/23(土) 19:00:39.43ID:mDm7639Kd
あと1週間くらいで完成するかな?
337デフォルトの名無しさん (アウアウウー Sa21-sU2d)
垢版 |
2019/02/24(日) 19:44:27.45ID:iK4D+UQia
>>335
ON/OFFだけならアセンブリのが短く書けたりするよね。
計算とか入るとCのが楽だけど。
2019/02/24(日) 19:51:14.51ID:V5RD9eRK0
典型的なクソレス
2019/02/24(日) 20:26:31.54ID:RgZ/0jGo0
Cよりアセンブラが便利と言えばローテート演算だね。
「まず端っこのビットを保存してから、符号なしでシフト、
保存しておいたビットを見て反対の端にビットORで重ねる」て操作が
キャリーフラグ経由で自動的にできちゃう。

……Cから離れて長い気がするので、ちょいと絡めた話にしてみた。
340デフォルトの名無しさん (ワッチョイ 797c-kEY9)
垢版 |
2019/02/25(月) 10:44:07.01ID:Opp/wdL50
なんで C の bit 演算の仕様に入れなかったんだろうってのがいくつかあるね
2019/02/25(月) 13:03:03.90ID:IW4EZ6JF0
ローテートはCでやるにはちょっと面倒だね。
でもCの仕様に入れなかったのは、演算子を考えるのがもっと面倒だったからだな。
2019/02/25(月) 14:28:50.08ID:dMLcUOnq0
昔はキャリーフラグにあたるものが無い事に不満があった。
今はそんなに重要だったっけ?って思ってる。
2019/02/25(月) 15:32:32.74ID:IW4EZ6JF0
キャリーフラグは機械語レベルなら分岐に使えるけど、Cでの活用は難しいだろうね。
2019/02/25(月) 19:34:00.59ID:mZYXJrCm0
仮に、予約語で演算後のキャリーを保存する変数なんかがあったらどう使うの?
2019/02/25(月) 19:48:11.35ID:y5m/9TYHM
言語仕様としてキャリーフラグを扱える高級言語ってTL/1以外にあるのかな?
2019/02/26(火) 07:49:56.90ID:iw+Rwyyy0
>344
オーバーフロー、アンダーフロー、ビットシフト時の外れたビットの有無
アセンブラ経験者ならアセンブラと同じようにつかうんじゃね?
2019/02/26(火) 08:05:18.02ID:KfjVzsm10
>>346
でもコンパイラがフラグを変えないように命令を配置しないといけないってのは相当な制約で、それやるくらいならインラインアセンブラ使うほうが現実的だろ。
実際のフラグを使わず言語仕様として固定的な変数のように実装する方法もあるだろうが、それやってまでフラグ的なものを再現する利点も無い。
2019/02/26(火) 11:54:12.51ID:iw+Rwyyy0
アセンブラの癖の抜けない人のモヤモヤ感解消用でもいいじゃん。
349デフォルトの名無しさん (アウウィフ FF21-kEY9)
垢版 |
2019/02/26(火) 14:28:27.09ID:8+7ktUtNF
>>344
割り込みとかマルチスレッドとかで黒魔術化しそう
2019/02/26(火) 20:09:24.82ID:c/a6AL8hM
>>349
割り込みとかスレッド切替で変数保存されないシステムなんて見たことないが…
351さまよえる蟻人間 ◆T6xkBnTXz7B0 (ワッチョイ 7d01-xBXa)
垢版 |
2019/02/27(水) 08:41:06.65ID:vMkihIsO0
転送ソフト、完成したよ。
https://katahiromz.web.fc2.com/blaker/ja
2019/02/27(水) 13:16:21.28ID:6J9stBVH0
蟻人間てこのサイトの人だったのか
大昔に見覚えがある
2019/02/27(水) 16:25:43.56ID:vHAcjSp10
て言うか、以前(2ちゃんねる時代)は 片山博文MZ てハンドルで書いてたな。
2019/02/27(水) 17:27:23.25ID:vMkihIsO0
こんなものが役に立つのかね?
2019/02/27(水) 17:44:07.45ID:vMkihIsO0
ソース: https://github.com/katahiromz/BLAKER
2019/02/27(水) 19:45:22.65ID:vHAcjSp10
BLAKER というツール名の由来にちょいと興味がある。
2019/02/27(水) 20:13:51.21ID:Hk/WxP350
PaperBack っていうソフトあったな
http://ollydbg.de/Paperbak/
作者は OllyDbg 作った人
2019/03/02(土) 21:47:42.11ID:vmi2lFb5d
>>357
参考になった。ありがとう。
359さまよえる蟻人間 ◆T6xkBnTXz7B0 (ワッチョイ df01-Q6aG)
垢版 |
2019/03/08(金) 21:00:14.66ID:8R2ZaOuQ0
次の案件は、ReactOSのドラッグ&ドロップだ。
https://github.com/reactos/reactos/blob/master/dll/win32/ole32/ole2.c

このファイル「ole2.c」を編集し、メモ帳(Notepad)などのアプリへファイルアイコンを
ドラッグ&ドロップできる機能を実現せよ。具体的には、RegisterDragDrop周辺を改造して、
WS_EX_ACCEPTFILES拡張スタイルを有するウィンドウについて、
ドロップターゲットが登録済みかのように振る舞い、WM_DROPFILESに反応するようにせよ。

ヒント。
https://github.com/katahiromz/DragDropSamples

キーワード:プロセス、SetProp
成功報酬:2万円分のアマゾンギフト券。
2019/03/08(金) 22:04:41.94ID:ZkhAqKafd
よく分かる解説。

GetProp/SetProp関数は、ウィンドウに任意の値を結びつける。IDropTargetはドロップターゲットを表すインターフェース。
ドロップターゲットとはドロップできる対象を意味する。
RegisterDragDrop関数は、ドロップターゲットを登録する。RevokeDragDrop関数は登録を抹消する。
2019/03/08(金) 22:07:26.74ID:ZkhAqKafd
RegisterDragDrop関数はSetProp関数を使って、登録したドロップターゲットの情報を保持する。
RevokeDragDrop関数はRemoveProp関数を使ってドロップターゲットの情報を破棄する。
2019/03/08(金) 22:12:00.78ID:ZkhAqKafd
DoDragDrop関数はドラッグ&ドロップを開始し、SetCapture関数により、ドラッグ中のメッセージ受け取りを独占する。
ドラッグ中のマウスの位置から、WindowFromPoint関数により、マウスの下のウィンドウを取得する。
2019/03/08(金) 22:14:39.50ID:ZkhAqKafd
可能ならばマウスカーソル位置のドラッグターゲットを取得し、対話を試みる。もしドロップ可能なら、カーソルはドロップ可能を表すカーソル形状になる。
2019/03/08(金) 22:20:31.50ID:ZkhAqKafd
D&Dは、あるプロセスから別のプロセスへ、プロセスをまたいだ処理になるので、プロセス間通信が必要になる。
DuplicateHandleという関数が別のプロセスにハンドルを操作する権利を与える。
2019/03/08(金) 22:49:40.18ID:ZkhAqKafd
少し実験して見た所、ドロップターゲットを登録したウィンドウではドロップを検出できた。
ゆえに、WS_EX_ACCEPTFILESを有するウィンドウで正しくドロップターゲットを振る舞い、WM_DROPFILESを送信すれば、問題は解決する。

報酬を三万円に増額する。できるヤツは居ないか?
2019/03/09(土) 13:47:49.69ID:D/qACm7+0
三分の二くらいできた。
https://github.com/reactos/reactos/pull/1403

hGlobalが正しく送信できない。。。
2019/03/09(土) 19:32:13.70ID:XY+I2Bbhd
https://jira.reactos.org/browse/CORE-15836
こっちの問題を先に解決しないと。
368デフォルトの名無しさん (ワッチョイ 37ad-gi2a)
垢版 |
2019/03/09(土) 19:34:25.18ID:zQCMZtAK0
【世界教師】 私はマ@トレーヤ、投機家は人様の生活費を掛金にするな、ニートを増やした元凶はお前だ
https://rosie.5ch.net/test/read.cgi/liveplus/1552122718/l50
2019/03/14(木) 04:28:19.53ID:BFJ65L4Bd
【朗報】DnD解決の目処が立つ。
2019/04/13(土) 12:35:21.42ID:a4r2Gpw40
>>863 それでもこの言語を選ぶ理由を知るためだ。
 そなたの示す言語があるのに、なぜpythonなのか疑問を抱くのは自然なことだ。
 疑問を解決する回答を望んでたが、それは得られなかった。
371デフォルトの名無しさん (ワッチョイ 1187-IujH)
垢版 |
2019/04/13(土) 12:35:55.64ID:a4r2Gpw40
 インストール禁止な会社のパソコンはWeb経由で実行か。
 CodePadなら俺も知ってるが。そこまでしてpythonを使う価値があるかは疑問。

 実行速度が重要なところは、高速な言語に変更して使い分けるとかいな?。
 それは煩わしいな。高速な場面でも一通り対応できる言語のほうがいい。

 ハードウェアの性能が高ければ良いとかか?。高速なプログラム言語で、なおかつ高性能なハードウェアでないと。
 プログラムコードを改善して、プログラムの高速化か。高速なプログラム言語で、なおかつ高速で実行するプログラムコードでないと。
 C言語でも、実行の遅いプログラムコードは価値がないし。
2019/04/13(土) 12:39:21.36ID:a4r2Gpw40
うわ、間違えた誤爆だ。
2019/05/19(日) 22:57:26.41ID:o6jxwHTr0
テディベア、聞いてくれ。
https://jira.reactos.org/browse/CORE-15554
我々は、フォントレンダリングにおいて、テキストの変形と座標変換を
完璧にしないといけない。パスの必要なテストは、
C:\ReactOS\bin> gdi32_apitest TextTransform
だ。現在、いくつかテスト失敗がある。座標変換は何か間違えている。
何らかの修正が必要だ。
ターゲットは、$REACTOS/win32ss/gdi/ntgdi/freetype.c のIntExtTextOutW関数だ。
論理座標(LP)からデバイス座標(DP)へ変換して、それに
デバイス原点dc->ptlDCOrigを足したもので
IntEngMaskBlt関数を呼ばないといけない。
LOGFONT.lfWidth、LOGFONT.lfEscapement、WorldTransformなど
さまざまな変形があるため、本当に複雑なものになっている。
今月中に解決しないといけない。
2019/05/20(月) 18:50:51.09ID:m/UtbRiId
lfWidthの指定があれば、幅を調整する必要がある。
lfEscapementの指定があれば、参照点を中心にテキストを回転しないといけない。
さらにグラフィックスモードがGM_ADVANCEDなら変形行列WorldTransformを適用する必要がある。
2019/05/20(月) 19:36:32.71ID:nhYoGCfjM
初心者版に行け
2019/05/21(火) 14:50:07.77ID:MkUHRfEld
>>375
初心者や中級者にこんなの出来るわけないだろ。いい加減にしろ。
2019/05/21(火) 15:03:29.88ID:ZkFrsYXhM
アルゴリズムの話であってCの話ではなくない?
Cの話として上級なの?
2019/05/21(火) 18:15:35.02ID:UdJL+OJH0
アフィン変換の重ねがけ(ただし重ねる順は要注意)ってなわけにはいかんのかね
2019/05/21(火) 22:28:52.93ID:ff2E85uv0
>>373
ここは初心者に荒らされるのでもう諦めてる。
ゆとり/さとりはモラルがなさ過ぎて、どうしようもない。
とはいえ、おそらく彼等は「糞なネット」しか見たことがなく、「ましな状態」を想像出来なくての事だ。
当人達は全く荒らしている自覚がないのでどうにも救いようがない。
(治安の悪い地区に住む者が、その治安の悪さを問題視出来ないのと同じ。そういう物だと思ってる)

だから、初心者をBAN出来る掲示板があればそっちでやりたい。
(そこでゆとり/さとりにも「ましな状態」を見せないことには改善しない)
redditか8ch等で既にあればそこを利用するのが楽でいいから指定してくれ。
なければ自前で用意する事になるが、それならついでに色々準備したいからあと数年かかる。
なお再度言うが、「初心者は全員BAN」してくれるところな。「初心者用」のスレがあるだけでNGだ。
2019/05/21(火) 22:29:12.17ID:ff2E85uv0
が、ちょっと気になったことを言っておく。
131の時に見た限りでは、正直、あのコードで今君がやってるようなアジャイル開発は無理だ。
コード分岐が無駄に多すぎる。
(念のため言っておくが、今のコードを見たわけでない)

> 座標変換は何か間違えている。
これについて、単純には
・変換式を間違えている
・変換式は合っているが、コードが抜けている
の2通りのバグり方があるわけだが、どっちか認識出来てるか?

君はアフィン変換も怪しかったのでいまいち信用ならないが、
普通は変換式なんて仕様通り記述すればいいだけで、間違えないし、間違うものでもない。
また、変換式自体を間違っている場合は全部failするからすぐ分かる。

通ったり通らなかったりする場合は後者、つまり、あるべき場所でコードが抜けてるとか、コードの記述場所を間違えているとかだ。
これが発生するのは、コードに無駄に分岐があるからであり、言ってしまえばコードが汚いからだ。
アジャイルで今後とも少しずつ機能を追加していく気なら、いつかコードを整理しないと破綻すると思うぞ。
全仕様をそろそろ完備ならそのままやりきってしまうのも手だが。

綺麗にするのなら、まずは以下で。
・C流の分岐をケチるのは止めて、とにかく関数を小さく切り出してOAOOを厳密に守る
・すると中/上位関数は、AやってBやってCやって終わり、みたいなアホな関数だらけになる
・そうなると、上記「変換式」を書くにはここしかない、というのが唯一1ヶ所に確定する
結果、抜けたり、間違った場所に配置してしまう、ということがあり得なくなる。
逆に言えば、抜けたり、間違った場所に配置出来るのはコードが汚いから。

OAOOが徹底された場合、ほぼ常に「この機能を追加するならここに唯一1回だけ書く」状況となり、
正しく書けば機能追加終了、間違えば全failとなり、動作は非常に分かりやすくなる。
よく分からん動作になってデバッグに手こずるのは、コード構成に問題があるんだよ。
2019/05/21(火) 22:32:19.93ID:/ZDsxX6fa
またおまえか
2019/05/21(火) 22:44:33.89ID:ff2E85uv0
>>381
そういうのは少しでも役に立つ可能性のある情報を書いてから言え
お前らゆとりはそこが駄目なんだよ

といっても聞かないし、聞かない理由も分かってきたので対策をするわけだ
なおさとりはゆとりとはちょっと違い、ゆとりよりはましになってる
ただ、いずれにしても「まともなネット」を見せないことには先に進まない
お前らもそれを見えば俺らがなんでゆとりに対して怒っているか分かると思うぜ
2019/05/21(火) 23:15:28.05ID:ff2E85uv0
>>373
さらについでに言うと

> LOGFONT.lfWidth、LOGFONT.lfEscapement、WorldTransformなど
> さまざまな変形があるため、本当に複雑なものになっている。
これも根本的にやり方を間違ってる。
普通はスーパーセットを整備してから、サブセットを使うんだよ。
いちいち別に整備しない。

例えば、回転と平行移動が必要なら、アフィン変換を準備して、回転または平行移動として使う。
勿論、速度面でオーバーヘッドは出るが、
究極に速いコードと構成が美しいコードはあまり両立しない。
アジャイルの場合は後者、つまりコードを優先しないと開発が破綻する。

様々な変形があると分かっているのなら、最初から全部対応出来る構成で行くんだよ。
それはコーディングする前にちゃんと考えないと駄目なんだ。
アジャイルは「一つずつやる」事ではない。
未来の仕様なんて分からないから、
「現在確定している仕様を全て満たすにはこれが最適」をひたすら繰り返してるだけだ。
Windows互換だと最初から分かってるのなら、
win32APIを全部眺めた上で最初から「最適構造」でコーディングするのが一番効率がよく、
これはまさにウォーターフォール設計そのものだ。
仕様が確定している以上、ウォーターフォールを選択しないのは間違いだが、
最終的にも糞どうでもいいAPIなんて実装する気がない、というのならアジャイルもありだ。
ただ、アジャイルならアジャイルなりの構成にしないと無理で、君のコードはそれが出来てない。

もっと上位のコーディング戦略がおかしいんだよ。
だからそれをまず直せといっている。
なおウォーターフォールの場合は「仕様変更はしない」という大前提なので
コードなんて汚かろうがコピペだらけであろうが全く問題ない。そして君のコードはこれだ。
2019/05/21(火) 23:32:13.04ID:MkUHRfEld
グリフの変形はfreetypeで行うことになってる。
変形は参照点を中心に考え、変形した後で平行移動しないといけない。
だから単なるアフィン変形では対応できない。
2019/05/21(火) 23:38:40.78ID:MkUHRfEld
ややこしいアフィン変形の合成の計算になると予想される。変換式はまだ確定していない。
2019/05/21(火) 23:40:43.72ID:MkUHRfEld
現在のソースはこれ
https://github.com/reactos/reactos/blob/master/win32ss/gdi/ntgdi/freetype.c
2019/05/22(水) 00:32:45.01ID:TVjFGGsu0
>>385
すまんがソースを見る気はない。
ただ、方向性を完全に間違ってて、

× ややこしい変換式を実装しきる
○ 単発の単純変換の組み合わせで対応する

なんだよ。>>378が方向性は合ってる。
ただ、ちゃんと実装すれば重ねがけにすらならず、単に、

A変換を必要なら行う
B変換を必要なら行う
C変換を必要なら行う

になって終わるはず。
合成変換を実装するのは最速チューニングであって、開発性重視のアジャイル向きコーディングではない。
この根本戦略が間違ってる。
アジャイルで行くなら、基本的にコードはシンプルに、単純に動く実装を積み重ねて、
必要なら速度チューニングする位で行かないと破綻する。

単純に言えば、まずは遅くていいからコード量が一番少ない実装を選べ、ということ。
(Cの場合は手抜き実装でも大してコード量が変わらないから分かりにくいかもしれないが)
2019/05/22(水) 09:24:29.43ID:QBLOwo/G0
>>384
そのグリフ変形ってのは非線形写像で
元々直線のものが曲線に投影されるような写像なの?

アフィン変換は線形写像で
平行移動 拡大縮小 回転 せん断(平行四辺形) を表現できるんだけどさ
389デフォルトの名無しさん (ワッチョイ 987c-Q2B8)
垢版 |
2019/05/22(水) 11:05:05.28ID:1OSMRbFi0
テンソルですね判りますω
2019/05/22(水) 18:34:00.49ID:PIPD7DKBd
バイトで疲れた
少し休む
391デフォルトの名無しさん (ワッチョイ 6e7c-VA68)
垢版 |
2019/05/22(水) 19:07:43.18ID:x0vcQb3n0
病院行っとけ
2019/05/22(水) 19:24:14.99ID:PIPD7DKBd
グリフというのはフォントの各文字の形状のこと。

アフィン変形行列で、ある点P(px, py)を中心に角度θ回転させるってどうやって書くんだっけ?
2019/05/22(水) 19:31:44.58ID:Y0ViVk0D0
平行移動-px,-py → 回転(原点中心) → 平行移動px,py
これを合成するか記述するか
2019/05/22(水) 19:32:47.72ID:PIPD7DKBd
Win32のWorldTransformはアフィン行列を使っているから、アフィン変換で表せる。
座標変換は、ワールド座標からページ座標への変換、そしてページ座標からデバイス座標への変換の二つを合成して考えないといけない。
ややこしいのは座標変換とグリフ変形を両方考えないといけないこと。
2019/05/22(水) 20:06:05.20ID:U51Avb/v0
https://github.com/reactos/reactos/blob/master/win32ss/gdi/ntgdi/freetype.c#L5796
freetype.cの5796行目。
FT_Set_Transform(face, &mat, NULL);
FT_Set_TransformにFT_Matrix matをセットすることでグリフを変形できる。
FreeTypeのFT_Matrix構造体には平行移動の成分はない。

5798行目から5871行目まで。テキストの変位(幅と高さ)を計算する。
背景を塗りつぶしたり、下線を描きたい場合は、変位を計算しなければならない。
テキストはグリフの並びであるから、全体の幅を求めたい場合はグリフを一つ一つスキャンするしかない。

5910行目から5948行目まで。必要に応じてvecs構造体に座標を格納する。
5950行目から5987行目まで。座標変換を行う。この辺に間違いがあるかもしれない。
2019/05/22(水) 20:16:47.33ID:U51Avb/v0
「ワールド座標からページ座標への変換」、すなわち、
WorldTransformは、dc->pdcattr->mxWorldToPageで表せるが、
(dc->pdcattr->flXform & WORLD_XFORM_CHANGED)がセットされている場合は、
事前にDC_vUpdateWorldToDevice(dc);を呼んで更新しなければならない。
この変換は、グラフィックスモードがGM_ADVANCEDの場合のみ適用される。
GM_ADVANCEDの場合、グリフもこのような変形が適用される。

「ページ座標からワールド座標への変換」は、
DC_vGetPageToDevice(pdc, &mxPageToDevice);で
MATRIX mxPageToDeviceとして取得できる。
2019/05/22(水) 20:25:44.38ID:U51Avb/v0
グリフは次のような変形が適用される。
1) lfWidth変形。lfWidthが非ゼロのとき、幅を調整する。
2) lfEscapement変形。テキストの傾きをつかさどる。lfEscapementが非ゼロのとき、参照点を中心としたグリフの回転を行う。
3) lfOrientation変形。GM_ADVANCEDの場合、lfEscapement変形に加えて1文字ごとの回転を引き起こす。今回は考えない。
4) WorldTransform変形。GM_ADVANCEDの場合、適用される。
2019/05/22(水) 20:43:40.14ID:PIPD7DKBd
計算苦手だからMaximaでも使おうか
2019/05/22(水) 21:47:56.58ID:U51Avb/v0
Maximaで行列。
file:///C:/Users/katahiromz/Desktop/maximaintro.pdf
400デフォルトの名無しさん (アウアウエー Sa9f-LXSb)
垢版 |
2019/05/23(木) 02:14:48.74ID:srO5/BaDa
アリって高校行ってないのか
2019/05/23(木) 03:46:25.63ID:Kz6b19yN0
#include <windows.h>
#include <stdio.h>
int main(void)
{
XFORM x1 = { 0, 1, 1, 0, 5, 6 }, x2 = { 1, 2, 3, 4, 3, 4 }, x3;
HDC hDC = CreateCompatibleDC(NULL);
SetGraphicsMode(hDC, GM_ADVANCED);
SetWorldTransform(hDC, &x1);
ModifyWorldTransform(hDC, &x2, MWT_LEFTMULTIPLY);
GetWorldTransform(hDC, &x3);
// 0.000000, 1.000000, 1.000000, 0.000000, 9.000000, 9.000000
printf("%f, %f, %f, %f, %f, %f\n",
x3.eM11, x3.eM12, x3.eM21, x3.eM22, x3.eDx, x3.eDy);
return 0;
}
2019/05/23(木) 03:49:52.57ID:Kz6b19yN0
# Maxima (Shift+Enterで実行)
X1:matrix([0,1,0],[1,0,0],[5,6,1]);
X2:matrix([1,2,0],[3,4,0],[3,4,1]);
display(X2 . X1);

おっけー、結果が一致する。
2019/05/23(木) 04:07:47.90ID:RE0bqy1Md
Win32のWorldTransformは
XFORM構造体により
matrix([eM11, eM12, 0], [eM21, eM22, 0],[eDx, eDy, 1]);
と表せるアフィン変換であることがわかった。
次はある点を中心とした回転を調べてみよう。
2019/05/23(木) 04:52:55.60ID:Kz6b19yN0
M1:matrix([1, 0, 0], [0, 1, 0], [-px, -py, 1]);
R1:matrix([cos(t), sin(t), 0], [-sin(t), cos(t), 0], [0, 0, 1]);
M2:matrix([1, 0, 0], [0, 1, 0], [px, py, 1]);
display(M2 . R1 . M1);

これでいいのかな?
2019/05/23(木) 08:19:12.97ID:Kz6b19yN0
/* Maxima */
M1: matrix([1, 0, 0], [0, 1, 0], [-px, -py, 1]);
T1: matrix([width_ratio, 0, 0], [0, 1, 0], [0, 0, 1]);
R1: matrix([cos(t), sin(t), 0], [-sin(t), cos(t), 0], [0, 0, 1]);
M2: matrix([1, 0, 0], [0, 1, 0], [px, py, 1]);
M2 . R1 . T1 . M1;

これにWorldTransform行列を掛け合わせたものがグリフ変形行列になるんジャマイカ?
次は座標変換行列を考えてみよーー。
2019/05/23(木) 08:59:35.30ID:Kz6b19yN0
あ、一つ忘れたことがあった。

TextAlign (TA_*)でTA_BASELINE以外が設定されているときは、グリフの位置をずらす必要があった。5908行目から5931行目までを参照。これまたややこし。

ここでは、「16.16形式固定小数点数」というのが使われていて、整数値が16ビット左シフトされているので注意。
2019/05/23(木) 09:07:22.03ID:Kz6b19yN0
TA_BASELINE以外では、テキストの位置がずれ、参照点と回転中心がずれる。
2019/05/23(木) 10:47:45.80ID:Wqs4//Er0
最初から計算方法を確かめてから作ればよかったってことだな
2019/05/23(木) 15:32:13.39ID:RE0bqy1Md
。。。このテディベア、しゃべるぞ? 音声認識機能が搭載?
2019/05/23(木) 17:53:35.45ID:KaSwUSI90
テディベアかと思ったら毛皮で偽装したAIスピーカーだった、というお話。
独り言のつもりで喋った内容がネット経由で全世界に晒しプレイ。

そう言えばさまよえなくなったの?
411デフォルトの名無しさん (ワッチョイ ff7c-wLN0)
垢版 |
2019/05/23(木) 19:14:22.24ID:KLPLdAni0
おしゃべりみーちゃん
2019/05/23(木) 20:12:22.06ID:RE0bqy1Md
https://github.com/reactos/reactos/pull/1573
うまくいきそう。ありがとう、テディベア。
2019/05/23(木) 21:08:28.55ID:fA4TGJutM
行列の基礎も知らずに上級者とか
2019/05/23(木) 22:01:08.56ID:RE0bqy1Md
予定より早く終わった
河豚刺身を頂くか
2019/05/23(木) 22:34:27.34ID:n706agj50
>>392
マジレスすると、そんなところで引っかかってる時点で止めた方がいい。
アフィン変換=一次変換+平行移動であり、
ゆとり以前は高校数学の範囲で、国立大理系レベルなら全員知ってるか、すぐに理解出来る。


>>394
× 二つを合成して考えないといけない。
○ 二つを並べて書け。

どうしても嫌なら2つを順に呼び出す関数でラップして1つに見せかけろ。
根本的に考え方を間違ってる。


>>400
まじでこれ。
腕前以前に、仕様を理解出来ない奴がコーディングしてもろくな物にはならない。
そもそもどういう順番でどの変換をかけるべきなのか理解出来てない。
動かして試さないと分からないようなら、最終的にもバグは取りきれないと思う。
動いているように見えるとしたら、今あるテストパターンで引っかからないだけ。


蟻に必要なのは、プログラミング技術ではなくて、高校数学だ。
或いはここを読んでいるど初心者についても言えるが、
高校レベルならプログラミングではなく学校の勉強、特に数学と物理に集中した方がいい。
20代前半で起業する気なら高校生以前からプログラミングをしてないと無理だが、
起業する気なし、または起業するにしても30代以降なら、プログラミングは大学生からでも十分間に合う。
2019/05/23(木) 23:32:17.48ID:PljKu8LZ0
射精してそう
2019/05/24(金) 18:25:55.35ID:g/VWM3H0d
matWorld.xy = -matWorld.xy;
matWorld.yx = -matWorld.yx;
の辺りで何かおかしいと思ったら、座標系の扱いに既存のバグがあるようだ。調査に時間がかかる。
2019/06/03(月) 21:16:57.42ID:ot1fFUFW0
https://jira.reactos.org/browse/CORE-16020
やり直しになりました。アルゴを再考します。
2019/06/03(月) 21:45:21.69ID:ot1fFUFW0
そして始まるデスマーチ。。。
2019/07/04(木) 16:03:16.38ID:5KPM8ZzF0
https://github.com/reactos/reactos/pull/1708
IntExtTextOutZeroAngleW関数を直さないといけない。
バウンディングボックスがおかしい。
2019/07/04(木) 20:57:20.52ID:FzZdbDF3d
ダン。テストにgo!
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況