2ちゃんねる スマホ用 ■掲示板に戻る■ 全部 1- 最新50    

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

1 :デフォルトの名無しさん :2018/03/02(金) 22:48:03.65 ID:2Cs+DkMh0.net
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

384 :蟻人間 :2019/05/21(火) 23:32:13.04 ID:MkUHRfEld.net
グリフの変形はfreetypeで行うことになってる。
変形は参照点を中心に考え、変形した後で平行移動しないといけない。
だから単なるアフィン変形では対応できない。

385 :蟻人間 :2019/05/21(火) 23:38:40.78 ID:MkUHRfEld.net
ややこしいアフィン変形の合成の計算になると予想される。変換式はまだ確定していない。

386 :蟻人間 :2019/05/21(火) 23:40:43.72 ID:MkUHRfEld.net
現在のソースはこれ
https://github.com/reactos/reactos/blob/master/win32ss/gdi/ntgdi/freetype.c

387 :デフォルトの名無しさん :2019/05/22(水) 00:32:45.01 ID:TVjFGGsu0.net
>>385
すまんがソースを見る気はない。
ただ、方向性を完全に間違ってて、

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

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

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

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

単純に言えば、まずは遅くていいからコード量が一番少ない実装を選べ、ということ。
(Cの場合は手抜き実装でも大してコード量が変わらないから分かりにくいかもしれないが)

388 :デフォルトの名無しさん :2019/05/22(水) 09:24:29.43 ID:QBLOwo/G0.net
>>384
そのグリフ変形ってのは非線形写像で
元々直線のものが曲線に投影されるような写像なの?

アフィン変換は線形写像で
平行移動 拡大縮小 回転 せん断(平行四辺形) を表現できるんだけどさ

389 :デフォルトの名無しさん :2019/05/22(水) 11:05:05.28 ID:1OSMRbFi0.net
テンソルですね判りますω

390 :蟻人間 :2019/05/22(水) 18:34:00.49 ID:PIPD7DKBd.net
バイトで疲れた
少し休む

391 :デフォルトの名無しさん :2019/05/22(水) 19:07:43.18 ID:x0vcQb3n0.net
病院行っとけ

392 :蟻人間 :2019/05/22(水) 19:24:14.99 ID:PIPD7DKBd.net
グリフというのはフォントの各文字の形状のこと。

アフィン変形行列で、ある点P(px, py)を中心に角度θ回転させるってどうやって書くんだっけ?

393 :デフォルトの名無しさん :2019/05/22(水) 19:31:44.58 ID:Y0ViVk0D0.net
平行移動-px,-py → 回転(原点中心) → 平行移動px,py
これを合成するか記述するか

394 :蟻人間 :2019/05/22(水) 19:32:47.72 ID:PIPD7DKBd.net
Win32のWorldTransformはアフィン行列を使っているから、アフィン変換で表せる。
座標変換は、ワールド座標からページ座標への変換、そしてページ座標からデバイス座標への変換の二つを合成して考えないといけない。
ややこしいのは座標変換とグリフ変形を両方考えないといけないこと。

395 :蟻人間 :2019/05/22(水) 20:06:05.20 ID:U51Avb/v0.net
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行目まで。座標変換を行う。この辺に間違いがあるかもしれない。

396 :蟻人間 :2019/05/22(水) 20:16:47.33 ID:U51Avb/v0.net
「ワールド座標からページ座標への変換」、すなわち、
WorldTransformは、dc->pdcattr->mxWorldToPageで表せるが、
(dc->pdcattr->flXform & WORLD_XFORM_CHANGED)がセットされている場合は、
事前にDC_vUpdateWorldToDevice(dc);を呼んで更新しなければならない。
この変換は、グラフィックスモードがGM_ADVANCEDの場合のみ適用される。
GM_ADVANCEDの場合、グリフもこのような変形が適用される。

「ページ座標からワールド座標への変換」は、
DC_vGetPageToDevice(pdc, &mxPageToDevice);で
MATRIX mxPageToDeviceとして取得できる。

397 :蟻人間 :2019/05/22(水) 20:25:44.38 ID:U51Avb/v0.net
グリフは次のような変形が適用される。
1) lfWidth変形。lfWidthが非ゼロのとき、幅を調整する。
2) lfEscapement変形。テキストの傾きをつかさどる。lfEscapementが非ゼロのとき、参照点を中心としたグリフの回転を行う。
3) lfOrientation変形。GM_ADVANCEDの場合、lfEscapement変形に加えて1文字ごとの回転を引き起こす。今回は考えない。
4) WorldTransform変形。GM_ADVANCEDの場合、適用される。

398 :蟻人間 :2019/05/22(水) 20:43:40.14 ID:PIPD7DKBd.net
計算苦手だからMaximaでも使おうか

399 :蟻人間 :2019/05/22(水) 21:47:56.58 ID:U51Avb/v0.net
Maximaで行列。
file:///C:/Users/katahiromz/Desktop/maximaintro.pdf

400 :デフォルトの名無しさん :2019/05/23(木) 02:14:48.74 ID:srO5/BaDa.net
アリって高校行ってないのか

401 :蟻人間 :2019/05/23(木) 03:46:25.63 ID:Kz6b19yN0.net
#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;
}

402 :蟻人間 :2019/05/23(木) 03:49:52.57 ID:Kz6b19yN0.net
# 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);

おっけー、結果が一致する。

403 :蟻人間 :2019/05/23(木) 04:07:47.90 ID:RE0bqy1Md.net
Win32のWorldTransformは
XFORM構造体により
matrix([eM11, eM12, 0], [eM21, eM22, 0],[eDx, eDy, 1]);
と表せるアフィン変換であることがわかった。
次はある点を中心とした回転を調べてみよう。

404 :蟻人間 :2019/05/23(木) 04:52:55.60 ID:Kz6b19yN0.net
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);

これでいいのかな?

405 :蟻人間 :2019/05/23(木) 08:19:12.97 ID:Kz6b19yN0.net
/* 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行列を掛け合わせたものがグリフ変形行列になるんジャマイカ?
次は座標変換行列を考えてみよーー。

406 :蟻人間 :2019/05/23(木) 08:59:35.30 ID:Kz6b19yN0.net
あ、一つ忘れたことがあった。

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

ここでは、「16.16形式固定小数点数」というのが使われていて、整数値が16ビット左シフトされているので注意。

407 :蟻人間 :2019/05/23(木) 09:07:22.03 ID:Kz6b19yN0.net
TA_BASELINE以外では、テキストの位置がずれ、参照点と回転中心がずれる。

408 :デフォルトの名無しさん :2019/05/23(木) 10:47:45.80 ID:Wqs4//Er0.net
最初から計算方法を確かめてから作ればよかったってことだな

409 :蟻人間 :2019/05/23(木) 15:32:13.39 ID:RE0bqy1Md.net
。。。このテディベア、しゃべるぞ? 音声認識機能が搭載?

410 :デフォルトの名無しさん :2019/05/23(木) 17:53:35.45 ID:KaSwUSI90.net
テディベアかと思ったら毛皮で偽装したAIスピーカーだった、というお話。
独り言のつもりで喋った内容がネット経由で全世界に晒しプレイ。

そう言えばさまよえなくなったの?

411 :デフォルトの名無しさん :2019/05/23(木) 19:14:22.24 ID:KLPLdAni0.net
おしゃべりみーちゃん

412 :蟻人間 :2019/05/23(木) 20:12:22.06 ID:RE0bqy1Md.net
https://github.com/reactos/reactos/pull/1573
うまくいきそう。ありがとう、テディベア。

413 :デフォルトの名無しさん :2019/05/23(木) 21:08:28.55 ID:fA4TGJutM.net
行列の基礎も知らずに上級者とか

414 :蟻人間 :2019/05/23(木) 22:01:08.56 ID:RE0bqy1Md.net
予定より早く終わった
河豚刺身を頂くか

415 :デフォルトの名無しさん :2019/05/23(木) 22:34:27.34 ID:n706agj50.net
>>392
マジレスすると、そんなところで引っかかってる時点で止めた方がいい。
アフィン変換=一次変換+平行移動であり、
ゆとり以前は高校数学の範囲で、国立大理系レベルなら全員知ってるか、すぐに理解出来る。


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

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


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


蟻に必要なのは、プログラミング技術ではなくて、高校数学だ。
或いはここを読んでいるど初心者についても言えるが、
高校レベルならプログラミングではなく学校の勉強、特に数学と物理に集中した方がいい。
20代前半で起業する気なら高校生以前からプログラミングをしてないと無理だが、
起業する気なし、または起業するにしても30代以降なら、プログラミングは大学生からでも十分間に合う。

416 :デフォルトの名無しさん :2019/05/23(木) 23:32:17.48 ID:PljKu8LZ0.net
射精してそう

417 :蟻人間 :2019/05/24(金) 18:25:55.35 ID:g/VWM3H0d.net
matWorld.xy = -matWorld.xy;
matWorld.yx = -matWorld.yx;
の辺りで何かおかしいと思ったら、座標系の扱いに既存のバグがあるようだ。調査に時間がかかる。

418 :蟻人間 :2019/06/03(月) 21:16:57.42 ID:ot1fFUFW0.net
https://jira.reactos.org/browse/CORE-16020
やり直しになりました。アルゴを再考します。

419 :蟻人間 :2019/06/03(月) 21:45:21.69 ID:ot1fFUFW0.net
そして始まるデスマーチ。。。

420 :蟻人間 :2019/07/04(木) 16:03:16.38 ID:5KPM8ZzF0.net
https://github.com/reactos/reactos/pull/1708
IntExtTextOutZeroAngleW関数を直さないといけない。
バウンディングボックスがおかしい。

421 :蟻人間 :2019/07/04(木) 20:57:20.52 ID:FzZdbDF3d.net
ダン。テストにgo!

422 :デフォルトの名無しさん (アウアウウー Sacf-Im8i):2020/07/07(火) 19:15:29 ID:/zFzmDrza.net
gotoキャンペーン

423 :デフォルトの名無しさん :2020/08/23(日) 15:49:17.24 ID:Y43WfYiq0.net
お前らこれどう見る?(Cの話ではないが)
> 正しい共通化とは、「同じものを共通化すること」であり「同じようなものを共通化すること」ではない。
https://xtech.nikkei.com/it/atcl/column/17/031300081/041000005/?P=2

俺はこの筆者が間違いだと思うが。
俺は後者も積極的に共通化して、というよりは積極的に「共通ルーチンを使うように」コーディングし、
結果的に「殆ど同じ事をやっているルーチン」の濫造を防いで行数を減らす=コードの規模を抑えることの方が重要だと見ている。
つまり、この失敗ケースで最初に目指した物の方が近い。

「同じ物を共通化する」ではコードは減らない。「ほぼ同じだがちょっと違う」が大量発生してしまう。
だから最初から「同様のルーチンが必要」と分かっていればそれなりに緩く作って汎用性にするし、
当初それが分からない場合は当然「専用(=非汎用)ルーチン」となっているが、
仕様変更で同様の物を追加で書く際に、それと纏めて無理にでも共通化する。
結果的に俺はそれで上手く行っている。(つもり)
なお俺も以前はこの作者と同様、「まず自由(つまり局所最適化)に組んで、その後共通部分を共通化」だった。
ただそれだとコードの依存性はそれぞれ別のルーチンを使うので当然減るのだが、
結果的に「ほぼ同じだがちょっと違う」だけのルーチンがやたら出来て、その後の長期的保守性が著しく落ちる。
というか、長期的保守性って結局のところ、「もう一度読み直すのにかかる時間」でしかないから、
結局は「コードの読みやすさ」*「コードの量」であり、同じようなルーチンが山ほどあるのは悪だと気づいた。

違いはおそらく、開発フロー、つまりウォーターフォールとアジャイルの違い、また、
昔のテスト方式へのこだわり(=一文字でも変更した部分は全部テストやり直し)から来ていると思う。
共通ルーチンがなければ、追加機能で仕様変更した際、追加部分にしか変更が影響しないので当然デグレードの危険は低くなる。
ただしそれだと無駄にコードが膨らんでいくだけで、割と早い段階で破綻すると気づいた。
とはいえ上記の俺の「上手く行っている」ははっきり言ってテストはほぼやってないので、
テストについて問題があるのは事実だが。

424 :デフォルトの名無しさん :2020/08/23(日) 15:56:52.71 ID:Exm+Pt+ZF.net
コボちゃんの発想だよな

425 :デフォルトの名無しさん :2020/08/23(日) 16:23:53.69 ID:xPfkrPy6M.net
>>423
誤) 汎用性にする
正) 汎用にする

426 :デフォルトの名無しさん :2020/08/23(日) 16:56:04.30 ID:Y43WfYiq0.net
>>424
なるほど、コボラーか。
日本IBMだからVBかと思っていた。

となると当初の「共通化」思想はJava組か?
で、コボラー老害がJavaの若者(というほど若くもないだろうが)を揶揄した記事かな?
これならありがちな状況ではある。

しかし俺が思うに「保守性」の向上なら「共通化」の方が正解で、
「同じ『ような』ものは共通化しない」方針は デグレード回避>>>保守性 の時に取るべき選択であり、
「保守性」向上を目指す際に取るのは間違いだと思う。(保守性は明確に落ちるから)

427 :デフォルトの名無しさん :2020/08/23(日) 17:18:21.25 ID:Exm+Pt+ZF.net
最近観た記事
https://www.youtube.com/watch?v=Udfmm8J8SPI

428 :デフォルトの名無しさん :2020/08/23(日) 18:01:07.29 ID:Y43WfYiq0.net
>>427
コピペしてるなw

俺だったらコピペせずに、表示形式とデータ、つまりCでいうprintfレベルの関数を作って共通化、
本体からはまずはそれ(printf)を直接呼ぶ。
ただし本体から呼ぶ箇所が2箇所以上になってしまう場合は、
(=出来るだけ1箇所で済むように纏めるが、それでも2箇所以上になってしまう場合は)
一々フォーマット渡すとそのフォーマット部分をコピペすることになるのがウザイから、ラップ関数を作ってそれを呼ぶ。
この結果、動画でやってるのと上位レベルのコードは同じになるから、動画の方法でもそんなにクリティカルではない。
(後から掃除する時に難しい修正は必要ない。とはいえどうせやるなら最初から綺麗に書いとけ、だが)
まあ、入門用の動画なのだろうからいいのでは?

ただまあ、それ以前に、ゲームエンジンならスコア表示なんて当たり前にやるのだから、
もうちょっとましな方法もあるようにも思うが。Unityは全然知らんけど。
一々自前で書くのではなくて、普通にバインディグ出来ても不思議ではないが。
(そもそもC#ならproperty使えるから自前でバインディングするのも楽勝だが)

429 :デフォルトの名無しさん :2020/08/24(月) 10:08:27.21 ID:5+nAALyq0.net
現場猫:ヨシ!
監督猫:ヨシ!
検収猫:ヨシ!

430 :デフォルトの名無しさん :2020/08/24(月) 10:29:42.31 ID:seWRIuQk0.net
Ruby on Rails が、デザインパターンの宝庫

431 :デフォルトの名無しさん :2020/08/24(月) 12:57:21.18 ID:I647ZAoC0.net
「同じ」とは、つまりどういうことなのか?

432 :デフォルトの名無しさん :2020/09/29(火) 10:27:06.11 ID:FBp2gwm40.net
rect/margin

433 :デフォルトの名無しさん:2023/02/09(木) 15:25:49.43 ID:VIOlnytai
防災の曰もとい税金泥棒の曰に地球破壞割再開とか地球破壞して人を殺して私腹を肥やすマッチポンプ腐敗テロ国家丸出しだなおい
GοΤοなにか゛しだの地球破壞割た゛の世界最惡の税金泥棒テ口リス├航空観光関係者はナマポだと自覚しろや
ナマポなんた゛からナマポらしく資産に借金にク儿マ禁止にとあらゆる制限かけるのか゛筋だろ
温室効果カ゛スに騒音にコロナにとまき散らして地球破壊して災害連發させて悪い物価上昇[笑)させて知的産業に威カ業務妨害して.
医療崩壞させて死ぬ必要のない者まで殺害しなか゛ら,地球に涌いた薄汚い賄賂癒着の害蟲と゛もと私腹を肥やし続ける人殺し斎藤鉄夫
従業員の生活ガ−とか.何ひとつ価値生産しないこのバ力どもに働いてるフリさせることになんの意味か゛あんのか逃け゛ずに説明してみろや
化石賞連続受賞やら世界中から囗シア顔負けに非難されなか゛ら税金て゛地球破壞する国際秩序の根幹に関わるジェ丿サヰドテ□中止して、
こいつら何ひとつ価値生産できない害虫どもをナマポらしく底辺ナマポにすれは゛いいだけの話た゛ろ世界最悪の殺人組織公明党

創価学會員は、何百萬人も殺傷して損害を与えて私腹を肥やし続けて逮捕者まで出てる世界最惡の殺人腐敗組織公明党を
池田センセ─が□をきけて容認するとか本氣て゛思ってるとしたら侮辱にもほどか゛あるぞ!
hТΤPs://i、imgur.соm/hnli1ga.jpeg

156 KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50
名前: E-mail (省略可) :

read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★